[Web自动化] 反爬虫

9.7 反爬虫

9.7.1 反爬虫概念

反爬虫技术是网站为了保护自己的数据不被自动化工具(如爬虫)非法获取而采取的一系列措施。这些措施旨在识别和阻止非正常的访问模式,从而保护网站的数据安全和服务质量。

9.7.2 反爬虫策略及应对

  1. 用户代理(User-Agent)检测 :
    • 反爬虫策略 :网站检查请求头中的 User-Agent 字段,以识别爬虫。
    • 应对方法 :在请求头中设置一个模拟浏览器的 User-Agent。
  2. IP 地址限制 :
    • 反爬虫策略:短时间内同一IP地址发出大量请求会被限制。
    • 应对方法:使用代理服务器或IP池来轮换IP地址。
  3. 速率限制(Rate Limiting) :
    • 反爬虫策略:限制单位时间内的请求数量。
    • 应对方法:降低请求频率,使用分布式爬虫或时间间隔。
  4. 验证码(CAPTCHA) :
    • 反爬虫策略:要求用户输入验证码,以区分人类和机器。
    • 应对方法:人工输入验证码或使用验证码识别服务。
  5. 动态令牌(Dynamic Tokens) :
    • 反爬虫策略:使用动态生成的令牌来验证请求。
    • 应对方法:分析令牌生成机制,自动化获取和提交令牌。
  6. JavaScript 挑战 :
    • 反爬虫策略:使用JavaScript执行复杂操作,难以被爬虫模拟。
    • 应对方法:使用支持JavaScript执行的爬虫工具,如Selenium。
  7. 隐藏资源 :
    • 反爬虫策略:通过JavaScript动态加载数据,不易被简单爬虫抓取。
    • 应对方法:分析AJAX请求,模拟这些请求以获取数据。
  8. 分析请求模式 :
    • 反爬虫策略:分析请求的时间间隔、路径等模式,识别爬虫。
    • 应对方法:模拟正常用户行为,如随机化请求间隔。
  9. HTTP 访问控制(Access-Control) :
    • 反爬虫策略 :通过 Access-Control-Allow-Origin 限制资源访问。
    • 应对方法 :使用API或确保请求的 Origin 与服务器允许的来源匹配。
  10. 服务器端的指纹识别 :
    • 反爬虫策略:分析请求的指纹,如HTTP头信息。
    • 应对方法:隐藏或伪装爬虫的指纹特征。
  11. 会话验证 :
    • 反爬虫策略:要求用户登录或保持会话状态。
    • 应对方法:维护会话状态,处理Cookies和Session。
  12. 地理位置检测 :
    • 反爬虫策略:限制或审查某些地区的访问。
    • 应对方法:使用特定地理位置的代理服务器。
  13. 内容混淆 :
    • 反爬虫策略:在页面中添加混淆元素。
    • 应对方法:分析混淆模式,提取有用信息。
  14. 使用Web应用防火墙(WAF) :
    • 反爬虫策略:识别和阻止恶意请求。
    • 应对方法:遵守正常的HTTP请求模式,避免触发WAF规则。
  15. API 密钥(API Key) :
    • 反爬虫策略:要求使用API密钥验证请求。
    • 应对方法:在请求中正确地传递API密钥。
  16. 动态渲染内容 :
    • 反爬虫策略:内容通过JavaScript动态渲染,不易被抓取。
    • 应对方法:使用工具模拟浏览器行为,等待内容渲染完毕后获取。

9.7.3 反爬虫其它策略应对

使用Selenium绕过网站的反爬虫机制

  • 动态渲染 :
    许多现代网站使用JavaScript动态生成页面内容,这些内容在浏览器加载完成后才出现,传统的HTTP请求无法直接获取。Selenium能够模拟浏览器行为,执行JavaScript,从而获取到这些动态渲染的内容。
  • JavaScript加密 :
    有些网站会对关键数据进行JavaScript加密,防止被抓取。Selenium可以执行JavaScript代码,通过解析加密逻辑或调用解密函数来获取原始数据。
    伪装请求头、使用代理等高级反爬策略
  • 伪装请求头 :
    通过Selenium的webdriver可以修改浏览器的User-Agent等请求头信息,使其看起来像是一个正常的浏览器访问,而非爬虫程序。
  • 使用代理 :
    为了避免因频繁访问而被目标网站封禁IP,可以使用代理服务器来隐藏真实的IP地址。虽然Selenium本身不直接支持代理设置,但可以通过修改浏览器配置或使用第三方库(如selenium-wire)来实现。
    示例代码(使用Selenium和selenium-wire设置代理):
python 复制代码
from seleniumwire import webdriver

# 设置代理
options = {
'proxy': {
 'http': 'http://your-proxy-server:port',
 'https': 'http://your-proxy-server:port',
}
}

# 创建带有代理的webdriver
driver = webdriver.Chrome(seleniumwire_options=options)

# 访问网页
driver.get('http://example.com')

# 获取请求信息
for request in driver.requests:
if request.response:
 print(request.url, request.response.status_code)

driver.quit()
相关推荐
椒哥1 小时前
一天被问几十次"允许",我统计了 517 次,然后写了个插件
前端·javascript·github
风骏时光牛马1 小时前
生成一个AI稳定性治理及疑难问题分析标题,只需要一个标题,不需要其他的任何文本。
前端
荣码1 小时前
长上下文与大文档处理:200页PDF怎么喂给AI,我踩了4个坑
java·python
莫西干式秃头1 小时前
用 AI + threejs 写了个浏览器里的 3D 动作游戏《武来》:砍怪、放技能、开 SU7
前端·人工智能·three.js
kyriewen1 小时前
我测了 6 种防请求竞态的写法:只有 1 种真能打
前端·javascript·程序员
孟健2 小时前
用 WorkBuddy 做个人名片网页,挂上开源设计技能后效果完全不同了
前端·人工智能·ai编程
IT_陈寒2 小时前
SpringBoot自动配置的坑,这次终于爬出来了
前端·人工智能·后端
QXWZ_IA2 小时前
公路边坡裂缝的自动化监测布设
大数据·人工智能·自动化
databook2 小时前
Pandas 与 Polars:语法、性能和资源占用方面的对比
python·数据分析·pandas
威哥爱编程2 小时前
Python 智能体开发实战 10:本地跑得好好的,一并发就崩?把它做成一个能上线的服务
python·agent