Как использовать Scrapy Crawler с Splash для сканирования страниц Javascript - PullRequest
0 голосов
/ 19 февраля 2019

У меня проблемы с использованием Scrapy Crawler для сканирования веб-сайтов javascript.Похоже, что Scrapy игнорирует Правила и просто продолжает обычную очистку.

Можно ли поручить Spider использовать Splash для сканирования?

Спасибо.

class MySpider(CrawlSpider):
    name = 'booki'
    start_urls = [
    'https://worldmap.com/listings/in/united-states/',

    ]
    rules = (
        # Extract links matching 'category.php' (but not matching 'subsection.php')
        # and follow links from them (since no callback means follow=True by default).
        Rule(LinkExtractor(allow=('catalogue\/category', ), deny=('subsection\.php', ))),

        # Extract links matching 'item.php' and parse them with the spider's method parse_item
        Rule(LinkExtractor(allow=('catalogue', ),deny=('catalogue\/category')), callback='first_tier'),
#        )
    custom_settings = {
        #'DOWNLOAD_DELAY' : '2',
        'SPLASH_URL': 'http://localhost:8050',
        'DOWNLOADER_MIDDLEWARES': {
            'scrapy_splash.SplashCookiesMiddleware': 723,
            'scrapy_splash.SplashMiddleware': 725,
            'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
        },
        'SPIDER_MIDDLEWARES': {
            'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
        },
        'DUPEFILTER_CLASS': 'scrapy_splash.SplashAwareDupeFilter',
        'DOWNLOAD_DELAY' : '8',
        'ITEM_PIPELINES' : {
            'bookstoscrap.pipelines.BookstoscrapPipeline': 300,
        }
    }

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url, self.first_tier,
                endpoint='render.html',
                args={'wait': 3.5},
            )

1 Ответ

0 голосов
/ 19 февраля 2019

Правила сработают только в том случае, если вы действительно попадете на соответствующую страницу после start_requests.Вам также необходимо определить callback функции для ваших Правил, в противном случае они попытаются использовать значение по умолчанию parse (в случае, если ваши Правила ничего не делают).

Чтобы изменить запрос Правила наSplashRequest Вы должны вернуть его в обратном вызове process_request.Например:

class MySpider(CrawlSpider):
    # ...

    rules = (
        Rule(
            LinkExtractor(allow=('catalogue\/category', ), deny=('subsection\.php', )),
            process_request='splash_request'
        ),
        Rule(
            LinkExtractor(allow=('catalogue', ), deny=('catalogue\/category'),
            callback='first_tier',
            process_request='splash_request'
        ),
    )

    # ...

    def splash_request(self, request):
        return SplashRequest(
            request.url,
            callback=request.callback,
            endpoint='render.html',
            args={'wait': 3.5},
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...