问题描述
据我所知,谷歌不喜欢被抓取/抓取。一个月前当我准备开始这个项目时在 stackoverflow 上发现了一个类似的问题(现在找不到了。)。有人说使用proxy是一种方法,于是我得到了proxymesh。而且我猜我需要以“随机速率”发送请求才能获得类似人类的行为。就像我每 0.1 秒发送一次垃圾邮件请求一样,我可能会被阻止。我还读到我需要使用浏览器或激活 javascript 的东西,以再次模仿人类行为。为了快速获取大量结果,我想同时运行多个机器人,但我还不知道该怎么做(最近开始学习)。
所以我的问题是:我该怎么做?
对我来说不太清楚的部分:
1. 用于抓取的浏览器?我需要吗?效率高吗?(之前我只用bs4和requests)
2. 计时器会有所作为吗?或者 google 是否足够成熟以注意到这一点?
3. 运行多个机器人。我每天从代理获得 100 或 220 个 IP 地址(我认为数据有限),我想如果我运行多个机器人并为每个机器人分配一个唯一的 IP 地址,我将能够快速获取结果?但我不知道如何运行多个机器人和东西...
我计划如何使用机器人(以便您更好地理解我的意思):
用例 1:
用例 2:
这两点我都想做。
解决方法
尝试将 Node.js 与 puppeteer 结合使用,并将此代码作为起点运行。它将为您提供给定谷歌搜索的链接。使用不同的 IP 地址很好,但也可以尝试关闭您的位置服务,不断清除缓存,并清除 google 可能用来唯一识别您的任何其他内容。跨多个 IP 地址拆分可以节省您的时间,但是您要为处理能力付费,因此总是有成本的。祝你好运。
const puppeteer = require('puppeteer');
function googleBot(search,pageIndex) {
puppeteer.launch({
headless: false,defaultViewport: null,args: ['--start-fullscreen'],timeout: 1000 * 30
}).then(async browser => {
try{
const pages = await browser.pages();
const page = pages[0];
//close on page errors
page.on("error",async function(error){
console.log("FORCED CLOSE DUE TO ERROR: " + error);
await browser.close();
});
//dismiss any alerts
page.on('dialog',async dialog => {
await dialog.dismiss();
});
var links = await runOnURLAndReturn("https://www.google.com/search?q=" + search + "&start=" + pageIndex * 10,".LC20lb",async () => {
try{
return await new Promise(resolve => {
setTimeout(function(){
var links = [];
var searchResults = document.querySelectorAll(".LC20lb");
for(var i = 0; i < searchResults.length; i++){
if(searchResults[i].parentNode.tagName == "A"){
links[links.length] = searchResults[i].parentNode.href;
}
}
resolve(links);
},3000 + (Math.random() * 3000));
},function(){
throw "link scraping promise error";
});
}
catch(error){
return false;
}
});
console.log(links.join("\n"));
await browser.close();
async function runOnURLAndReturn(url,loadedSelector,fn) {
try{
await page.goto(url,{timeout: 1000 * 30});
await page.waitFor(loadedSelector,{timeout: 1000 * 30});
return await page.evaluate(fn);
}
catch(error){
return true;
}
}
}
catch(error){
console.log("FORCED CLOSE DUE TO ERROR: " + error);
await browser.close();
}
},async reason => {});
}
googleBot("something",0);