Scrapy:通过Javascript获取内容集

时间:2015-04-10 15:21:15

标签: javascript python parsing web-scraping scrapy

我正在尝试抓取this网址。它通过Javascript从130 ot 154.99改变成本。当您看到Price DOM的查看源时,它看起来像:

<span id="item_price_6516">&pound;130.00</span>

它肯定是通过JavaScript设置的。

如何通过scrapy获取正确的值?

我尝试获取值的方式是:

price = hxs.select('//*[@id="display_price"]/span[2]/text()').extract()

2 个答案:

答案 0 :(得分:1)

在浏览器中加载页面时,在javascript被执行的帮助下构建了的价格。期望的价格实际上在您可以使用Scrapy定位的script标签内,使用正则表达式提取包含价格的对象,通过JSON加载并获得价格。

来自Scrapy Shell

的演示
$ scrapy shell http://www.bedstore.co.uk/p/Diamante_Faux_Leather_Bed_Frame.htm
In [1]: import re 
In [2]: import json
In [3]: pattern = re.compile(r"qubit_product_list = (.*?);", re.M)
In [4]: script = response.xpath("//script[contains(., 'qubit_product_list')]/text()").extract()[0]
In [5]: data = pattern.search(script).group(1)
In [6]: json.loads(data)
Out[6]: 
{u'6516-DBL-BLK': {u'category': u'',
  u'currency': u'GBP',
  u'description': u'Double Black',
  u'id': u'6516',
  u'name': u'Diamante Faux Leather Bed Frame',
  u'sku_code': u'LPDF:DIAMANTE-BD',
  u'stock': 100,
  u'unit_price': 129.99,
  u'unit_sale_price': 129.99,
  u'url': u'/p/Diamante_Faux_Leather_Bed_Frame.htm'},
 u'6516-DBL-WHT': {u'category': u'',
  u'currency': u'GBP',
  u'description': u'Double White',
  u'id': u'6516',
  u'name': u'Diamante Faux Leather Bed Frame',
  u'sku_code': u'LPDF:DIAMANTE-WD',
  u'stock': 100,
  u'unit_price': 129.99,
  u'unit_sale_price': 129.99,
  u'url': u'/p/Diamante_Faux_Leather_Bed_Frame.htm'},
 u'6516-KS-BLK': {u'category': u'',
  u'currency': u'GBP',
  u'description': u'Kingsize Black',
  u'id': u'6516',
  u'name': u'Diamante Faux Leather Bed Frame',
  u'sku_code': u'LPDF:DIAMANTE-BK',
  u'stock': 99,
  u'unit_price': 149.99004,
  u'unit_sale_price': 149.99004,
  u'url': u'/p/Diamante_Faux_Leather_Bed_Frame.htm'},
 u'6516-KS-WHT': {u'category': u'',
  u'currency': u'GBP',
  u'description': u'Kingsize White',
  u'id': u'6516',
  u'name': u'Diamante Faux Leather Bed Frame',
  u'sku_code': u'LPDF:DIAMANTE-WK',
  u'stock': 100,
  u'unit_price': 154.98996,
  u'unit_sale_price': 154.98996,
  u'url': u'/p/Diamante_Faux_Leather_Bed_Frame.htm'}}

答案 1 :(得分:0)

  

如何通过scrapy获取正确的值?

Scrapy的下载程序不是浏览器,也不执行javascript。但你可以:

1.检查Firebug或Chrome控制台发生了什么,然后手动构建您对AJAX api的请求,例如:

def parse_my_ajax_page(self, response):
    ...
    yield Request(url, ..., callback=self.parse_my_ajax_request)

或通过alecxe(如果存在)从上面提出的脚本标签中提取所需数据。

2.使用javascript呈现服务,如PrerenderSplash(来自Scrapy创作者)。

3.直接使用Selenium或PhantomJS(非常慢和错误)。