使用cheerio.js进行刮擦,获取:错误:只能在暂停时执行操作

时间:2017-07-30 15:54:53

标签: javascript jquery node.js screen-scraping cheerio

尝试使用cheerio.js从此网站上抓取威士忌名称,image_url和说明:https://www.thewhiskyexchange.com/c/33/american-whiskey?filter=true#productlist-filter。我想将该信息转换为一个JSON对象数组,以存储在我的MongoDB中。无法显示网站的整个html,但这里是无序列表的相关基本结构的一部分:

<body>
  <div class="siteWrapper">
    <div class="wrapper">
      <div class="products-wrapper">
        <ul class="products-list">
          <li>
            <a>
              <div class="product-content">
                <div class="information">
                  <p class="name">
                    " Jack Daniel's Old No. 7"
                      <span>Small Bottle</span>
                  </p>
                </div>
              </div>
            </a>
          </li>
          <li></li>
          <li></li>   etc. </all closing tags>

首先尝试在<p class="name">中尝试获取威士忌名称,而不使用<span>标签中的任何文字,我在浏览器控制台中使用了这个jQuery代码,它正是我所需要的:

$('ul.products-list > li').each(function(index) {
    const nameOnly = $(this).find('a div div.information p.name').first().contents().filter(function() {
        return this.nodeType == 3;
    }).text();
    const whiskeyObject = {name: nameOnly};
    const whiskeys = JSON.stringify(whiskeyObject);
    console.log(whiskeys);
})

使用cheerio在我的应用文件(whiskey-scraper.js)中尝试相同的代码:

const express = require('express');
const request = require('request');
const cheerio = require('cheerio');
const fs = require('fs');
const app = express();
const port = 8000;

request('https://www.thewhiskyexchange.com/c/33/american-whiskey?filter=true#productlist-filter', function(error, response, body) {
  if(error) {
    console.log("Error: " + error);
  }
  console.log("Status code: " + response.statusCode);

  const $ = cheerio.load(body);
  // console.log(body);
  $('ul.products-list > li').each(function(index) {
  const nameOnly = $(this).find('a div div.information p.name').first().contents().filter(function() {
        return this.nodeType == 3;
      }).text().trim();
    const whiskeyObject = {name: nameOnly};
    const whiskeys = JSON.stringify(whiskeyObject);
    console.log(whiskeys);
  })
});

app.listen(port);
console.log(`Stuff is working on Port ${port}!`);

当我在终端中运行node inspect whiskey-scraper.js时,控制台会记录状态代码200,但也会记录此错误:

"Error: Can only perform operation while paused. - undefined
  at _pending.(anonymous function) (node-
inspect/lib/internal/inspect_client.js:243:27)
  at Client._handleChunk (node-inspect/lib/internal/inspect_client.js:213:11)
  at emitOne (events.js:96:13)
  at Socket.emit (events.js:191:7)
  at readableAddChunk (_stream_readable.js:178:18)
  at Socket.Readable.push (_stream_readable.js:136:10)
  at TCP.onread (net.js:561:20)"

无法弄清楚这意味着什么或如何解决此错误。有关如何消除此错误并至少让我的console.log(whiskeys);行正常工作的任何想法?如果我能做到这一点,我可以从那里拿走它。

当我取消注释console.log(body);时,我会将整个网站的html记录到控制台,所以我觉得cheerio从网站上获取了我需要的信息。一旦我消除了这个错误,我就可以搞清楚image_url,描述,并将它放入我的MongoDB。

谢谢!

1 个答案:

答案 0 :(得分:0)

找出解决方案。对于网站,您可以以网格格式或列表格式显示威士忌及其信息 - 它们是完全相同的URL。我正在查看列表格式的HTML,它使用<ul><li>格式,但是cheerio选择导入网格格式,其中没有无序列表,只有多个嵌套<div>。从来没有想过这个!