Scrapy:通过 Javascript 获取内容集
Scrapy: Fetching the content set via Javascript
我正在尝试抓取 this URL。它通过 Javascript 将成本从 130 更改为 154.99。当您看到价格 DOM 的查看来源时,它看起来像:
<span id="item_price_6516">£130.00</span>
肯定是通过JavaScript设置的。
如何通过 scrapy 获取正确的值?
我尝试获取值的方式是:
price = hxs.select('//*[@id="display_price"]/span[2]/text()').extract()
价格是 借助 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'}}
How can I fetch the correct value via scrapy?
Scrapy 的下载器不是浏览器,不会执行 javascript。但你可以:
1.Inspect Firebug 或 Chrome 发生了什么控制台并构建您对 AJAX api 的请求手动生成它例如:
def parse_my_ajax_page(self, response):
...
yield Request(url, ..., callback=self.parse_my_ajax_request)
或按照上面 alecxe 的建议从脚本标签中提取所需数据(如果存在)。
2.Use javascript 类似 Prerender or Splash 的渲染服务(来自 Scrapy 创作者)。
3.Use 直接使用 Selenium 或 PhantomJS(非常慢且有错误)。
我正在尝试抓取 this URL。它通过 Javascript 将成本从 130 更改为 154.99。当您看到价格 DOM 的查看来源时,它看起来像:
<span id="item_price_6516">£130.00</span>
肯定是通过JavaScript设置的。
如何通过 scrapy 获取正确的值?
我尝试获取值的方式是:
price = hxs.select('//*[@id="display_price"]/span[2]/text()').extract()
价格是 借助 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'}}
How can I fetch the correct value via scrapy?
Scrapy 的下载器不是浏览器,不会执行 javascript。但你可以:
1.Inspect Firebug 或 Chrome 发生了什么控制台并构建您对 AJAX api 的请求手动生成它例如:
def parse_my_ajax_page(self, response):
...
yield Request(url, ..., callback=self.parse_my_ajax_request)
或按照上面 alecxe 的建议从脚本标签中提取所需数据(如果存在)。
2.Use javascript 类似 Prerender or Splash 的渲染服务(来自 Scrapy 创作者)。
3.Use 直接使用 Selenium 或 PhantomJS(非常慢且有错误)。