我想构建一个非常非常快的东西,可以执行kayak.com风格的搜索,其中一个查询被分派到几个不同的网站,结果被抓取,并在它们可用时返回给客户端。
让我们假设这个脚本应该只提供JSON格式的结果,我们可以直接在浏览器或另一个Web应用程序中处理它们。
几个出发点:
Using node.js and jquery to scrape websites的
有人有主意吗?
我想构建一个非常非常快的东西,可以执行kayak.com风格的搜索,其中一个查询被分派到几个不同的网站,结果被抓取,并在它们可用时返回给客户端。
让我们假设这个脚本应该只提供JSON格式的结果,我们可以直接在浏览器或另一个Web应用程序中处理它们。
几个出发点:
Using node.js and jquery to scrape websites的
有人有主意吗?
9条答案
按热度按时间jv4diomz1#
Node.io看起来像是拿蛋糕:-)
t30tvxxf2#
所有上述解决方案都假定在本地运行scraper。这意味着你将在性能上受到严重限制(由于按顺序或在有限的线程集中运行它们)。一个更好的方法,imho,是依赖于现有的,尽管是商业的,抓取网格。
下面是一个示例:
字符串
在这里,抓取是远程执行的,只有当结果准备好时才会向代码发出回调(还有一个选项可以在结果可用时收集结果)。
您可以从https://github.com/emirkin/bobik_javascript_sdk下载Bobik client proxy SDK
eqqqjvef3#
我自己也做过研究,https://npmjs.org/package/wscraper自诩为
一个基于cheerio.js的web scraper代理,一个快速、灵活、精简的核心jQuery实现;构建在request.js之上;灵感来自http-agent.js
非常低的使用率(根据npmjs.org),但值得任何感兴趣的各方看看。
2exbekwf4#
你并不总是需要jQuery。如果你玩从jsdom返回的DOM,例如,你可以很容易地把你需要自己(也考虑到你不必担心xbrowser问题。)看到:https://gist.github.com/1335009这不是从node.io带走,只是说你可能能够自己做这取决于你的浏览器。
busg9geu5#
使用ES 7的新方式/承诺
通常,当你刮擦的时候,你会想用一些方法来
1.获取Web服务器上的资源(通常为html文档)
1.阅读该资源并将其作为
1.使用类似SAS工具将其解析为令牌文档。
树解析和标记解析都有各自的优点,但是树解析 * 通常 * 要简单得多。我们就来看看request-promise,下面是它的工作原理:
字符串
这里使用的是cheerio,它本质上是一个轻量级的服务器端jQuery-esque库(不需要窗口对象或jsdom)。
因为您使用的是promise,所以您也可以将其写在异步函数中。它看起来是同步的,但与ES 7是异步的:
型
4urapxun6#
查看https://github.com/rc0x03/node-promise-parser
字符串
d8tt03nd7#
我看到大多数的答案都是正确的,比如
cheerio
等等,但是一旦你到了需要解析和执行JavaScript(比如SPA等等)的时候,我会去看看https://github.com/joelgriffith/navalia(我是作者)。Navalia是为了支持在无头浏览器环境下的抓取而构建的,它非常快。谢谢!cyej8jka8#
它是我为Node.JS编写的易于使用但拼写错误的通用scraperhttps://github.com/harish2704/html-scraper它可以基于预定义的模式提取信息。模式定义包括css选择器和数据提取函数。它目前使用cheerio进行dom解析。
ojsjcaue9#
我认为这有两个不同的问题。
1.“我想建立一个非常,非常快的东西,可以执行搜索.到几个不同的网站”.要做任何快速的事情,特别是多个任务(因为你想刮多个网站),我建议学习“多线程在Nodejs.”也许这篇文章从DigitalOcean可以帮助:How to use multithreading in NodeJS
1.第二,关于使用Nodejs抓取。这取决于你想要抓取的网站,如果它们是“静态/服务器渲染”,那么你可以使用Cheerio来解析HTML结果,以良好的结构化格式。如果它是一个
javascript-rendered website
,那么你必须使用类似 puppet 师的东西,可以模拟某些动作,就像一个真实的访问者。你可以阅读这篇文章,强调scraping website in javascript using Puppeteer VS Cheerio之间的区别。希望它能有所帮助!我应该提到的另一个技巧是,查看网站使用的外部脚本,有时您正在寻找的数据可以在那里找到!
我从来没有在JavaScript上运行过多线程任务,但这似乎是很有可能的!