[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()
相关推荐
IT_陈寒1 天前
SpringBoot自动配置揭秘:5个让开发效率翻倍的隐藏技巧
前端·人工智能·后端
Moment1 天前
前端工程化 + AI 赋能,从需求到运维一条龙怎么搭 ❓❓❓
前端·javascript·面试
紫丁香1 天前
pytest_自动化测试3
开发语言·python·功能测试·单元测试·集成测试·pytest
杰杰7981 天前
Python面向对象——类的魔法方法
开发语言·python
Joker Zxc1 天前
【前端基础(Javascript部分)】6、用JavaScript的递归函数和for循环,计算斐波那契数列的第 n 项值
开发语言·前端·javascript
Highcharts.js1 天前
React 图表如何实现下钻(Drilldown)效果
开发语言·前端·javascript·react.js·前端框架·数据可视化·highcharts
橙露1 天前
Webpack/Vite 打包优化:打包体积减半、速度翻倍
前端·webpack·node.js
chushiyunen1 天前
python中的魔术方法(双下划线)
前端·javascript·python
深蓝轨迹1 天前
@Autowired与@Resource:Spring依赖注入注解核心差异剖析
java·python·spring·注解
人工智能AI技术1 天前
Python 3.14.3更新!内存优化与安全补丁实战应用
python