scrapy-splash рендеринг больше, чем на первой странице

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

вот код:

import scrapy
from scrapy_splash import SplashRequest
import scrapy_splash

class ShutSpider(scrapy.Spider):
    name = 'Shut'
    def start_requests(self):
            yield SplashRequest(url='ROOTURL',callback=self.parse)

    def parse(self, response):
        # follow links to author pages
        content=response.xpath('//*[@id="iconQuesBar"]/a[4]/@href').extract()
        for href in content:
            yield response.follow(href.replace('?id=', ''), self.parse_QNA)
        if content == []:
            return
        # follow pagination links
        for href in response.xpath('//*[@id="body-div"]/table/tbody/tr[2]/td[3]/center/form/span/a/@href').extract():
            yield response.follow(href, self.parse)

    def parse_QNA(self, response):
        yield {
            'url': response.url,
            'title': response.xpath('//h1[@class = "head"]/text()').extract()

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

Спасибо за помощь.

1 ответ

Решение

Вместо response.follow()Эксплицитно дайте новый SplashRequest для последующих страниц. Кроме того, вам придется использовать response.urljoin() в этом случае. Вот модифицированный код:

import scrapy
from scrapy_splash import SplashRequest
import scrapy_splash

class ShutSpider(scrapy.Spider):
    name = 'Shut'
    def start_requests(self):
        yield SplashRequest(url='ROOTURL',callback=self.parse)

    def parse(self, response):
        # follow links to author pages
        content = response.xpath('//*[@id="iconQuesBar"]/a[4]/@href').extract()
        for href in content:
            yield SplashRequest(response.urljoin(href.replace('?id=', '')), self.parse_QNA)
        if content == []:
            return
        # follow pagination links
        for href in response.xpath('//*[@id="body-div"]/table/tbody/tr[2]/td[3]/center/form/span/a/@href').extract():
            yield SplashRequest(response.urljoin(href), self.parse)

    def parse_QNA(self, response):
        yield {
            'url': response.url,
            'title': response.xpath('//h1[@class = "head"]/text()').extract()
Другие вопросы по тегам