如何在scrapy爬虫中添加try异常处理?
我用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() 这些方法。
了解更多: