2017-09-21 124 views
0

從數據庫中獲得Start_Urls不幸的是我沒有足夠的人口來作出評論,所以我不得不做出這個新的問題,指的是https://stackoverflow.com/questions/23105590/how-to-get-the-pipeline-object-in-scrapy-spiderScrapy:通過管道

我有一個DB的網址。所以我想從我的數據庫中獲取start_url。到目前爲止不是一個大問題。 嗯,我不想在蜘蛛和管道中的mysql的東西,我得到一個問題。 如果我嘗試將管道對象交給我的蜘蛛像提到的問題,我只得到一個屬性錯誤與消息

'None Type' object has no attribute getUrl 

我認爲實際的問題是,spider_opened的功能不會被調用(也插入了從未在控制檯中顯示其輸出的打印語句)。 有人想法如何獲得蜘蛛內的管道對象?

MySpider.py

def __init__(self): 
    self.pipe = None 

def start_requests(self): 
    url = self.pipe.getUrl() 
    scrapy.Request(url,callback=self.parse) 

Pipeline.py

@classmethod 
def from_crawler(cls, crawler): 
     pipeline = cls() 
     crawler.signals.connect(pipeline.spider_opened, signals.spider_opened) 
def spider_opened(self, spider): 
    spider.pipe = self 

def getUrl(self): 
    ... 

回答

1

Scrapy管道已經預計將從文檔兩者的open_spiderclose_spider

方法:https://doc.scrapy.org/en/latest/topics/item-pipeline.html#open_spider

open_spider(self,spider)
此方法在蜘蛛打開時調用。
參數:蜘蛛(蜘蛛對象) - 這是打開

close_spider蜘蛛(個體,蜘蛛)
當蜘蛛被關閉時調用此方法。 參數:蜘蛛(蜘蛛對象) - 這是封閉

但是你原來的問題沒有多大意義,你爲什麼要到管道中的基準分配給你的蜘蛛蜘蛛?這似乎是一個非常糟糕的主意。

你應該做的是打開數據庫並閱讀你的蜘蛛本身的URL。

from scrapy import Spider 
class MySpider(Spider): 
    name = 'myspider' 
    start_urls = [] 

    @classmethod 
    from_crawler(self, crawler, *args, **kwargs): 
     spider = super().from_crawler(crawler, *args, **kwargs) 
     spider.start_urls = self.get_urls_from_db() 
     return spider 

    def get_urls_from_db(self): 
     db = # get db cursor here 
     urls = # use cursor to pop your urls 
     return urls 
+0

但是open_spider和spider_opened從信號有什麼不同? (https://doc.scrapy.org/en/latest/topics/signals.html#spider-已打開) 我需要更多,然後只有一個蜘蛛不同的工作。他們通常會有相同的sql語句,所以我沒有多次使用相同的代碼。 – phenixclaw

+0

open_spider方法已經連接到signals.spider_opened信號。如果你有多個蜘蛛,只需製作一個可以從中繼承start_urls邏輯的基礎蜘蛛。 – Granitosaurus

+0

因此,我使用哪種open_spider並不重要? 但回到我的問題: 好吧,讓我們來思考。 我爲start_urls實現了一個基礎蜘蛛。所以我必須將SQL連接的邏輯放入基本蜘蛛。 但是如果其他蜘蛛會將他們的結果寫入數據庫呢?在那裏我必須在管道中實現SQL連接的邏輯。所以我有相同的代碼2次?我只是想避免它。有沒有解決方法? – phenixclaw