【发布时间】:2021-01-04 13:16:51
【问题描述】:
首先,请理解使用翻译器可能会导致语法不正确。
我将在 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"));
}
问题是我试图抓取的部分(
我的意思是,我试图将
- 刮到一个数组中,但是当我刮它时,
- 。
我应该怎么做才能刮
- ?
- 内没有
【问题讨论】:
-
页面不可能通过脚本动态填充这些项目。我建议您在加载完成后刮掉页面。 $(window).on('load', function() { // 定义 const scraping=() => {... here });如果失败了,你可以添加一个粗略的计时器,在一段时间后开始抓取。
-
也许cheerio 不能处理这种情况。您可以尝试使此功能异步,等待一段时间并再次发出请求,或使用基于 selenium webdrive 的刮刀。
-
您想使用 puppeteer 或 jsdom 并等待 xhrs 完成。
标签: javascript reactjs web-scraping axios cheerio