2014-10-28 51 views
2

我使用的urllib2和beautifulsoup構建一個簡單的搜尋應用程序,現在我打算把它變成scrapy蜘蛛,但我怎麼能處理的錯誤,同時運行履帶, 我當前的應用程序有一些這樣的代碼,如何在scrapy蜘蛛中添加try exception?

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

您可以創建一個spider middleware並覆蓋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()方法。

瞭解更多:

+0

在哪個文件我可以添加此功能'process_spider_exception()','中或spider.py'任何其他文件。如果你用一些代碼解釋更多,它會非常有幫助,因爲我從昨天開始就開始scrapy,並且在互聯網上找不到任何其他示例... – Jake 2014-10-29 19:45:52

+0

@Jake好吧,我添加了一個完整的示例 - 這應該會讓你去。 =) – elias 2014-10-29 22:49:51

+0

這是非常有益的,謝謝你的時間..... – Jake 2014-10-30 10:33:27