Возникли проблемы со скриптом scrapy-spla sh. Я получаю только один результат, и мой скребок не разбирает другие страницы - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь проанализировать список с javascript веб-сайта. Когда я запускаю его, он возвращает мне только одну запись в каждом столбце, а затем паук отключается. Я уже установил свои настройки промежуточного программного обеспечения. Я не уверен, что происходит не так. Заранее спасибо!

import scrapy
from scrapy_splash import SplashRequest


class MalrusSpider(scrapy.Spider):
    name = 'malrus'
    allowed_domains = ['backgroundscreeninginrussia.com']
    start_urls = ['http://www.backgroundscreeninginrussia.com/publications/new-citizens-of-malta-since-january-2015-till-december-2017/']

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url=url,
                                callback=self.parse,
                                endpoint='render.html')

    def parse(self, response):
        russians = response.xpath('//table[@id="tablepress-8"]')
        for russian in russians:
            yield{'name' : russian.xpath('//*[@class="column-1"]/text()').extract_first(),
                  'source' : russian.xpath('//*[@class="column-2"]/text()').extract_first()}

        script = """function main(splash)
                assert(splash:go(splash.args.url))
                splash:wait(0.3)
                button = splash:select("a[class=paginate_button next] a")
                splash:set_viewport_full()
                splash:wait(0.1)
                button:mouse_click()
                splash:wait(1)
                return {url = splash:url(),
                        html = splash:html()}
            end"""

        yield SplashRequest(url=response.url,
                            callback=self.parse,
                            endpoint='execute',
                            args={'lua_source': script})

1 Ответ

0 голосов
/ 31 января 2020

.extract_first () (теперь .get ()), который вы использовали, всегда будет возвращать первый результат. Это не итератор, поэтому нет смысла вызывать его несколько раз. Вы должны попробовать метод .getall (). Это будет что-то вроде:

names = response.xpath('//table[@id="tablepress-8"]').xpath('//*[@class="column-1"]/text()').getall()
sources = response.xpath('//table[@id="tablepress-8"]').xpath('//*[@class="column-2"]/text()').getall()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...