使用start_requests和规则进行抓取

时间:2019-06-23 11:40:15

标签: scrapy web-crawler

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

Class 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和规则吗?我将很高兴获得有关该主题的任何信息。有一个不错的编码!

3 个答案:

答案 0 :(得分:0)

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

您需要自己解析和yield request(这样您就可以使用errback)或使用response处理每个middleware

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这里是solution,用于LinkExtractor中的句柄错误

谢谢这个家伙!