节点渗透,X射线和Chrome控制台

时间:2015-12-10 21:04:25

标签: node.js xpath web-scraping css-selectors x-ray

最近我发现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

事实证明渗透发现了714个条目h1+div a,但我无法弄清楚undefined这里是什么。

问题2:结果不一致节点 - 渗透,X射线和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"]')

并获得了我想要的产品说明。我还尝试在控制台中使用CSS选择器$('.wrap-thumbnailCatTop')但无法检索任何内容。最后,我使用x-ray尝试了这个CSS选择器.wrap-thumbnailCatTop,这是基于cheerio,并得到了很好的结果!代码是:

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"
  },

因此,毕竟我感觉在解析选择器时可能存在不同的标准或不同的实现。有人能告诉我正确的方法吗?

1 个答案:

答案 0 :(得分:1)

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

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

您还可以在数组中累积数据,然后在最后使用.done()

对数组执行某些操作