Python网络爬取:如何用Selenium实现无刷新实时数据爬取
无刷新实时爬取泰国气象厅网站数据的实现方案
你当前的代码每次循环都重新加载页面并刷新,效率较低。以下两种方案可以实现无刷新获取实时数据:
方案一:基于Selenium的无刷新查询(无需页面刷新)
只需要首次加载页面,之后每次循环直接重新查询目标元素即可——如果页面是通过AJAX后台更新DOM内容,重新查找元素就能拿到最新数据,无需刷新整个页面。
修改后的代码:
from selenium import webdriver import time from selenium.webdriver.common.by import By driver = webdriver.Chrome("/path/to/chromedriver") Data = [] num = 0 url = 'https://www.tmd.go.th/en/' # 仅首次加载页面 driver.get(url) time.sleep(2) # 等待首次页面渲染完成 while num < 2: # 直接重新定位元素,获取最新文本 temp = driver.find_element(By.XPATH,'/html/body/main/div[2]/div/div[2]/div[1]/div/div[2]/h1/span').text Data.append(temp) print(Data) # 等待数据更新(根据页面实际更新频率调整时长) time.sleep(5) num += 1 else: print('finish') driver.quit()
如果页面DOM不会自动更新,还可以通过执行JavaScript触发局部刷新,比如模拟页面内的刷新按钮点击(若存在):
# 假设页面有刷新按钮,用定位器找到后点击 refresh_btn = driver.find_element(By.CSS_SELECTOR, ".refresh-button") refresh_btn.click() time.sleep(1) # 等待局部更新完成
方案二:直接调用网站API(推荐,效率更高)
通过浏览器开发者工具抓包,找到网站获取实时数据的API接口,直接用requests库请求接口,完全无需使用Selenium,效率远高于页面渲染方式。
示例代码(需替换为实际抓包得到的API地址和数据提取逻辑):
import requests import time Data = [] num = 0 # 实际需通过抓包获取真实API地址 api_url = "https://www.tmd.go.th/api/weather/current" while num < 2: # 设置请求头模拟浏览器访问,避免被拦截 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" } response = requests.get(api_url, headers=headers) if response.status_code == 200: weather_data = response.json() # 根据API返回的JSON结构提取温度(需实际调整) temp = weather_data['data']['temperature'] Data.append(str(temp)) print(Data) time.sleep(5) # 控制请求频率,避免被封禁 num += 1 else: print('finish')
注意事项
- 方案一中,若页面元素定位使用的是绝对XPATH,建议改为相对定位(比如CSS选择器),避免页面结构变动导致定位失效。
- 方案二中,抓包时需注意API的请求参数、请求头(如
Referer、User-Agent),确保请求能正常返回数据。 - 无论哪种方案,都需设置合理的请求间隔,避免给目标网站造成服务器压力,防止IP被封禁。
内容的提问来源于stack exchange,提问作者www
相关产品推荐
相关产品推荐

