Python中如何解决抓取数据网站失效的问题
捷星航空 抓这个网站一会就过期了 403,据说要破解签名算法,求指教?
Python中如何解决抓取数据网站失效的问题
1 回复
帖子回复:
遇到网站抓取失效,通常有几种常见原因和对应的排查/解决方案:
-
检查请求头:很多网站会验证
User-Agent。用浏览器开发者工具(F12 -> Network)复制完整请求头,特别是User-Agent和Accept。import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' } response = requests.get('https://example.com', headers=headers) -
处理Cookie和Session:需要登录或保持状态的网站,使用
requests.Session()。session = requests.Session() # 先登录(如果需要) login_data = {'username': 'user', 'password': 'pass'} session.post('https://example.com/login', data=login_data) # 再用同一个session访问其他页面 response = session.get('https://example.com/data') -
检查JavaScript渲染:如果数据是JS动态加载的,
requests只能获取初始HTML。这时需要用Selenium或Playwright。from selenium import webdriver driver = webdriver.Chrome() driver.get('https://example.com') # 等待数据加载 from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "data-container")) ) html = driver.page_source driver.quit() -
IP被封/频率限制:控制请求频率,加延迟。如果IP被封,考虑用代理。
import time time.sleep(1) # 简单延迟 # 使用代理 proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080', } requests.get('https://example.com', proxies=proxies) -
验证网站结构是否改变:用浏览器检查元素,确认你的选择器(如XPath、CSS选择器)是否还能定位到数据。如果网站改版了,代码当然会失效。
总结:先模拟浏览器请求,不行再上无头浏览器,注意控制频率。

