2016-05-10 94 views
1

因此,我正在研究一個python web應用程序,它是一個體育用品(運動裝,工具等)的搜索引擎。基本上它應該搜索多個商店中的給定關鍵字並比較結果以返回20個最佳結果。在這種情況下提取數據的最有效方法是什麼?

我在想這樣做的最好也是最簡單的方法是編寫一個json文件,這個文件包含了關於如何在每個網站上提取數據的規則。例如:

[{"www.decathlon.com" : { "rules" : { "productTag" : "div['.product']", 
"priceTag" : "span[".price"]" } }] 

因此,對於十項全能,要獲得產品項目,我們搜索產品類別的div標籤。

我有一個清單,大約10 - 15網站刮。因此,對於每個網站,它會轉到rules.json,查看相關規則並使用它們來提取數據。

優點這種方法: 很容易寫,我們需要一個最小的Python腳本關於如何閱讀和URL映射到他們的規則,並通過BeautifulSoup提取數據的邏輯+這也是很容易的添加,刪除新的網址及其規則。

缺點這種方法:對於每個搜索我們向每個網站發起一個請求,所以在同一時間做出10個請求,然後比較結果,所以如果20個用戶同時搜索,我們將有大約200個請求會使我們的應用程序變慢很多!

另一種方法:

我想,我們可以有一個巨大的關鍵字列表,然後在00:00,腳本啓動要求所有URL列表中的每個關鍵字,對它們進行比較,然後將結果存儲在CouchDB中,以便在當天使用,並且每天都會更新。這種方法唯一的問題是幾乎不可能有所有可能的關鍵字列表。

那麼請幫助我解決這個問題?鑑於我沒有太多時間。

回答

1

沿着「關鍵字」列表的行列:而不是保留所有可能關鍵字的列表,或許您可以根據搜索關鍵字的頻率來維護關鍵字的優先級隊列。遇到新關鍵字時,請將其添加到列表中,否則在每次搜索時更新它的重要性。啓動一個腳本,以便每天向頂部的30個關鍵字請求網址(或多或少取決於搜索詞的頻率以及您想要執行的操作)。

這並不一定解決您有太多請求的問題,但可能會降低它成爲太多問題的可能性。

1

HTTP請求可能非常昂貴。這就是爲什麼你要確保你的請求並行化,並且你可以使用像芹菜這樣的東西。通過這種方式,您可以將總時間縮短到響應速度最慢的網站。 如果其中一個網站沒有響應您的請求,那麼將請求超時設置爲更短的時間(5秒?)可能是一個好主意。 有能力標記域名爲「down/not responding」並且能夠處理這些異常。

其他優化將在每次搜索後存儲頁面內容一段時間,以防相同的搜索關鍵字進入,因此您可以跳過昂貴的請求。

相關問題