无法使用 Cheerio 抓取 Google 地图

问题描述 投票:0回答:1

我想首先这是我第一次使用 Cheerio 库,所以我可能会犯一个简单的错误。我正在尝试抓取 Google 地图页面以查找列出的电话号码。当我通过网站上的开发控制台使用 JQuery 时,我能够返回文本,但是当我在 Google Apps 脚本中使用相同的 div 类时,我的结果始终为空。

我使用的代码非常简单。此代码返回以下错误:“很抱歉,发生服务器错误。请稍等一下,然后重试。”。但是,如果我在开发控制台中执行此操作,则使用 jquery 不会收到错误。

我尝试抓取的网站是这里

function getContent_(url) {
    return UrlFetchApp.fetch(url).getContentText()
}
function testScrape(){
  const content = getContent_('https://www.google.com/maps/place/AutoZone+Auto+Parts/@33.6938582,-78.88908,15z/data=!4m6!3m5!1s0x890069a9c33250a3:0x8ce735a50e16e70b!8m2!3d33.6938582!4d-78.88908!16s%2Fg%2F1tdl2f1b?entry=ttu');
const $ = Cheerio.load(content);

Logger.log($('div.rogA2c'));
}
google-maps google-apps-script cheerio
1个回答
0
投票

考虑使用 Puppeteer 或 Selenium 等无头浏览器。这些工具可以执行 JavaScript 并与动态内容交互,从而允许您抓取静态 HTML 中无法立即获得的数据。如果您仍然想尝试使用

UrlFetchApp
,您可能需要设置适当的标头和用户代理字符串来模拟真实的浏览器。

我还建议检查 div 类是否正确。因为有时公司做防刮刀时会连续或一次更改类名。

function getContent_(url) {
    const options = {
        'method': 'get',
        'headers': {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
        }
    };
    return UrlFetchApp.fetch(url, options).getContentText();
}

function testScrape(){
    const content = getContent_('https://www.google.com/maps/place/AutoZone+Auto+Parts/@33.6938582,-78.88908,15z/data=!4m6!3m5!1s0x890069a9c33250a3:0x8ce735a50e16e70b!8m2!3d33.6938582!4d-78.88908!16s%2Fg%2F1tdl2f1b?entry=ttu');
    const $ = Cheerio.load(content);

    Logger.log($('div.rogA2c').text());
}

另一种解决方法:

您可以使用 GitHub 上随处可见的视觉工具,也可以找到教程。过时几乎是不可能的。它的使用寿命很长:)

我尝试过的推荐解决方案 const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://www.google.com/maps/place/AutoZone+Auto+Parts/@33.6938582,-78.88908,15z/data=!4m6!3m5!1s0x890069a9c33250a3:0x8ce735a50e16e70b!8m2!3d33.6938582!4d-78.88908!16s%2Fg%2F1tdl2f1b?entry=ttu');

    await page.waitForSelector('div.rogA2c');

    const text = await page.evaluate(() => {
        return document.querySelector('div.rogA2c')?.textContent || 'Not Found';
    });

    console.log(text);

    await browser.close();
})();

结果

915 US-501, Myrtle Beach, SC 29577, United States
© www.soinside.com 2019 - 2024. All rights reserved.