CrawlSpider с Splash

У меня проблема с моим пауком. Я использую всплеск со scrapy, чтобы получить ссылку на «Следующую страницу», которая генерируется JavaScript. После загрузки информации с первой страницы я хочу загрузить информацию со следующих страниц, но функция LinkExtractor не работает должным образом. Но похоже, что функция start_request не работает. Вот код:

class ReutersBusinessSpider(CrawlSpider):
   name = 'reuters_business'
   allowed_domains = ["reuters.com"]
   start_urls = (
       'http://reuters.com/news/archive/businessNews?view=page&page=1',
   )

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, self.parse, meta={
                'splash': {
                    'endpoint': 'render.html',
                    'args': {'wait': 0.5}
                }
            })
    def use_splash(self, request):
        request.meta['splash'] = {
                'endpoint':'render.html',
                'args':{
                    'wait':0.5,
                    }
                }
        return request

    def process_value(value):
        m = re.search(r'(\?view=page&page=[0-9]&pageSize=10)', value)
        if m:
            return urlparse.urljoin('http://reuters.com/news/archive/businessNews',m.group(1))


    rules = (
        Rule(LinkExtractor(restrict_xpaths='//*[@class="pageNext"]',process_value='process_value'),process_request='use_splash', follow=False),
        Rule(LinkExtractor(restrict_xpaths='//h2/*[contains(@href,"article")]',process_value='process_value'),callback='parse_item'),
    )



    def parse_item(self, response):
        l = ItemLoader(item=PajaczekItem(), response=response)

        l.add_xpath('articlesection','//span[@class="article-section"]/text()', MapCompose(unicode.strip), Join())
        l.add_xpath('date','//span[@class="timestamp"]/text()', MapCompose(parse))
        l.add_value('url',response.url)
        l.add_xpath('articleheadline','//h1[@class="article-headline"]/text()', MapCompose(unicode.title))
        l.add_xpath('articlelocation','//span[@class="location"]/text()')
        l.add_xpath('articletext','//span[@id="articleText"]//p//text()', MapCompose(unicode.strip), Join())

        return l.load_item()

Журналы:

2016-02-12 08:20:29 [scrapy] INFO: Spider opened 2016-02-12 08:20:29 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-02-12 08:20:29 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-02-12 08:20:38 [scrapy] DEBUG: Crawled (200) <POST localhost:8050/render.html>; (referer: None)
2016-02-12 08:20:38 [scrapy] DEBUG: Filtered offsite request to 'localhost': <GET http://localhost:8050/render.html?page=2&pageSize=10&view=page%3E;
2016-02-12 08:20:38 [scrapy] INFO: Closing spider (finished)

Где ошибка? Спасибо за помощь.


person Paweł Kowalski    schedule 11.02.2016    source источник
comment
но функция LinkExtractor не работает должным образом. Но похоже, что функция start_request не работает. Что вы видите? что вы ожидаете вместо этого? можешь поделиться своими логами?   -  person paul trmbrth    schedule 11.02.2016
comment
2016-02-12 08:20:29 [scrapy] INFO: Spider открыт 2016-02-12 08:20:29 [scrapy] INFO: Просканировано 0 страниц (при 0 страницах/мин), очищено 0 элементов (при 0 элементах) /мин) 2016-02-12 08:20:29 [скрапирование] ОТЛАДКА: консоль Telnet прослушивает 127.0.0.1:6023 2016-02-12 08:20:38 [скрапирование] ОТЛАДКА: просканировано (200) ‹POST localhost:8050/render.html› (референт: нет) 2016-02-12 08:20:38 [ scrapy] DEBUG: отфильтрованный внешний запрос к «localhost»: ‹GET localhost:8050/ render.html?page=2&pageSize=10&view=page› 2016-02-12 08:20:38 [scrapy] ИНФОРМАЦИЯ: закрывающий паук (завершено)   -  person Paweł Kowalski    schedule 12.02.2016
comment
Уже предоставленный ответ, вероятно, является основной причиной того, что что-то не работает. Но я также заметил, что вы передаете обратные вызовы классу LinkExtractor в виде строки. Вы должны найти несколько примеров использования LinkExtractor, чтобы понять, как задаются обратные вызовы (например, self.process_value, а не 'process_value').   -  person Gallaecio    schedule 30.01.2019


Ответы (1)


Беглый взгляд: вы не вызываете свойство start_request с помощью заставки... Например, вы должны использовать SplashRequest.

def start_requests(self):
    for url in self.start_urls:
        yield SplahRequest(url, self.parse, meta={
            'splash': {
                'endpoint': 'render.html',
                'args': {'wait': 0.5}
            }
        })

Учитывая, что у вас правильно настроен Splash, то есть в настройках вы включили необходимое среднее где и указали правильный / URL, также разрешили им запускать и кэшировать HTTP все правильно ... Нет, я не запускал ваш код, должно быть хорошо идти сейчас

РЕДАКТИРОВАТЬ: Кстати... его не следующая страница не генерируется js

Следующая страница не JS-генератор

Итак... если нет какой-либо другой причины, по которой вы используете всплеск, я не вижу причин использовать его в простом цикле for при начальном анализе запроса статей, например...

for next in response.css("a.control-nav-next::attr(href)").extract():
    yield scrapy.Request(response.urljoin(next), callback=self.parse...
person scriptso    schedule 25.03.2017