【问题标题】:cheerio not getting response back after web scraping网络抓取后,cheerio 没有得到回复
【发布时间】:2021-02-23 11:01:48
【问题描述】:

我想抓取一个网站的数据,所以我尝试使用cheerio npm 包
选择器在 chrome 开发工具中运行良好

  let commodity_array = $(
    "#tdm_base_scroll > div > div.dt_ta_09 > div.dt_ta_10"
  )
    .text()
    .split("\n");

  console.log(commodity_array);

但在我的代码中使用时,它返回空响应
我的代码:

const request = require("request-promise"),
  cheerio = require("cheerio"),
  fs = require("fs"),
  json2csv = require("json2csv").Parser;

const url = "https://www.commodityonline.com/mandiprices/";

(async () => {
  let mandiData = [];
  const response = await request({
    uri: url,
    headers: {
      accept:
        "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
      "accept-encoding": "gzip, deflate, br",
      "accept-language": "en-IN,en-GB;q=0.9,en-US;q=0.8,en;q=0.7,la;q=0.6",
    },
    gzip: true,
  });

  let $ = cheerio.load(response);
  
  let commodity_array = $(
    "#tdm_base_scroll > div > div.dt_ta_09 > div.dt_ta_10"
  )
    .text()
    .split("\n");

  console.log(commodity_array);
})();

我从中抓取数据的网站网址是:https://www.commodityonline.com/mandiprices/

我从hitesh chaudhary youtube频道,this video了解了这种抓取方法
请求标头有问题吗,
我是网络抓取的新手,所以我不明白我做错了什么步骤

【问题讨论】:

    标签: javascript node.js web-scraping cheerio


    【解决方案1】:

    在 http 标头中,您指定了 "accept-encoding": "gzip, deflate, br",这意味着您希望将请求结果压缩为 gzip。 Cheerio 期待文本,因此无法解析响应数据。 只需删除该标题即可使其工作:

    const request = require("request-promise"),
        cheerio = require("cheerio");
    
    const url = "https://www.commodityonline.com/mandiprices/";
    
    (async () => {
        const response = await request({
            uri: url,
            headers: {
                accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
                "accept-language": "en-IN,en-GB;q=0.9,en-US;q=0.8,en;q=0.7,la;q=0.6",
            }
        });
        let $ = cheerio.load(response);
    
        let commodity_array = $(
            "#tdm_base_scroll > div > div.dt_ta_09 > div.dt_ta_10"
        )
            .text()
            .split("\n");
        console.log(commodity_array);
    })();
    

    请注意,request 已弃用。一个不错的选择是axios

    const axios = require("axios"),
        cheerio = require("cheerio");
    
    const url = "https://www.commodityonline.com/mandiprices/";
    
    (async () => {
        const response = await axios.get(url);
        let $ = cheerio.load(response.data);
        data = []
        $("#tdm_base_scroll > div > div.dt_ta_09").each(function (i, elm) {
            var price = $("div.dt_ta_14", elm)
            data.push({
                commodity: $("div.dt_ta_10", elm).text().trim(),
                marketCenter: $("div.dt_ta_11", elm).text().trim(),
                variety: $("div.dt_ta_12", elm).text().trim(),
                arrrivals: $("div.dt_ta_13", elm).text().trim(),
                modalPrice: $(price[0]).text().trim(),
                minMaxPrice: $(price[1]).text().trim()
            })
        });
        console.log(data);
    })();
    

    【讨论】:

    • 好的,我还想使用 axios 运行更多查询,` let all_objects = $("#tdm_base_scroll > div > div.dt_ta_09"); for (let object of all_objects) console.log(object.textContent.split("\n")); ` 它在开发工具中运行良好,但在我的 index.js 代码中给出了未定义的结果
    • 我在 index.js 中写的内容 ---- ` const axios = require("axios"),cheerio = require("cheerio"), fs = require("fs"), json2csv = 要求(“json2csv”)。解析器;常量 url = "commodityonline.com/mandiprices/1"; (async () => { let mandiData = []; const response = await axios.get(url); let $ =cheerio.load(response.data); let all_objects = $("#tdm_base_scroll > div > div.dt_ta_09 "); for (let object of all_objects) { console.log(object.textContent); } // const j2cp = new json2csv(); // const csv = j2cp.parse(mandiData); })(); `
    • 基本上我想做的是我想获取网站上存在的数据行并使用它,所以我目前正在将它写在 csv 文件中......我想我会做一个在for循环中拆分数据的对象并将其放入mandiData变量中,然后写入csv如果您能提出更好的方法,那就太好了
    • @sachuverma 我添加了一个使用cheerio 提取数据的示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多