Scrapy就像Nodejs的工具一样?

时间:2014-10-30 11:44:54

标签: javascript node.js web-scraping scrapy cheerio

我想知道是否有针对nodejs的Scrapy?如果不是你怎么看待使用简单的页面下载并使用cheerio解析它?是否有更好的方法。

5 个答案:

答案 0 :(得分:2)

我没有看到如此强大的解决方案来抓取/索引像Python中的Scrapy这样的整个网站,所以我个人使用Python Scrapy来抓取网站。

但是为了从页面中抓取数据,nodejs中有 casperjs 。这是一个非常酷的解决方案。它也适用于ajax网站,例如: angular-js页面。 Python Scrapy无法解析ajax页面。 因此,为了抓取一页或几页的数据,我更喜欢使用CasperJs。

Cheerio 真的比casperjs快,但它不适用于ajax页面,它没有像casperjs这样的代码的良好结构。所以我更喜欢casperjs,即使你可以使用cheerio包。

咖啡脚本示例:

casper.start 'https://reports.something.com/login', ->
  this.fill 'form',
    username: params.username
    password: params.password
  , true

casper.thenOpen queryUrl, {method:'POST', data:queryData}, ->
  this.click 'input'

casper.then ->
  get = (number) =>
    value = this.fetchText("tr[bgcolor= '#AFC5E4'] >  td:nth-of-type(#{number})").trim()

答案 1 :(得分:0)

万一你还需要答案, https://www.npmjs.org/package/scrapy 我从未测试过它,但认为它可以提供帮助。 快乐的报废。

答案 2 :(得分:0)

Google Puppeteer可以实现某些爬网功能。根据文档:

您可以使用Puppeteer完成在浏览器中可以手动执行的大多数操作!以下是一些入门的示例:

  • 生成页面的屏幕截图和PDF。
  • 抓取 SPA(单页应用程序)并生成预渲染的内容(即“ SSR”(服务器端渲染))。
  • 自动执行表单提交,UI测试,键盘输入等
  • 创建最新的自动化测试环境。使用最新的JavaScript和浏览器功能,直接在最新版的Chrome中运行测试。
  • 捕获网站的时间线跟踪以帮助诊断性能问题。
  • 测试Chrome扩展程序。

答案 3 :(得分:0)

Scrapy是一个向python添加异步IO的库。对于节点,我们之所以没有这样的原因是因为所有IO已经都是异步的(除非您不需要它)。

这是一个在节点中看起来很抓狂的脚本,并且注意到URL是同时处理的。

const cheerio = require('cheerio');
const axios = require('axios');

const startUrls = ['http://www.google.com/', 'http://www.amazon.com/', 'http://www.wikipedia.com/']

// this might me called a "middleware" in scrapy.
const get = async url => {
  const response = await axios.get(url)
  return cheerio.load(response.data)
}

// this too.
const output = item => {
  console.log(item)
}

// here is parse which is the initial scrapy callback
const parse = async url => {
  const $ = await get(url)
  output({url, title: $('title').text()})
}

// and here is the main execution. We wrap it in an async function to allow await.
;(async function(){
  await Promise.all(
    startUrls.map(url => parse(url))
  )
})()

答案 4 :(得分:0)

完全一样吗?不。但是功能强大又简单?是:crawler 快速示例:

var Crawler = require("crawler");

var c = new Crawler({
    maxConnections : 10,
    // This will be called for each crawled page
    callback : function (error, res, done) {
        if(error){
            console.log(error);
        }else{
            var $ = res.$;
            // $ is Cheerio by default
            //a lean implementation of core jQuery designed specifically for the server
            console.log($("title").text());
        }
        done();
    }
});

// Queue just one URL, with default callback
c.queue('http://www.amazon.com');

// Queue a list of URLs
c.queue(['http://www.google.com/','http://www.yahoo.com']);

// Queue URLs with custom callbacks & parameters
c.queue([{
    uri: 'http://parishackers.org/',
    jQuery: false,

    // The global callback won't be called
    callback: function (error, res, done) {
        if(error){
            console.log(error);
        }else{
            console.log('Grabbed', res.body.length, 'bytes');
        }
        done();
    }
}]);

// Queue some HTML code directly without grabbing (mostly for tests)
c.queue([{
    html: '<p>This is a <strong>test</strong></p>'
}]);