代码之家  ›  专栏  ›  技术社区  ›  E Alexis MT

我怎么能从使用PoPPETER的谷歌地图地方得到所有的评论/评论?(我没有全部得到,因为页面是可滚动的)

  •  0
  • E Alexis MT  · 技术社区  · 5 年前

    我正试图从我用木偶师搜索的地方收集评论。我有两个问题:

    1. 我只从当前页面得到16条评论/评论,而实际上我想要所有的评论/评论(在本例中是62条评论,甚至更多,这取决于我的搜索),但我认为问题来自页面的可滚动性。
    2. 当我抓取谷歌地图上没有评论的评论时,我得到了一个错误:

      "(node:13184) UnhandledPromiseRejectionWarning: Error: Evaluation failed: TypeError: Cannot read property 'innerText' of null
      at __puppeteer_evaluation_script__:9:38"
      

      ,并且我不确定如何在每次出现带有空注释的评论时消除这种情况(我有一些代码几乎在最后试图解决空注释,但不起作用,我尝试了其他一些也不起作用的方法)。

    以下是我的代码:

    const puppeteer = require('puppeteer'); // Require the Package we need...
    
    let scrape = async () => { // Prepare scrape...
    
        const browser = await puppeteer.launch({args: ['--no-sandbox', '--disabled-setuid-sandbox']}); // Prevent non-needed issues for *NIX
        const page = await browser.newPage(); // Create request for the new page to obtain...
    
        const busqueda = 'Alitas+del+Cadillac+Tumbaco';
        const Url = `https://www.google.com/maps/search/${busqueda}`;
    
        const buscar = '.section-result';
        const click1 = '.widget-pane-link';
        const cajaTexto = '#searchboxinput';
    
        const comentarioLength = 'section-review-text';
        const comentarios = 'div.section-review:nth-child(Index) > div:nth-child(1) > div:nth-child(3) > div:nth-child(2) > div:nth-child(1) > span:nth-child(4)';
    
        console.log(comentarioLength);
    
        //const comentario = 'div.section-review:nth-child(INDEX) > div:nth-child(1) > div:nth-child(3) > div:nth-child(2) > div:nth-child(1) > span:nth-child(4)';
    
        // Replace with your Google Maps URL... Or Test the Microsoft one...
        //await page.goto('https://www.google.com/maps/place/Microsoft/@36.1275216,-115.1728651,17z/data=!3m1!5s0x80c8c416a26be787:0x4392ab27a0ae83e0!4m7!3m6!1s0x80c8c4141f4642c5:0x764c3f951cfc6355!8m2!3d36.1275216!4d-115.1706764!9m1!1b1');
    
        await page.goto(Url); // Define the Maps URL to Scrape...
        await page.waitFor(2*1000); // In case Server has JS needed to be loaded...
    
        await page.click(buscar); //busco caja de texto*/
    
        await page.waitForNavigation();
        await page.waitFor(2*1000);
    
        await page.click(click1);
    
        await page.waitForNavigation();
        await page.waitFor(2*1000);
    
        console.log(page.url());
    
        console.log("3");
    
        await page.evaluate(_ => { // This is just a test, don't really need this!
    
        });
    
        await page.waitFor(2*1000);
    
        console.log('how many?', (await page.$$('.section-review-text')).length);
    
        //div.section-result:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h3:nth-child(1) > span:nth-child(1)
    
        let listLength = await page.evaluate((sel) => {
            window.scrollBy(0, window.innerHeight);
            return document.getElementsByClassName(sel).length;
        }, comentarioLength);
    
        console.log(listLength);
    
        for (let i = 1; i <= listLength; i++) {
    
            let selectorComentarios = comentarios.replace("Index", i);
    
            const result = await page.evaluate((sel) => { // Let's create variables and store values...
    
                return document.querySelector(sel).innerText;
    
            }, selectorComentarios);
    
            if(!result){
                continue;
            }
    
            console.log(i+result);
    
        }
    
        /*await page.evaluate(_ => {
            window.scrollBy(0, window.innerHeight)
        })*/
    
        browser.close(); // Close the Browser...
        return result; // Return the results with the Review...
    };
    
    scrape().then((value) => { // Scrape and output the results...
    
    
    console.log(value); // Yay, output the Results...
    });
    
    1 回复  |  直到 5 年前
        1
  •  0
  •   xomena    5 年前

    这违反了谷歌地图平台的服务条款。

    查看第3.2.4段(对滥用服务的限制)。它读

    (a) 不刮 . 客户不会提取、导出、擦写或缓存谷歌地图内容以供在服务之外使用。例如,客户不会:(i)在服务之外预取、索引、存储、重新共享或重新托管谷歌地图内容;(ii)批量下载地理代码;(iii) 复制企业名称、地址或用户评论; 或者(iv)将谷歌地图内容与文本到语音服务结合使用。某些服务允许缓存,如“地图”服务特定术语中所述。

    来源: https://cloud.google.com/maps-platform/terms/#3-license

    抱歉,我带来了坏消息。