Python爬虫遇到在浏览器中刷新三次页面才能打开的网站,如何解决?
爬虫遇到在浏览器中刷新三次页面才能打开的网站怎么办,第一次刷新,粉丝,关注,作品全是 null,第二次也是 null,第三次刷新才能拿到具体的数值,有大佬分享下思路吗? https://live.kuaishou.com/profile/3xsm4gufvu5cfhm
Python爬虫遇到在浏览器中刷新三次页面才能打开的网站,如何解决?
这是快手的个人信息页面
遇到这种需要多次刷新才能加载的网站,通常是因为服务器设置了反爬机制,比如检测首次请求的请求头、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)} 字符的内容")
代码说明:
- 会话管理:使用
requests.Session()保持Cookie和连接状态 - 请求头设置:完整模拟浏览器的请求头,特别是User-Agent
- 重试机制:通过
Retry和HTTPAdapter实现自动重试 - 访问流程:明确进行三次访问,模拟刷新行为
- 错误处理:包含基本的异常捕获和状态码检查
如果这个方案不行,可能需要:
- 检查网站是否要求特定的Referer
- 查看是否有JavaScript生成的内容(可能需要Selenium)
- 分析网络请求看是否有额外的验证步骤
总结:模拟完整浏览器会话是关键。
设置 cookie 就行了啊
自己尝试的第一次访问,返回 did,第二次,第三次带着 did 使用 session 访问,依然获取不到数据。
那就用 selenium 刷新三次页面怎么样:doge:。
Cookie 变化 用 mitmproxy 抓包康康
selenium 开无头模式就不行。不开无头模式可以使用 did 参数。 cookie 没有变化。
我再尝试一下,使用无头模式。
说明返回数据不是用的 url 参数,是根据 cookie 中的数据来获取的。
你每次有新的 url 就先访问下,记录 cookie,再带着 cookie 访问一次拿数据。
我觉得,可能就是对这个 cookie 中的数值进行操作的。刷新三次,发送了好多个请求,我现在在模拟这些请求。
等待时间不够所以为 null 吧,加点延时进去再爬取
带上 cookie did 应该就可以了

