如何在scrapy爬虫中添加try异常处理?

2 投票
1 回答
6931 浏览
提问于 2025-04-30 05:49

我用urllib2和beautifulsoup搭建了一个简单的爬虫应用,现在我打算把它改成scrapy蜘蛛。不过,我想知道在运行爬虫的时候,怎么处理错误。

我现在的应用里有一些代码,比如:

error_file = open('errors.txt','a')
finish_file = open('finishlink.txt','a')
try:
    #Code for process each links
    #if sucessfully finished link store into 'finish.txt' file
except Exception as e:
    #link write into 'errors.txt' file with error code

在处理成千上万的链接时,成功处理的链接会存储到finish.txt文件里,而出错的链接会放在errors.txt文件中。这样我就可以稍后重新运行那些出错的链接,直到它们成功处理为止。

那么,我该怎么在这些代码中实现这个功能呢?

class DmozSpider(scrapy.Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ]

    def parse(self, response):
        filename = response.url.split("/")[-2]
        with open('filename+'.txt', 'wb') as f:
            f.write(response.body)
暂无标签

1 个回答

3

你可以创建一个 爬虫中间件,并重写 process_spider_exception() 这个方法,把链接保存到文件里。

爬虫中间件就是一种扩展 Scrapy 功能的方法。下面是一个完整的例子,你可以根据自己的需要进行修改:

from scrapy import signals


class SaveErrorsMiddleware(object):
    def __init__(self, crawler):
        crawler.signals.connect(self.close_spider, signals.spider_closed)
        crawler.signals.connect(self.open_spider, signals.spider_opened)

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def open_spider(self, spider):
        self.output_file = open('somefile.txt', 'a')

    def close_spider(self, spider):
        self.output_file.close()

    def process_spider_exception(self, response, exception, spider):
        self.output_file.write(response.url + '\n')

把这个放到一个模块里,并在 settings.py 中进行设置:

SPIDER_MIDDLEWARES = {
    'myproject.middleware.SaveErrorsMiddleware': 1000,
}

这段代码会和你的爬虫一起运行,在合适的时候触发 open_spider()、close_spider() 和 process_spider_exception() 这些方法。

了解更多:

撰写回答