Scrapy 使用带有规则的 start_requests

问题描述 投票:0回答:3

我找不到任何使用 start_requests 和规则的解决方案,我也没有在互联网上看到任何关于这两个的示例。我的目的很简单,我想重新定义 start_request 函数以获得捕获请求期间所有异常的能力,并在请求中使用元。这是我的蜘蛛的代码:

类 TestSpider(CrawlSpider): 名称 = '测试' allowed_domains = ['www.oreilly.com'] start_urls = ['https://www.oreilly.com/library/view/practical-postgresql/9781449309770/ch04s05.html']

# Base on scrapy doc
def start_requests(self):
    for u in self.start_urls:
        yield Request(u, callback=self.parse_item, errback=self.errback_httpbin, dont_filter=True)

rules = (
    Rule(LinkExtractor(), callback='parse_item', follow=True),
)

def parse_item(self, response):
    item = {}
    item['title'] = response.xpath('//head/title/text()').extract()
    item['url'] = response.url
    yield item

def errback_httpbin(self, failure):
    self.logger.error('ERRRRROR - {}'.format(failure))

此代码仅抓取一页。我尝试修改它而不是:

def parse_item(self, response):
    item = {}
    item['title'] = response.xpath('//head/title/text()').extract()
    item['url'] = response.url
    yield item

根据这个答案,我尝试使用这个

def parse_item(self, response):
    item = {}
    item['title'] = response.xpath('//head/title/text()').extract()
    item['url'] = response.url
    return self.parse(response) 

它似乎有效,但即使我向蜘蛛添加解析功能,它也不会抓取任何内容。有人知道如何一起使用 start_request 和规则吗?我很高兴获得有关此主题的任何信息。祝你编码愉快!

scrapy web-crawler
3个回答
1
投票

我找到了一个解决方案,但坦率地说,我不知道它是如何工作的,但它确实有效。

class TSpider(CrawlSpider):
    name = 't'
    allowed_domains = ['books.toscrapes.com']
    start_urls = ['https://books.toscrapes.com']
    login_page = 'https://books.toscrapes.com'

    rules = (
        Rule(LinkExtractor(), callback='parse_item', follow=True),
    )

    def start_requests(self):
        yield Request(url=self.login_page, callback=self.login, errback=self.errback_httpbin, dont_filter=True)

    def login(self, response):
        return FormRequest.from_response(response)

    def parse_item(self, response):
        item = {}
        item['title'] = response.xpath('//head/title/text()').extract()
        item['url'] = response.url
        yield item

    def errback_httpbin(self, failure):
        self.logger.error('ERRRRROR - {}'.format(failure))

0
投票

要捕获

rules
中的错误,您需要为
errback
定义
Rule()
。但不幸的是,现在这是不可能的。

您需要自己解析和

yield
request
(这样您就可以使用
errback
)或使用
response
处理每个
middleware


0
投票

这里是 LinkExtractor 中处理 errback 的 解决方案

谢谢这位老兄!

© www.soinside.com 2019 - 2024. All rights reserved.