Scrapy-控制流中的LinkExtractor以及为什么它不起作用

时间:2019-06-16 06:06:44

标签: python web-scraping scrapy web-crawler

我试图了解为什么我的LinkExtractor不起作用以及它何时在抓取循环中真正运行?

This是我正在抓取的页面。

  • 每个页面上有25个列表,其链接在parse_page中进行了解析
  • 然后在parse_item中解析每个抓取的链接

此脚本可以毫无问题地爬行第一页及其中的项目。问题是,它没有跟随https://www.yenibiris.com/is-ilanlari?q=yazilim&sayfa=2(sayfa的土耳其语页面)和其他下一页。

我认为我的RuleLinkExtractor是正确的,因为当我尝试允许所有链接时,它也不起作用。

我的问题是

  • LinkExtractors应该在何时在此脚本中运行,为什么它们不运行?
  • 如何使Spider跟随下一页,解析页面并使用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 :(得分:0)

我不想回答自己的问题,但我想我已经解决了。当我定义start_requests函数时,我可能会覆盖rules行为,因此它不起作用。当我删除__init__start_requests函数时,spider会按预期工作。

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

答案 1 :(得分:0)

似乎您的ruleLinkExtractor定义正确。但是,我不明白为什么要同时定义start_requests()和start_urls。如果您不覆盖start_requests()并且仅覆盖start_urls,则父类“ start_request()”会在start_urls属性中生成对URL的请求。因此,在您的情况下,其中之一是多余的。另外,__init__定义是错误的。应该是这样的:

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

LinkExtractors应该何时在此脚本中运行,以及为什么   他们没有在跑吗?

LinkExtractor在收到响应时从相应响应中提取链接。

  

如何使Spider跟随下一页,解析页面   并使用LinkExtractors解析其中的项目

LinkExtractor中的正则表达式.*&sayfa=\d+适用于该网页。在按预期修复代码中的错误后,它应该可以工作。

  

如何使用LinkExtractor实现parse_page?

我不明白你在这里的意思。