javascript - 试图用 puppeteer 从网页中抓取链接
问题描述
我不明白为什么我无法使用 puppeteer: PubChem从此页面检索 href 链接 。
我已经运行 Chrome 并检查了页面并找到了所需Headline
的化学品并复制了Selector
如下所示的内容:
#featured-results > div:nth-child(2) > div.box-shadow > div > div.p-md-rectangle.flex-container.flex-nowrap.width-100 > div.flex-grow-1.p-md-left > div.f-medium.p-sm-top.p-sm-bottom.f-1125 > a
然后我用 nodejs 运行了这个 JS 代码。
const puppeteer = require('puppeteer')
puppeteer.launch({ headless: true }).then(async browser => {
const page = await browser.newPage()
await page.goto('https://pubchem.ncbi.nlm.nih.gov/#query=MES')
// const cookies = await page.cookies()
// console.log(cookies)
const links = await page.evaluate(() => [document.querySelectorAll('#featured-results > div:nth-child(2) > div.box-shadow > div > div.p-md-rectangle.flex-container.flex-nowrap.width-100 > div.flex-grow-1.p-md-left > div.f-medium.p-sm-top.p-sm-bottom.f-1125 > a')].map(link => link.href))
links.forEach(link => console.log(link))
await browser.close()
})
但我的结果是NULL。请问这里有人能睁开眼睛吗?谢谢。
解决方案
- 您需要等待元素出现。
- 您需要 spread (
...
) 从querySelectorAll()
结果中创建一个数组。
const puppeteer = require('puppeteer')
puppeteer.launch({ headless: true }).then(async browser => {
const page = await browser.newPage()
await page.goto('https://pubchem.ncbi.nlm.nih.gov/#query=MES')
await page.waitForSelector('#featured-results > div:nth-child(2) > div.box-shadow > div > div.p-md-rectangle.flex-container.flex-nowrap.width-100 > div.flex-grow-1.p-md-left > div.f-medium.p-sm-top.p-sm-bottom.f-1125 > a')
const links = await page.evaluate(
() => [...document.querySelectorAll('#featured-results > div:nth-child(2) > div.box-shadow > div > div.p-md-rectangle.flex-container.flex-nowrap.width-100 > div.flex-grow-1.p-md-left > div.f-medium.p-sm-top.p-sm-bottom.f-1125 > a')]
.map(link => link.href)
)
links.forEach(link => console.log(link))
await browser.close()
})
推荐阅读
- python-3.x - 接收到的信号退出程序但不调用信号处理程序
- elasticsearch - 是否可以在 Elasticsearch 中获得多边形交集的转置?
- php - Laravel 5.6,动态创建属性
- java - 如何通过将 --patch-module javac 选项传递给我的项目编译器来使 Eclipse 在 JDK 9+ 上编译修补模块?(见图)
- azure - 通过令牌访问 Azure Web App 时访问被拒绝
- c# - 如何在 C# 代码后面调用 SQL 命令
- node.js - 发送多个子文档时,Mongoose 验证失败
- laravel - Laravel 5 从供应商处加载自定义包
- python - 在覆盖该引用之前删除对大型 Python 对象的引用有什么好处吗?
- php - 为什么列出 laravel 路线会引发护照错误