0

最近我发现node-osmosis这是一个相对较新的模块,但具有强大的功能,例如同时接受 CSS 和 XPath 选择器、快速抓取和漂亮的语法。

所以我通过使用 CSS 和 XPath 运行一些刮擦,在节点渗透和 X 射线之间进行了比较。我遇到了如下两个问题。

问题1:节点渗透的未知结果

node-osmosis在其主页中提供了一个简单的示例,内容如下

var osmosis = require('osmosis');
osmosis
.get('www.craigslist.org/about/sites')
.find('h1 + div a')
.set('location')
.follow('@href')
.find('header + div + div li > a')
.set('category')
.follow('@href')
.paginate('.totallink + a.button.next:first')
.find('p > a')
.follow('@href')
.set({
    'title':        'section > h2',
    'description':  '#postingbody',
    'subcategory':  'div.breadbox > span[4]',
    'date':         'time@datetime',
    'latitude':     '#map@data-latitude',
    'longitude':    '#map@data-longitude',
    'images':       ['img@src']
})
.data(function(listing) {
    // do something with listing data
})
.log(console.log)
.error(console.log)
.debug(console.log)

如果我只想获取location信息,我将更改为

osmosis
.get('www.craigslist.org/about/sites')
.find('h1 + div a')
.set('location')
.log(console.log)
.error(console.log)
.debug(console.log)

但是我得到的是

(get) starting
(get) loaded [get] www.craigslist.org/about/sites 
(find) found 714 results for "h1 + div a"undefined

事实证明,osmosis 找到了 714 个条目h1+div a,但我不知道undefined这里有什么。

问题2:node-osmosis、x-ray和Chrome控制台结果不一致

我想检索 RobotShop 的产品信息。我决定使用 XPath 选择器

osmosis
  .get('http://www.robotshop.com/en/robots-to-build.html')
  .find('//div[@class="wrap-thumbnailCatTop"]')
  .set('products')
  .log(console.log)
  .debug(console.log)

但这就是我得到的。我什么都得不到。

(get) starting
(get) loaded [get] http://www.robotshop.com/en/robots-to-build.html 
(get) (process) stack: 3, RAM: 30.49Mb (+30.49Mb) requests: 1, heap: 9.20Mb / 16.24Mb
(get) (process) stack: 0, RAM: 30.49Mb (+0.00Mb) requests: 1, heap: 9.22Mb / 16.24Mb

我认为我的 XPath 是有效的,因为我在 Chrome 的控制台中对其进行了测试

$x('//div[@class="wrap-thumbnailCatTop"]')

并得到我想要的产品描述。我还尝试$('.wrap-thumbnailCatTop')在控制台中使用 CSS 选择器,但无法检索任何内容。.wrap-thumbnailCatTop最终,我使用基于 Cheerio 构建的x-ray尝试了这个 CSS 选择器,并得到了不错的结果!代码是:

x('http://www.robotshop.com/en/robots-to-build.html', '.wrap-thumbnailCatTop', [{
  image: 'a img@src',
  product: '.product-name a@title',
  code: 'product-code',
  ratings: '.rating .amount a',
  price: '.price-box .regular-price .price'
}])
  .write('results.json')

而且results.json

[
  {
    "image": "http://www.robotshop.com/media/catalog/product/cache/1/small_image/135x/9df78eab33525d08d6e5fb8d27136e95/a/r/arduino-uno-usb-microcontroller-rev-3_2.jpg",
    "product": "Arduino Uno USB Microcontroller Rev 3",
    "price": "USD $21.89"
  },
  {
    "image": "http://www.robotshop.com/media/catalog/product/cache/1/small_image/135x/9df78eab33525d08d6e5fb8d27136e95/h/i/hitec-hs422-servo-motor-13.jpg",
    "product": "HS-422 Servo Motor"
  },

所以毕竟我有一种感觉,在解析选择器时可能有不同的标准或不同的实现。谁能告诉我这样做的正确方法?

4

1 回答 1

1

您没有看到任何内容,因为 Osmosis 默认情况下不会记录它正在收集的数据。它获取页面并匹配您想要的元素,但您没有告诉它如何处理数据。以下代码将在处理数据时打印出数据。

osmosis
  .get('www.craigslist.org/about/sites')
  .find('h1 + div a')
  .set('location')
  .data(function(data) {
    console.log(data);
  });

您还可以将数据累积在一个数组中,然后在最后对数组执行一些操作.done()

于 2016-03-01T22:07:59.207 回答