使用带有规则的start_请求进行Scrapy

使用带有规则的start_请求进行Scrapy,scrapy,web-crawler,Scrapy,Web Crawler,我找不到任何使用带规则的start_请求的解决方案,也没有在互联网上看到任何这两个请求的例子。我的目的很简单,我想重新定义start_请求函数,以便能够捕获所有请求中的异常,并在请求中使用meta。这是我的蜘蛛的代码: 类TestSpider(爬行蜘蛛): 名称='test' 允许的_域=['www.oreilly.com'] 开始\u URL=[''] 这段代码只刮一页。我尝试修改它,而不是: def parse_item(self, response): item = {}

我找不到任何使用带规则的start_请求的解决方案,也没有在互联网上看到任何这两个请求的例子。我的目的很简单,我想重新定义start_请求函数,以便能够捕获所有请求中的异常,并在请求中使用meta。这是我的蜘蛛的代码:

类TestSpider(爬行蜘蛛): 名称='test' 允许的_域=['www.oreilly.com'] 开始\u URL=['']

这段代码只刮一页。我尝试修改它,而不是:

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_请求和规则一起使用吗?我很高兴能得到关于这个话题的任何信息。有一个很好的编码

要从
规则中捕获错误,您需要为
规则()定义
errback
。但不幸的是,这在现在是不可能的


您需要自己解析并
生成
请求
(这样您可以使用
errback
),或者使用
中间件处理每个
响应
,我找到了一个解决方案,但坦率地说,我不知道它是如何工作的,但它确实做到了

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))
以下是LinkExtractor中的错误句柄


谢谢这个家伙

有人,有什么想法吗?上周我问了一个类似的问题,但也找不到办法。这就是问题所在@gunesevitan,你看到了吗?这东西让我的规则工作,但它不会爬网,因为parse func是空的。如果我重新定义parse func,它仍然不起作用(可能我写得不太清楚,上面代码中的bur规则不起作用。这段代码只有在页面具有表单时才起作用,因此它是无用的。
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))