使用BeautifulSoup爬取网页时提取文本更新频率远低于网页实际更新频率
核心原因
- 你用
requests发起请求拿到的内容,是网站服务器提前生成好的静态页面快照,不是浏览器中打开后持续动态刷新的实时页面。 - 打个简单的比方:你每2秒发一次请求,相当于每隔2秒找网站前台要一张打印好的价格告示单,但前台的告示单是每隔1-2分钟才统一重印一批,你要得再频繁,拿到的大多是同一批次印的旧单子,价格自然很久才会变一次。
- 你在浏览器里看到的几秒一变动的价格,就像门店墙上挂的电子价签,会自动每隔几秒同步最新价格。这个自动刷新的动作是浏览器在页面加载完成后额外执行的,
requests只能拿到刚发起请求时前台返回的纸质宣传单,不会等着后续电子屏的内容更新,所以你爬下来的价格和眼睛看到的实时页面根本对不上。
修正方案
靠反复爬取整个静态页面的方式既拿不到实时价格,请求频率太高还容易被网站拦截。你可以直接获取网页用来更新电子价签的数据源,不需要解析复杂的HTML页面结构,就能拿到和网页显示完全同步的最新价格,修改后的可运行代码如下:
import time import requests i = 2 while i <= 500: # 请求网页更新价格用的数据源 resp = requests.get( 'https://api.coinmarketcap.com/data-api/v3/cryptocurrency/listing?start=1&limit=2&convert=USD', headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'} ) price_data = resp.json() # 提取以太坊的最新美元价格 eth_price = price_data['data']['cryptoCurrencyList'][1]['quotes'][0]['price'] # 格式化为和网页展示一致的带美元符号的字符串 print(f"${eth_price:,.2f}") i += 2 time.sleep(2)
- 这个方案每次请求拿到的都是服务器返回的最新价格,没有冗余的页面内容,响应速度比爬整个HTML页面快很多,能完全匹配你2秒获取一次最新价格的需求。后续你要把数据写入CSV、添加交易策略模拟逻辑,直接在拿到
eth_price数值后加对应代码即可。
内容的提问来源于stack exchange,提问作者Cai
相关产品推荐
相关产品推荐

