我想首先这是我第一次使用 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'));
}
考虑使用 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