Scrapy - LinkExtractor в потоке управления и почему он не работает - PullRequest
0 голосов
/ 16 июня 2019

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

Эта страница, которую я сканирую.

  • На каждой странице 25 записей, и их ссылки анализируются в parse_page
  • Затем каждая просканированная ссылка анализируется в parse_item

Этот скрипт сканирует первую страницу и элементы в ней без каких-либо проблем.Проблема в том, что это не следует за https://www.yenibiris.com/is-ilanlari?q=yazilim&sayfa=2 (sayfa означает страницу на турецком языке) и другие следующие страницы.

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

Мои вопросы;

  • Когда LinkExtractors должны работать в этомсценарий и почему они не работают?
  • Как я могу заставить паука переходить на следующие страницы, разбирать страницы и разбирать элементы в них с помощью LinkExtractors?
  • Как я могу реализоватьparse_page с LinkExtractor?

Это соответствующие части моего паука.

class YenibirisSpider(CrawlSpider):

    name = 'yenibirisspider'

    rules = (
        Rule(LinkExtractor(allow=(r'.*&sayfa=\d+',)),
             callback='parse_page',
             follow=True),
    )


    def __init__(self):
        super().__init__()
        self.allowed_domains = ['yenibiris.com']

        self.start_urls = [
            'https://www.yenibiris.com/is-ilanlari?q=yazilim',
        ]


    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(
                url=url,
                method='GET',
                callback=self.parse_page
            )

    def parse_page(self, response):
        items = response.css('div.listViewRowsContainer div div div.jobTitleLnk a::attr(href)').getall()
        for item in items:
            yield scrapy.Request(
                url=item,
                method='GET',
                callback=self.parse_items
            )

    def parse_items(self, response):

        # crawling the item without any problem here

        yield item

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Кажется, что ваши rule и LinkExtractor определены правильно. Однако я не понимаю, почему вы определяете и start_requests (), и start_urls. Если вы не переопределяете start_requests() и переопределяете только start_urls, родительский класс 'start_request() генерирует запросы на URL-адреса в атрибуте start_urls. Таким образом, один из них является избыточным в вашем случае. Также определение __init__ неверно. Должно быть так:

def __init__(self,*args,**kwargs):
    super(YenibirisSpider,self).__init__(*args,**kwargs)
    ...

Когда LinkExtractors должен запускаться в этом сценарии и почему они не бегут?

LinkExtractor извлекает ссылки из соответствующего ответа при его получении.

Как я могу заставить паука переходить на следующие страницы, разбирать страницы и разобрать элементы в них с помощью LinkExtractors

Регулярное выражение .*&sayfa=\d+ в LinkExtractor подходит для веб-страницы. Он должен работать после исправления ошибок в вашем коде, как и ожидалось.

Как я могу реализовать parse_page с LinkExtractor?

Я не понимаю, что вы имеете в виду здесь.

0 голосов
/ 16 июня 2019

Ненавижу отвечать на свой вопрос, но думаю, что понял. Когда я определяю функцию start_requests, я могу переопределить поведение rules, поэтому оно не работает. Когда я удаляю функции __init__ и start_requests, паук работает как положено.

class YenibirisSpider(CrawlSpider):

    name = 'yenibirisspider'

    start_urls = [
        'https://www.yenibiris.com/is-ilanlari?q=yazilim&sayfa=1',
    ]

    rules = (
        Rule(LinkExtractor(allow=(r'.*&sayfa=\d+',)), callback='parse_page', follow=True),
    )


    def parse_page(self, response):
        items = response.css('div.listViewRowsContainer div div div.jobTitleLnk a::attr(href)').getall()
        for item in items:
            yield scrapy.Request(
                url=item,
                method='GET',
                callback=self.parse_items
            )

    def parse_items(self, response):

       # crawling the item without any problem here 

        yield item
...