我是使用Python进行webscraping的新手,但我想要开发的最终技能是将数据存储到数据库中,并定期刷新数据。
我的问题是:您如何节省数据请求(时间,带宽使用),仅请求自上次运行脚本以来的新数据?
例如,我的代码返回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 :(得分:1)
如果页面发送ETag
header(基本上是页面的校验和),您可以对其进行数据库存储并将其与您的下一个请求一起发送。如果没有变化,服务器将发回304
(无变化),您可以停止。
如果页面发送Last-Modified
header,您可以对其进行数据库处理,并将其与下一个请求中的Last-Modified
标头进行比较。要保存处理,请在刮取之前检查头部。如果页面很少更改,您可以将带宽节省downloading only the header。
或者,更好的是,使用If-Modified-Since
header发送请求,服务器应返回304
或200
(完整回复),具体取决于网页是否比上一个更新时间戳。
当然,通过发送和处理有用的标头,所有这一切取决于服务器/网页所有者。不幸的是,我没有看到您的示例页面附带ETag
或Last-Modified
标题。
最终,确定没有新数据的唯一方法是将其删除并与数据库中的数据进行比较。您可以通过编写光滑的抓取和数据库代码来尽可能地优化该过程。