【问题标题】:Scrapy using start_requests with rules使用带有规则的 start_requests 进行 Scrapy
【发布时间】:2019-06-23 11:40:15
【问题描述】:

我找不到任何将 start_requests 与规则一起使用的解决方案,而且我在 Internet 上也没有看到任何与这两个相关的示例。我的目的很简单,我想重新定义 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 和 rules 吗?我会很高兴有关此主题的任何信息。祝你编码愉快!

【问题讨论】:

  • 有人,有什么想法吗?
  • 上周我问了一个类似的问题,但也找不到方法。这是问题stackoverflow.com/questions/56616527/…
  • @gunesevitan,你看到这个answer了吗?这些东西让我的规则工作,但它不会抓取任何东西,因为 parse func 是空的。如果我重新定义 parse func 它仍然不起作用(

标签: scrapy web-crawler


【解决方案1】:

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

你需要自己解析和yieldrequest(这样你可以使用errback)或者使用response处理每个response

【讨论】:

  • 可能我写的不是很清楚,上面代码中的bur规则不起作用。
【解决方案2】:

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

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))

【讨论】:

  • 此代码仅在页面有表单时才有效,因此它是无用的。
【解决方案3】:

这是一个solution,用于在 LinkExtractor 中处理 errback

谢谢这位兄弟!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    相关资源
    最近更新 更多