0

我使用 Beautiful Soup 4 库编写了一个 python 网络爬虫,并在树莓派 0 上运行它。我正在从中获取数据mlb.com/<insert a team name>/scores,例如,mlb.com/padres/scoresmlb.com/cubs/scores. 当游戏被安排、正在进行或已经结束时,这些网站看起来略有不同。我的程序适用于游戏进行时。

我面临的问题是,当我尝试循环运行程序以随着游戏的进行不断获取信息时(理想情况下,我的程序会捕获每个音高更新),我的网络爬虫无法跟上。似乎网络抓取工具每 3-4 分钟抓取一次 HTML,然后如果我继续运行它,它会从某处的缓存中获取数据。当我在桌面上刷新页面时,我可以看到页面已更新。但是当程序在我的 Raspberry pi 0 上运行时,它大约 3-4 分钟看不到页面的更新。

例如,当我在我的 rpi 上运行脚本时,它会捕捉游戏中的某个时刻。2 出局、1 球、2 好球等。在我的桌面浏览器上查看时,游戏将继续,网页将更新。2 出局,2 球,2 次好球...... 2 次出局,3 球,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'})

https://github.com/MattNemeth/led-cle-indians

4

1 回答 1

1

beautifulsoup 从 HTML 中提取信息,但它本身并不执行请求。如果您在驱动器上以 html 格式保存了网页,并且始终使用 beautifulsoup 解析它,则它永远不会更新。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 此处会将输出限制为仅一个结果。我想这是故意的,但如果不是,您可能会遇到问题...

于 2020-09-08T14:19:03.673 回答