2015-04-10 2 views
1

Я пытаюсь просканировать this URL. Он меняет стоимость от 130 до 154.99 через Javascript. Когда бы вы видите просмотр тов цен DOM, выглядит так:Scrapy: выбор содержимого с помощью Javascript

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

И это определенно устанавливается через JavaScript.

Как я могу получить правильное значение с помощью скрининга?

Как я пытался принести значение является:

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

отправьте свои попытки. –

+0

@AvinashRaj Вопрос обновлен – Volatil3

ответ

1

Цена построен с его помощью JavaScript выполняется при загрузке страницы в браузере. Желаемая цена фактически находится внутри одного тега script, который вы можете найти с помощью Scrapy, извлеките объект, содержащий цены, с помощью регулярных выражений, загрузите его через JSON и получите цену.

Demo от 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'}} 
+0

'data = pattern.search (script) .group (1)' дает ошибку: * TypeError: ожидаемая строка или буфер * – Volatil3

+0

@ Volatil3 интересный, без ошибок на моей стороне. Использование python 2.7.9 и scrapy 0.24.5. Какова ценность 'script', которую вы видите? Благодарю. – alecxe

+0

Угадайте, что это OSX вещь. Позвольте мне попробовать в скрипте – Volatil3

0

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) 

или извлекать нужные данные из сценария тега, как предложено выше by alecxe (если он присутствует).

2. Использовать функцию предоставления javascript как Prerender или Splash (от создателей Scrapy).

3. Используйте селен или PhantomJS непосредственно (очень медленный и багги).

+0

No AJAX вещь происходит. – Volatil3

Смежные вопросы