Scrapy - обработка данных ответа продолжения ajax в оболочке и пауке

Я пытаюсь очистить данные, загружаемые после запроса ajax.

Например, первые 30 видео этой страницы YouTube отображаются в формате html, а затем пользователь должен нажать кнопку «загрузить еще», которая запускает ajax и получает больше результатов. https://www.youtube.com/user/testedcom/videos

Я могу получить ссылку ajax, но как лучше всего извлечь оставшиеся данные/разбить на страницы с помощью функций Scrapy?

запустить оболочку:

scrapy shell https://www.youtube.com/user/testedcom/videos

получить URL-адрес для продолжения ajax:

continuation_url = response.xpath('//*[@class="yt-uix-button yt-uix-button-size-default yt-uix-button-default load-more-button yt-uix-load-more browse-items-load-more-button"]/@data-uix-load-more-href').extract()[0]
url = "https://www.youtube.com/user/testedcom/videos" + continuation_url

получить новые данные от вызова ajax:

fetch(url)

... но отсюда я не уверен, что делать с данными. Он не в том же формате, что и исходный ответ от запуска scrapy shell. Кажется, он не совсем загружается как JSON. Я предполагаю, что у scrapy есть что-то специально для этого, но я не могу найти его в документах.

edit Я могу получить html-контент, выполнив:

import json
response_json = json.loads(response.body_as_unicode())
html = response_json['content_html']

но тогда мне пришлось бы использовать регулярные выражения, чтобы вытащить нужные данные из этого юникода, вместо встроенных селекторов xpath, которые намного удобнее.

Предпочел бы не использовать Selenium или другое дополнение, как в этом решении. . Скорость и простота являются приоритетом.


person ProGirlXOXO    schedule 24.10.2015    source источник


Ответы (2)


Вот документация Scrapy Selector: http://doc.scrapy.org/en/1.1/topics/selectors.html

Я встречал тот же вопрос. И я справляюсь с этим с помощью Selector. Вы можете создать селектор по ответу или строке, тогда можно использовать «xpath».

Кроме того, вы можете использовать try...except... для определения типа ответа (html или json).

def parse(self, response):
    try:
        jsonresponse = json.loads(response.body_as_unicode())
        html = jsonresponse['content_html'].strip()
        sel = Selector(text=html)
    except:
        sel = Selector(response=response)

    entries = sel.xpath(
        '//li[contains(@class,"feed-item-container")]')
    for entry in entries:
        try:
            title = entry.xpath('.//h3/a/text()').extract()[0]
            item = YoutubeItem()
            item['title'] = title
            yield item
        except Exception as err:
            continue

    try:
        jsonresponse = json.loads(response.body_as_unicode())
        sel = Selector(text=jsonresponse['load_more_widget_html'])
    except:
        sel = Selector(response=response)
    try:
        url = "https://www.youtube.com" + \
            sel.xpath(
                '//button[contains(@class,"load-more-button")]/@data-uix-load-more-href').extract()[0]
        req = scrapy.Request(url, callback=self.parse)
        yield req
    except:
        self.log('Scawl completed.')
person Yimu    schedule 09.08.2016

После получения html-контента вы можете инициализировать объект Selector, чтобы использовать селекторы xpath:

from scrapy.selector import Selector
import json

response_json = json.loads(response.body_as_unicode())
html = response_json['content_html']
sel = Selector(text=html)
for url in sel.xpath('//@href').extract():
    yield Request(url, callback=self.somecallbackfunction)
person Arijit C    schedule 25.10.2015