我对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)
不用数据库,我可以将输出存储在数据框中,以帮助说明我的问题:
^{pr2}$哪些输出:
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只眼镜蛇出现在网站上,有没有一种方法可以只显示或附加新条目,这样我就可以在新条目出现时识别它们?在
如果页面发送一个^{} header (基本上是页面的校验和),则可以将其作为数据库,并随下一个请求一起发送。如果没有更改,服务器将返回一个
304
(没有更改),您可以停止。在如果页面发送一个^{} header ,您可以将其建立数据库,并在下一个请求中将其与
Last-Modified
头进行比较。要节省加工,请在刮削前检查头部。如果页面很少更改,则可以通过downloading only the header节省带宽。在或者,更好的方法是发送一个带有^{} header 的请求,服务器应该返回}(完整响应),这取决于页面是否比上一个时间戳更新。在
304
或{当然,所有这一切都取决于服务器/页面所有者是否友好通过发送和处理有用的标题。不幸的是,我没有看到一个
ETag
或Last-Modified
头随示例页面而来。在最终,确定没有新数据的唯一方法是将其与数据库中的数据进行比较。您可以通过编写流畅的抓取和DB代码来尽可能优化该过程。在
相关问题 更多 >
编程相关推荐