2016-03-15 153 views
0

我以前使用過scrapy,但是隻能從一個站點獲取信息。我想使用scrapy從不同網站上的目錄中獲取信息。在這些網站的每一個上,信息都存儲在一個簡單的html表格中,標題相同。我如何校準scrapy以從每個html表中獲取數據,即使表類可能因網站而異?在更大的範圍內,我問的是如何使用scrapy,當我想擊中不同格式的不同網站時。我將在下面列出幾個網站的html源代碼和xpaths的圖片。如何對scrapy進行編碼以獲取不同格式的html表格

表的字段,或多或少相同爲每個站點目錄1]

爲位點1中的XPath的名稱列2]

中的XPath站點2的名稱列3]

網站1

一般的HTML格式,用電話號碼模糊了網站2的4]

一般的HTML格式

的第三個網站,比第2,但仍然有4列6]

回答

1

是的 - 爲每個站點編寫一個蜘蛛都有點​​痛苦,特別是如果有100個和所有這些蜘蛛都是相同的。

如果它適合您的需要,您可能希望將每個站點的XPath存儲在一個文件中,例如一個csv file。如果你需要你的蜘蛛釋放到例如

def start_requests(self): 
    with open(getattr(self, "file", "todo.csv"), "rU") as f: 
     reader = csv.DictReader(f) 
     for line in reader: 
      request = Request(line.pop('url')) 
      request.meta['fields'] = line 
      yield request 

def parse(self, response): 

    xpath = response.meta['fields']['tablexpath'] 
    ... use xpath it to extract your table 

:然後你就可以從CSV獲取URL和表達,並在您的蜘蛛使用它們(改編自here) scrapyd或scrapinghub,您需要將您的.csv文件與您的代碼一起打包。要做到這一點,你將不得不修改setup.pyshub deployscrapyd-client產生並添加:

setup(
... 
    package_data={'myproject': ['my_csv.csv']} 
) 

而且在你的蜘蛛,而不是直接與open打開你的文件,你應該使用這樣的:

from pkg_resources import resource_stream 
f = resource_stream('myproject', 'my_csv.csv') 

這是example。如果你不部署你的蜘蛛,只要忽略上述。如果你這樣做會爲你節省幾個小時的調試時間。

1

表不同的通用格式我這樣做,通過創建與每個站點一個蜘蛛scrapy項目,並使用同一項目所有不同的蜘蛛類。

相關問題