使用Python requests爬取网站时如何绕过此类计数式付费墙?
问题根源
这类靠新开无痕窗口就能重置免费额度的付费墙,核心判断逻辑是基于会话Cookie存储免费文章阅读计数:新无痕窗口每次启动都会生成完全独立的空Cookie环境,无历史访问记录,网站会判定为全新访客,分配单篇免费阅读额度。
用requests请求时如果复用同一会话Cookie,第一次请求后网站就会把已读计数写入返回的Cookie,后续请求携带计数超标的Cookie发起访问,就会直接返回订阅提示。
可直接落地的解决方法
- 不要使用
requests.Session()维持会话,Session对象会自动持久化、携带所有历史请求的Cookie,正好触发付费墙的计数规则。每次发起文章请求时都使用全新的、无历史Cookie的请求上下文,等价于手动新开一个无痕窗口。 - 每次请求配置真实的浏览器User-Agent,不要用requests默认的
python-requests/xx.xx.xx标识,避免被直接识别为爬虫拦截。 - 如果重置Cookie后依然触发付费墙,可以在每次请求之间加2-5秒的随机间隔,偶尔轮换请求头里的User-Agent,绕过简单的IP维度短时间访问频次校验。
参考实现代码
import requests import time import random from bs4 import BeautifulSoup # 待爬取的文章列表 article_urls = [ "替换为你的目标文章链接1", "替换为你的目标文章链接2", "替换为你的目标文章链接3" ] # 轮换UA池,模拟不同的无痕窗口环境 user_agents = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0" ] for url in article_urls: # 每次请求随机选UA,不带任何历史Cookie headers = {"User-Agent": random.choice(user_agents)} resp = requests.get(url, headers=headers, timeout=10) resp.encoding = resp.apparent_encoding soup = BeautifulSoup(resp.text, "html.parser") # 在这里插入你的正文提取逻辑 # 例:print(soup.select_one("article .content").text.strip()) # 随机间隔,避免触发频次拦截 time.sleep(random.uniform(2,5))
注意:不要手动把上一次请求响应里的
Set-Cookie内容传入下一次请求,否则会重新带上阅读计数标记,导致付费墙触发。
内容的提问来源于stack exchange,提问作者xhuliano
相关产品推荐
相关产品推荐

