本文目录导读:

爬虫访问受限通常是因为网站设置了反爬机制,解决方案可以从简单到复杂分为几个层级,建议按顺序尝试:
最基本的伪装(绕过初级反爬)
这是最容易被忽略但最有效的步骤:
- 设置合理的 User-Agent:不要用默认的
Python-urllib/3.x,伪装成常见浏览器。- 推荐:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36... - 进阶:准备一个 User-Agent 池,每次请求随机切换。
- 推荐:
- 添加 Referer 头:模拟从站内链接或搜索引擎点击过来。
- 添加 Cookie:部分网站需要先访问首页获得初始 Cookie,再访问目标页面。
- 控制请求频率:在每次请求之间加上
time.sleep(2)或随机延迟 1-5 秒,这是最温柔也是最有效的反屏蔽手段。
应对中级反爬(请求特征检测)
如果单纯伪装失效,网站可能检测了请求的连贯性或行为模式:
- 使用 IP 代理池:当单个 IP 请求过多被限制,轮换 IP 是最直接的办法。
- 免费方案:网上有很多免费代理列表(如快代理、西刺代理),但质量低、寿命短。
- 付费方案:购买动态住宅代理(如 芝麻、小象、熊猫代理),价格稍贵但稳定,适合高难度网站。
- 构建自建池:如果带宽够,可以购买云主机搭建 Squid 或 tinyproxy 代理池。
- 保持 Session 一致性:使用
requests.Session()或者其他框架的会话对象,自动维持 Cookie 和连接池。 - 随机化请求时间:不要固定 2 秒一次,而是
random.uniform(1.5, 3.5)秒一次。 - 模仿浏览器行为:发送完整的请求头(Accept、Accept-Encoding、Accept-Language、Upgrade-Insecure-Requests 等)。
应对高级反爬(浏览器指纹、JS 加密、验证码)
当网站使用更复杂的反爬技术时,需要更重的解决方案:
- 使用 Headless 浏览器(Selenium/Playwright/Puppeteer):这是目前最常用、最保险的方案,它像真人一样操作浏览器,自然通过了浏览器指纹检测。
- 注意:即使这样也要做好伪装(如设置
window.navigator.webdriver为 false,关闭自动化控制特征)。 - 性能:比普通 HTTP 请求慢得多,适合少量页面或需要点击、滚动的页面。
- 替代方案:Playwright 性能比 Selenium 好,推荐用于复杂网站。
- 注意:即使这样也要做好伪装(如设置
- 处理 JS 渲染和加密:如果网站数据是通过 Ajax 异步加载且参数经过签名(如
token、sign、hash),单纯渲染整个页面太笨重。- 逆向 JS:分析加密逻辑,用 Python 重写。
- 使用第三方工具:如
pywasm执行 WebAssembly,或使用js2py/execjs执行 JS 代码。 - 抓取接口:直接找到返回 JSON 数据的真实 API 接口(通常在 Chrome DevTools 的 Network 里,过滤 XHR/Fetch)。
- 验证码解决方案:
- 简单图文验证码:使用
ddddocr(一个开箱即用的免费OCR库)。 - 滑块/点选:使用第三方打码平台(如 超级鹰、YesCaptcha、2Captcha),按次收费。
- 极验/字体反爬:需要专门算法破解或绕过。
- 简单图文验证码:使用
终极建议:换个思路
既然爬不动,不如想想是不是可以不爬:
- 寻找官方 API:很多网站(GitHub、知乎、豆瓣)有公开或半公开的 API,在页面 Network 里过滤
.json、.js、.php(如果返回 JSON 格式),这是最高效、最合法的途径。 - 使用 RSS / 站点地图:有些网站提供新闻/博客的 RSS 源或
sitemap.xml。 - 协商数据合作:如果是商业用途,直接联系网站购买数据或申请 API 权限。
从轻到重的解决路径
- 先检查是不是自己的问题:User-Agent、Cookie、请求头、频率,70% 的问题出在这。
- 换 IP + 降低频率:加个代理池,慢一点爬。
- 用 Headless 浏览器模拟:Selenium/Playwright 解决 90% 的 JS 渲染问题。
- 逆向 JS 或打码:针对加密参数和验证码。
- 找官方 API:如果可能的话。
注意法律和道德边界:爬取公开数据通常没问题,但不要爬取非公开页面(需登录且非授权)、不要对服务器造成压力(如并发过高)、不要违反 robots.txt 的显式禁止(如 Disallow: /)——尤其是 Disallow: / 时,虽然技术上可以突破,但法律风险很高,建议先用 curl -v 或者浏览器开发者工具看看具体返回的状态码和错误信息,能更精确地判断问题类型。
标签: 请求伪装
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。