首页 > 解决方案 > 如何使用 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>?

标签: javascriptreactjsweb-scrapingaxioscheerio

解决方案


动态页面在加载后可以很好地创建可见的内容——从服务器读取 html 会得到一些基本的结构和脚本标签,但不是由该页面中的脚本生成并最终对用户可见的内容。

要抓取动态网页,您将需要 selenium 之类的东西并自动化真正的浏览器。


推荐阅读