使用Beautiful Soup抓取实时风速计网站数据返回None如何解决
问题原因
requests仅能获取服务器返回的初始静态HTML,你在浏览器审查元素中看到的id=js-2-text元素是页面加载完成后由JavaScript动态生成填充的,初始静态HTML中不存在该元素,因此BeautifulSoup无法匹配到对应内容。- 站点的风速数据每秒更新,说明前端是定时请求后端数据接口拉取最新数值后再渲染到页面上,直接爬取原始HTML页面的思路本身不符合站点的数据加载逻辑。
解决方法
方案一:抓接口直接获取数据(优先推荐)
打开浏览器F12开发者工具,切换到「网络」标签,刷新页面后筛选「XHR/ Fetch」类型的请求,找到返回内容包含风速数据的接口,直接用requests请求该接口即可。这种方式无需解析HTML,能直接拿到结构化的JSON数据,请求效率远高于爬取页面。
方案二:使用无头浏览器模拟页面渲染
如果接口有加密、鉴权难以分析,可以用Selenium等工具模拟浏览器运行,等页面JS执行完成后再提取元素内容,示例代码如下:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By import time # 配置Chrome无头模式 chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") driver = webdriver.Chrome(options=chrome_options) driver.get('http://88.97.23.70:81/') # 等待页面JS渲染完成 time.sleep(2) # 提取目标元素内容 wind_data = driver.find_element(By.ID, 'js-2-text').text print(wind_data) # 如需持续采集可添加循环 # while True: # print(driver.find_element(By.ID, 'js-2-text').text) # time.sleep(1) driver.quit()
该方案无需分析接口,直接获取和浏览器一致的渲染后内容,缺点是资源占用更高,采集效率低于接口请求方案。
内容的提问来源于stack exchange,提问作者Ross Anderson
相关产品推荐
相关产品推荐

