【发布时间】:2020-07-06 07:40:56
【问题描述】:
我正在尝试使用 puppeteer 抓取网站的一些初创公司数据,当我尝试导航到下一页时,cloudflare 等待屏幕进入并破坏了抓取工具。我尝试更改IP,但它仍然是一样的。有没有办法用 puppeteer 绕过它。
(async () => {
const browser = await puppeteer.launch({
headless: false,
defaultViewport: null,
});
const page = await browser.newPage();
page.setDefaultNavigationTimeout(0);
let links = [];
// initial page
await page.goto(`https://www.startupranking.com/top/india`, {
waitUntil: "networkidle0",
});
// looping through the url to different pages
for (let i = 2; i <= 7; i++) {
if (i === 3) {
console.log("waiting");
await page.waitFor(20000);
console.log("waited");
}
const onPageLinks = await page.$$eval("tr .name a", (arr) =>
arr.map((cur) => cur.href)
);
links = links.concat(onPageLinks);
console.log(onPageLinks, "inside loop");
await page.goto(`https://www.startupranking.com/top/india/${i}`, {
waitUntil: "networkidle0",
});
}
console.log(links, links.length, "outside loop");
})();
由于它只检查第一个循环,我放入了一个 waitFor 以绕过检查所需的时间,它在某些 IP 上运行良好,但在其他 IP 上它带来了挑战,我必须在服务器上运行它所以我正在考虑完全绕过它。
【问题讨论】:
-
您是否已经尝试过现有
[puppeteer] [recaptcha]和[puppeteer] [captcha]questions 的答案?尤其是这个:stackoverflow.com/a/55500565/12412595 -
如果 ip 可疑,他们会抛出验证码。可能任何数据中心 ip 都会得到一个。
-
我也在寻找这个问题的解决方案,如果我找到什么会告诉你的。我的 Puppeteer 使用最新的 Chromium 和 Extra-Stealth 模块,只是在 CloudFlare 挑战中旋转,每隔几秒钟重新加载一次,并且没有通过。即使在非无头模式下,我也会看到这一点。
-
@tpartee 我目前正在与 playwright(基于 puppeteer 的微软项目)合作,它似乎没有通过 cloudflare 保护。你找到解决办法了吗?
-
@trixn 我可以做的唯一解决方法是在相同的 IP 地址上使用非无头浏览器并从站点(包括 CloudFlare cookie)中获取 cookie 信息的快照,然后在我的 Puppeteer 和 Perl 脚本的 cookie jar。它不太理想,因为它不是全自动的,但它确实对我有用。这些 cookie 至少可以使用 3 个月,因此每 3 个月我必须手动重新获取/设置它们。
标签: bots puppeteer captcha cloudflare google-chrome-headless