微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何抓取 Google 搜索结果在某种程度上?

如何解决我如何抓取 Google 搜索结果在某种程度上?

据我所知,谷歌不喜欢被抓取/抓取。一个月前当我准备开始这个项目时在 stackoverflow 上发现了一个类似的问题(现在找不到了。)。有人说使用proxy是一种方法,于是我得到了proxymesh。而且我猜我需要以“随机速率”发送请求才能获得类似人类的行为。就像我每 0.1 秒发送一次垃圾邮件请求一样,我可能会被阻止。我还读到我需要使用浏览器或激活 javascript 的东西,以再次模仿人类行为。为了快速获取大量结果,我想同时运行多个机器人,但我还不知道该怎么做(最近开始学习)。

所以我的问题是:我该怎么做?

对我来说不太清楚的部分:

1. 用于抓取的浏览器?我需要吗?效率高吗?(之前我只用bs4和requests)

2. 计时器会有所作为吗?或者 google 是否足够成熟以注意到这一点?

3. 运行多个机器人。我每天从代理获得 100 或 220 个 IP 地址(我认为数据有限),我想如果我运行多个机器人并为每个机器人分配一个唯一的 IP 地址,我将能够快速获取结果?但我不知道如何运行多个机器人和东西...

我计划如何使用机器人(以便您更好地理解我的意思):

用例 1:

  1. 搜索特定网站。
  2. 打开该网站并获取我需要的数据。
  3. 重复。 (我有很多网站需要搜索,假设有一百万个)

用例 2:

  1. 搜索宽泛的关键字。
  2. 搜索结果中打开大约前 50-100 个网站并获取我需要的数据。
  3. 重复。

这两点我都想做。

解决方法

尝试将 Node.jspuppeteer 结合使用,并将此代码作为起点运行。它将为您提供给定谷歌搜索的链接。使用不同的 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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。