javascript - 如何使用 Cheerio 抓取动态网站?
问题描述
首先,请理解使用翻译器可能会导致语法不正确。
我将在 React 环境中使用cheerio 进行网页抓取。
部分网站(例如):
<ul>
<li>
<div class="name">burger</div>
<div class="price">5,500</div>
</li>
<li>
<div class="name">sandwich</div>
<div class="price">3,500</div>
</li>
<li>
<div class="name">ramyeon</div>
<div class="price">1,500</div>
</li>
</ul>
我的代码(仅供参考,此代码在抓取其他网站时效果很好):
const cheerio = require("cheerio");
let prodData = [];
useEffect(() => {
scraping();
}, []);
const scraping = () => {
axios.get("/product/thisIsExample")
.then(res => {
if (res.status === 200) {
const html = res.data;
const $ = cheerio.load(html);
const children = [...$("ul").children("li")];
children.forEach(v => {
prodData.push({
prodName: $(v).find("div.name").text(),
prodPrice: $(v).find("div.price").text()
});
});
if(prodData.length !== 0) {
console.log(prodData);
}
}
}, (err) => console.log("error"));
}
问题是我试图抓取的部分(<li>)是动态的,所以只有在数据调用完成后才会生成。
我的意思是,我试图将 <ul> 中的 <li> 刮到一个数组中,但是当我刮它时,<ul> 中没有 <li>。
我应该怎么做才能刮掉 <li>?
解决方案
动态页面在加载后可以很好地创建可见的内容——从服务器读取 html 会得到一些基本的结构和脚本标签,但不是由该页面中的脚本生成并最终对用户可见的内容。
要抓取动态网页,您将需要 selenium 之类的东西并自动化真正的浏览器。
推荐阅读
- php - PhpStorm:类型提示链式方法
- ios - 我可以从枚举数据类型中创建领域对象的属性吗?
- python - 带变量的 Python 程序
- python - 如何使用 Spring 框架访问 python 脚本?
- python - AWS Fargate 任务 - awslogs 驱动程序 - 间歇性日志
- excel - 在excel中单击对象时更改然后不更改对象的颜色
- c++ - 使用 Winsock2 向具有域 HTTPS 的 Webstie 发送 GET 请求
- python - 如何修复'env:python:没有这样的文件或目录:在 Mac 上
- ruby - ruby 如何区分实例方法和类方法定义?
- python - 在非空值上合并 2 个数据帧