最近我发现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"
},
所以毕竟我有一种感觉,在解析选择器时可能有不同的标准或不同的实现。谁能告诉我这样做的正确方法?