【问题标题】:Scrapy: Fetching the content set via JavascriptScrapy:通过 Javascript 获取内容集
【发布时间】:2015-06-16 09:20:28
【问题描述】:

我正在尝试抓取this URL。它通过 Javascript 将成本从 130 到 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()

【问题讨论】:

  • @AvinashRaj 问题已更新

标签: javascript python parsing web-scraping scrapy


【解决方案1】:

价格是在您在浏览器中加载页面时在执行 javascript 的帮助下构建的。想要的价格实际上是在script 标签内,您可以使用 Scrapy 定位该标签,使用正则表达式提取包含价格的对象,通过 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'}}

【讨论】:

  • data = pattern.search(script).group(1) 给出错误:TypeError: expected string or buffer
  • @Volatil3 很有趣,我这边没有错误。使用 python 2.7.9 和 scrapy 0.24.5。你看script的值是多少?谢谢。
  • 猜它是 OSX 的东西。让我在脚本中试试
  • 奇怪的是,它将对象解析为 shell 中的 dict,而不是通过 Loader 在脚本中。我找不到任何输出
  • @Volatil3 请看看在应用解决方案遇到困难的情况下创建一个新问题是否更有意义。谢谢。
【解决方案2】:

如何通过 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(非常慢且有问题)。

【讨论】:

  • 没有 AJAX 发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 2017-12-24
相关资源
最近更新 更多