jquery 使用Node.js真实的实时抓取网页

xlpyo6sf  于 2023-11-17  发布在  jQuery
关注(0)|答案(9)|浏览(133)

我想构建一个非常非常快的东西,可以执行kayak.com风格的搜索,其中一个查询被分派到几个不同的网站,结果被抓取,并在它们可用时返回给客户端。
让我们假设这个脚本应该只提供JSON格式的结果,我们可以直接在浏览器或另一个Web应用程序中处理它们。
几个出发点:
Using node.js and jquery to scrape websites
有人有主意吗?

jv4diomz

jv4diomz1#

Node.io看起来像是拿蛋糕:-)

t30tvxxf

t30tvxxf2#

所有上述解决方案都假定在本地运行scraper。这意味着你将在性能上受到严重限制(由于按顺序或在有限的线程集中运行它们)。一个更好的方法,imho,是依赖于现有的,尽管是商业的,抓取网格。
下面是一个示例:

var bobik = new Bobik("YOUR_AUTH_TOKEN");
bobik.scrape({
  urls: ['amazon.com', 'zynga.com', 'http://finance.google.com/', 'http://shopping.yahoo.com'],
  queries:  ["//th", "//img/@src", "return document.title", "return $('script').length", "#logo", ".logo"]
}, function (scraped_data) {
  if (!scraped_data) {
    console.log("Data is unavailable");
    return;
  }
  var scraped_urls = Object.keys(scraped_data);
  for (var url in scraped_urls)
    console.log("Results from " + url + ": " + scraped_data[scraped_urls[url]]);
});

字符串
在这里,抓取是远程执行的,只有当结果准备好时才会向代码发出回调(还有一个选项可以在结果可用时收集结果)。
您可以从https://github.com/emirkin/bobik_javascript_sdk下载Bobik client proxy SDK

eqqqjvef

eqqqjvef3#

我自己也做过研究,https://npmjs.org/package/wscraper自诩为
一个基于cheerio.js的web scraper代理,一个快速、灵活、精简的核心jQuery实现;构建在request.js之上;灵感来自http-agent.js
非常低的使用率(根据npmjs.org),但值得任何感兴趣的各方看看。

2exbekwf

2exbekwf4#

你并不总是需要jQuery。如果你玩从jsdom返回的DOM,例如,你可以很容易地把你需要自己(也考虑到你不必担心xbrowser问题。)看到:https://gist.github.com/1335009这不是从node.io带走,只是说你可能能够自己做这取决于你的浏览器。

busg9geu

busg9geu5#

使用ES 7的新方式/承诺

通常,当你刮擦的时候,你会想用一些方法来
1.获取Web服务器上的资源(通常为html文档)
1.阅读该资源并将其作为

  1. DOM/树结构并使其可导航
    1.使用类似SAS工具将其解析为令牌文档。
    树解析和标记解析都有各自的优点,但是树解析 * 通常 * 要简单得多。我们就来看看request-promise,下面是它的工作原理:
const rp = require('request-promise');
const cheerio = require('cheerio'); // Basically jQuery for node.js 

const options = {
    uri: 'http://www.google.com',
    transform: function (body) {
        return cheerio.load(body);
    }
};

rp(options)
    .then(function ($) {
        // Process html like you would with jQuery... 
    })
    .catch(function (err) {
        // Crawling failed or Cheerio

字符串
这里使用的是cheerio,它本质上是一个轻量级的服务器端jQuery-esque库(不需要窗口对象或jsdom)。
因为您使用的是promise,所以您也可以将其写在异步函数中。它看起来是同步的,但与ES 7是异步的:

async function parseDocument() {
    let $;
    try {
      $ = await rp(options);
    } catch (err) { console.error(err); }

    console.log( $('title').text() ); // prints just the text in the <title>
}

4urapxun

4urapxun6#

查看https://github.com/rc0x03/node-promise-parser

Fast: uses libxml C bindings
Lightweight: no dependencies like jQuery, cheerio, or jsdom
Clean: promise based interface- no more nested callbacks
Flexible: supports both CSS and XPath selectors

字符串

d8tt03nd

d8tt03nd7#

我看到大多数的答案都是正确的,比如cheerio等等,但是一旦你到了需要解析和执行JavaScript(比如SPA等等)的时候,我会去看看https://github.com/joelgriffith/navalia(我是作者)。Navalia是为了支持在无头浏览器环境下的抓取而构建的,它非常快。谢谢!

cyej8jka

cyej8jka8#

它是我为Node.JS编写的易于使用但拼写错误的通用scraperhttps://github.com/harish2704/html-scraper它可以基于预定义的模式提取信息。模式定义包括css选择器和数据提取函数。它目前使用cheerio进行dom解析。

ojsjcaue

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上运行过多线程任务,但这似乎是很有可能的!

相关问题