2017-11-11 21 views
0

私はPythonでウェブスクレイピングの世界では初めてですが、開発したい究極のスキルは、スクレイプされたデータをデータベースに保存し、そのデータを定期的にリフレッシュさせることです。Python Beautiful Soup WebScraping:新しいデータのみを返しますか?

私の質問は次のとおりです。データリクエスト(時間、帯域幅の使用)をどのように節約し、最後にスクリプトを実行してから新しいデータのみを要求するのですか?

例えば

は、私のコードは、ウェブサイトAutotrader上の車のリストを返します。

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) 
:代わりにデータベースを使用しての

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) 

、私は私の質問を説明するのを助けるためにデータフレームで出力を保存することができます出力

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でリクエストを送信し、サーバは、ページがあなたの最後のタイムスタンプよりも新しいかどうかに応じて304または200(フル応答)を返す必要があります。

もちろん、これはすべて、便利なヘッダーを送信して処理することによって、サーバー/ページの所有者がniceになっているかどうかによって異なります。残念ながら、ETagまたはLast-Modifiedヘッダーがサンプルページに表示されません。

最終的に、新しいデータがないことを確実にする唯一の方法は、それを掻き集めてDBの内容と比較することです。すっきりしたスクレイピングとDBコードを書くことで、できるだけそのプロセスを最適化することができます。

関連する問題