我使用Beautiful Soup4库编写了一个python网络爬行器,并在树莓派0上运行它。我正在从mlb.com/<insert a team name>/scores抓取数据,例如,mlb.com/padres/scores或mlb.com/cubs/scores。当游戏被安排好、正在进行或已经结束时,这些网站看起来略有不同。我的程序是在游戏进行的时候使用的。
我面临的问题是,当我试图在循环中运行程序,随着游戏的进展不断获取信息时(理想情况下,我的程序会捕捉到每一次投球更新),我的网络刮板没有跟上。似乎web刮板每3-4分钟抓取一次HTML,如果我继续运行它,它会从某个缓存中获取数据。当我刷新桌面上的页面时,我可以看到页面已经更新。但是当程序在我的Raspberry pi 0上运行时,它在大约3-4分钟内看不到页面的更新。
例如,当我在我的rpi上运行脚本时,它将捕获游戏中的某个时刻。2次出局,1个球,2次好球,等等。当在我的桌面浏览器上查看时,游戏将继续,网页将更新。两次出局,两个球,两次好球……两次出局,三个球,两次好球...但是如果我继续在我的rpi上运行脚本,它仍然会看到/显示2次出局,1个球,2次好球,这与我在桌面上看到的不一样。然后大约3-4分钟后,我的rpi将更新,并再次与我在桌面上看到的内容相匹配。
如果需要,我可以发布代码,但我倾向于这样做,因为我对BS4库的工作原理缺乏了解。在此期间,我将通读文档,但希望有人知道我的问题。谢谢!
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
# Set the URL you want to webscrape from
url = 'https://www.mlb.com/astros/scores'
while again:
# Connect to the URL
uClient = uReq(url)
page_html = uClient.read()
uClient.close()
#set html parsing
page_soup = soup(page_html,"html.parser")
data = page_soup.find('div',{'data-test-mlb':'singleGameContainer'})发布于 2020-09-08 22:19:04
漂亮的汤从HTML中提取信息,但它本身并不执行请求。如果你在你的硬盘上保存了一个html格式的网页,并且总是用漂亮的汤来解析它,那么它永远不会更新。你必须用requests.get或类似的语言重新获取你的网页。
示例:
import requests
from bs4 import BeautifulSoup
from time import sleep, time
prev = ""
# Set the URL you want to webscrape from
url = 'https://www.mlb.com/astros/scores'
start = time()
while True:
t0 = time()
# Connect to the URL
r = requests.get(url)
page_html = r.text
t1 = time()
print(f"{t1 - start:.2f}s {t1-t0:.2f}s", page_html == prev)
prev = page_html
sleep(10) 上面的代码给出了以下输出:
0.15s 0.15s False
10.38s 0.22s True
20.56s 0.17s True
32.41s 1.83s True
42.57s 0.16s True
52.74s 0.16s True
62.90s 0.15s True
73.08s 0.17s True
83.25s 0.16s True
93.41s 0.15s True
103.57s 0.15s True
115.13s 1.55s False
125.29s 0.16s True
135.46s 0.16s True
145.63s 0.16s True
155.81s 0.17s True
166.07s 0.26s True因此网页正在正确更新
不过,有一件事可能会导致错误,那就是使用BeautifulSoup.find here,这会将输出限制为只有一个结果。我猜这是故意的,但如果不是,你可能就有问题了……
https://stackoverflow.com/questions/63795752
复制相似问题