Python爬虫遇到在浏览器中刷新三次页面才能打开的网站,如何解决?

爬虫遇到在浏览器中刷新三次页面才能打开的网站怎么办,第一次刷新,粉丝,关注,作品全是 null,第二次也是 null,第三次刷新才能拿到具体的数值,有大佬分享下思路吗? https://live.kuaishou.com/profile/3xsm4gufvu5cfhm
Python爬虫遇到在浏览器中刷新三次页面才能打开的网站,如何解决?

13 回复

这是快手的个人信息页面


遇到这种需要多次刷新才能加载的网站,通常是因为服务器设置了反爬机制,比如检测首次请求的请求头、Cookie或会话状态。核心思路是模拟浏览器的完整访问流程。

关键点在于维护会话(Session)和携带必要的请求头。下面是一个使用requests库的解决方案:

import requests
import time
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def get_with_retry_session(url, max_retries=3):
    """
    创建一个带重试机制的会话,模拟浏览器多次访问
    """
    session = requests.Session()
    
    # 设置浏览器标准请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1'
    }
    session.headers.update(headers)
    
    # 配置重试策略
    retry_strategy = Retry(
        total=max_retries,  # 总重试次数
        backoff_factor=1,   # 重试等待时间因子
        status_forcelist=[429, 500, 502, 503, 504],  # 需要重试的状态码
        allowed_methods=["GET", "POST"]  # 允许重试的HTTP方法
    )
    
    adapter = HTTPAdapter(max_retries=retry_strategy)
    session.mount("http://", adapter)
    session.mount("https://", adapter)
    
    try:
        # 首次访问获取初始Cookie
        print("首次访问...")
        response = session.get(url, timeout=10)
        print(f"首次状态码: {response.status_code}")
        
        # 如果需要,可以添加短暂延迟
        time.sleep(2)
        
        # 第二次访问(模拟刷新)
        print("第二次访问...")
        response = session.get(url, timeout=10)
        print(f"第二次状态码: {response.status_code}")
        
        # 第三次访问(模拟再次刷新)
        print("第三次访问...")
        response = session.get(url, timeout=10)
        print(f"第三次状态码: {response.status_code}")
        
        # 检查最终响应
        if response.status_code == 200:
            print("成功获取页面内容")
            return response.text
        else:
            print(f"最终请求失败,状态码: {response.status_code}")
            return None
            
    except Exception as e:
        print(f"请求过程中发生错误: {e}")
        return None

# 使用示例
if __name__ == "__main__":
    url = "https://example.com"  # 替换为目标网址
    html_content = get_with_retry_session(url)
    
    if html_content:
        # 这里可以添加你的解析代码
        print(f"获取到 {len(html_content)} 字符的内容")

代码说明:

  1. 会话管理:使用requests.Session()保持Cookie和连接状态
  2. 请求头设置:完整模拟浏览器的请求头,特别是User-Agent
  3. 重试机制:通过RetryHTTPAdapter实现自动重试
  4. 访问流程:明确进行三次访问,模拟刷新行为
  5. 错误处理:包含基本的异常捕获和状态码检查

如果这个方案不行,可能需要:

  • 检查网站是否要求特定的Referer
  • 查看是否有JavaScript生成的内容(可能需要Selenium)
  • 分析网络请求看是否有额外的验证步骤

总结:模拟完整浏览器会话是关键。

设置 cookie 就行了啊

自己尝试的第一次访问,返回 did,第二次,第三次带着 did 使用 session 访问,依然获取不到数据。

那就用 selenium 刷新三次页面怎么样:doge:。

Cookie 变化 用 mitmproxy 抓包康康

selenium 开无头模式就不行。不开无头模式可以使用 did 参数。 cookie 没有变化。

我再尝试一下,使用无头模式。

说明返回数据不是用的 url 参数,是根据 cookie 中的数据来获取的。
你每次有新的 url 就先访问下,记录 cookie,再带着 cookie 访问一次拿数据。

我觉得,可能就是对这个 cookie 中的数值进行操作的。刷新三次,发送了好多个请求,我现在在模拟这些请求。

等待时间不够所以为 null 吧,加点延时进去再爬取

带上 cookie did 应该就可以了

回到顶部