Python中如何解决抓取数据网站失效的问题

捷星航空 抓这个网站一会就过期了 403,据说要破解签名算法,求指教?


Python中如何解决抓取数据网站失效的问题
1 回复

帖子回复:

遇到网站抓取失效,通常有几种常见原因和对应的排查/解决方案:

  1. 检查请求头:很多网站会验证User-Agent。用浏览器开发者工具(F12 -> Network)复制完整请求头,特别是User-AgentAccept

    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)
    
  2. 处理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')
    
  3. 检查JavaScript渲染:如果数据是JS动态加载的,requests只能获取初始HTML。这时需要用SeleniumPlaywright

    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()
    
  4. 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)
    
  5. 验证网站结构是否改变:用浏览器检查元素,确认你的选择器(如XPath、CSS选择器)是否还能定位到数据。如果网站改版了,代码当然会失效。

总结:先模拟浏览器请求,不行再上无头浏览器,注意控制频率。

回到顶部