2017-11-11 187 views
0

我對Python的webscraping世界很陌生,但我想開發的終極技能是將刮取的數據存儲到數據庫中並定期刷新數據。Python美麗的湯網頁剪輯:只返回新的數據?

我的問題是:如何節省數據請求(時間,帶寬使用),只請求自上次運行腳本以來新增的數據?

例如,我的代碼返回在網站上Autotrader汽車的上市:

from bs4 import BeautifulSoup 
import requests 

#URL and headers so it thinks we are a browser 
url = "https://www.autotrader.co.uk/car-search?search-target=usedcars&is-quick-search=true&radius=&onesearchad=used&onesearchad=nearlynew&onesearchad=new&make=AC&model=&price-from=&price-to=&postcode=sw65bg" 
headers = {'User-Agent' : 'Mozilla/5.0'} 

#Request 
request = requests.get(url, headers) 

soup = BeautifulSoup(request.text, "html.parser") 

#Find the name box 
name_box = soup.find_all('h2', attrs={'class' : 'listing-title'}) 

#Print the name_box results to see them 
for listing in range(len(name_box)): 
    temp = name_box[listing] 
    value = temp.text 
    print(value) 

而不是使用一個數據庫的,我可以輸出存儲在一個數據幀,以幫助說明我的問題:

data = pd.DataFrame(columns=['A']) 

#Print the name_box results to see them 
for listing in range(len(name_box)): 
    temp = name_box[listing] 
    value = temp.text 
    data = data.append({'A' : value}, ignore_index=True) 

,輸出:

A 
0 AC Cobra 6.3 2dr 
1 AC Cobra 4.9 MK IV 2dr 
2 AC Cobra 3.5 2dr 
3 AC Cobra 3.5 2dr 
4 AC Cobra 5.3 2dr 
5 AC Cobra 5.7 
6 AC Cobra 4736 Built By Gardner Douglas 4.7 2dr 
7 AC Cobra 5.7 
8 AC Cobra 5.7 2dr 
9 AC Cobra 5.8 

如果一個10 AC眼鏡蛇出現在網站上,是有沒有辦法顯示或附加新條目,以便我可以識別出現的新條目?

回答

0

如果頁面發送一個ETag header(基本上是頁面的校驗和),您可以將數據庫發送到您的下一個請求併發送它。如果沒有變化,服務器將發回一個304(不變),您可以停止。

如果頁面發送Last-Modified header,則可以將其數據庫並將其與Last-Modified標頭在下一個請求中進行比較。爲了節省處理,在刮削之前檢查頭部。如果頁面很少更改,則可以通過downloading only the header節省帶寬。

,或者甚至更好,發送與If-Modified-Since header的請求,服務器應該返回一個304200(全響應)根據頁面是否比你的最後的時間戳更新。

當然,所有這一切都取決於服務器/頁面所有者很好通過發送和處理有用的標題。不幸的是,我沒有看到您的示例頁面附帶ETagLast-Modified標頭。

最終,確定沒有新數據的唯一方法是將其擦除並與數據庫中的數據進行比較。您可以通過編寫靈活的抓取和DB代碼儘可能地優化該過程。