我正在运行一个程序,从谷歌搜索的任何歌曲的任何艺术家使用puppeteer图书馆刮网站的网址。我递归提取的网址从谷歌搜索上的所有网页。一切工作正常,但当我试图关闭浏览器使用浏览器。关闭()函数在我手动关闭浏览器后才起作用。当我手动关闭浏览器时,我的数据会记录在终端上,否则不会。我已经等了近15分钟,但浏览器仍然保持打开状态。以下是我的代码
const puppeteer = require("puppeteer");
(async () => {
const getData = async (url, start = 0) => {
try {
const page = await browser.newPage();
await page.setViewport({ width: 1366, height: 768 });
const query = `${url}&start=${start}`;
await page.goto(query, { waitUntil: "load", timeout: 0 });
await page.waitForSelector('div[class="yuRUbf"] >a', { timeout: 0 });
const links = await page.evaluate(() =>
Array.from(document.querySelectorAll('div[class="yuRUbf"] >a')).map(
(a) => a.href
)
);
await page.close();
if (links.length < 1) {
// return if no link exists
return links;
} else {
return links.concat(await getData(url, (start = start + 10)));
}
} catch (error) {
if (error) console.log(error);
}
}; //end get data function
const browser = await puppeteer.launch({ headless: false });
const url =
"https://www.google.com/search?q=Let+You+Love+Me+by+Rita+Ora&sxsrf=ALeKk02Hp5Segi8ShvyrREw3NLZ6p7_BKw:1622526254457&ei=Lsm1YPSzG9WX1fAPvdqTgAg&sa=N&ved=2ahUKEwj0gqSo3fXwAhXVSxUIHT3tBIAQ8tMDegQIARA7&biw=1517&bih=694";
const allLinks = await getData(url);
await browser.close();
console.log(allLinks);
})(); //end musicCrawler function
// getData Function
2条答案
按热度按时间nnt7mjpx1#
原因是这一行:
当你看到最后一个没有链接的页面时,这一行将无限期等待。尝试使用内部的try-catch块设置更大的超时:
ldioqlga2#
如果你不用
puppeteer
也能完成这项任务,我建议你不要使用任何浏览器自动化来抓取谷歌搜索页面,相反,你可以从一个简单的请求中得到你需要的东西,这需要更少的资源来完成这项任务。例如,您可以使用axios发出请求,并使用cheerio使用jQuery语法解析HTML。请在联机IDE中查看如何执行此操作:
输出:
或者,您可以使用SerpApi的Google Organic Results API,其主要优点是您不需要从头开始编写解析器并不断地维护它(毕竟,Google经常更改页面上元素的结构,您需要不断地寻找必要的选择器)。
下面是一个适合您的用途的使用示例(在线IDE中的代码):
输出: