越来越多的网站部署了反爬机制,导致数据抓取难度显著增加。常见的反爬手段主要包括动态加载、登录验证、IP 频率限制以及数据隐藏等。爬虫与反爬虫技术始终处于博弈状态,掌握有效的反反爬策略是数据工程师必备的技能。
一般网站主要从以下三个方面实施反爬:
- 用户请求的 Headers
- 用户行为特征
- 网站目录结构和数据加载方式
前两种最为常见,第三种多见于采用 AJAX 或 JavaScript 动态渲染的应用,增加了静态爬虫的难度。
一、从用户请求的 Headers 反爬虫
Headers 是 HTTP 请求的重要组成部分,包含浏览器类型、操作系统、来源页面等信息。许多网站通过检测 User-Agent 和 Referer 来识别非浏览器流量。
1. User-Agent 伪装
User-Agent 标识了客户端身份。爬虫默认使用 Python 库的标识,容易被识别。解决方案是将 User-Agent 修改为主流浏览器的字符串。
import urllib.request
url = 'http://www.baidu.com'
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'
}
req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
print(html[:500])
2. Referer 防盗链
部分资源站(如图片、视频下载)会检查 Referer 字段,确保请求来自允许的域名。在代码中模拟正确的 Referer 值即可绕过。
3. Cookie 管理
某些网站需要携带特定的 Session ID 才能访问内容。可以通过 requests 库的 Session 对象自动管理 Cookie,保持会话状态。
import requests
session = requests.Session()
resp = session.get('https://example.com/login', data={'user': 'admin'})
# 后续请求会自动携带登录后的 Cookie
resp = session.get('https://example.com/profile')
二、基于用户行为反爬虫
网站服务器会监控 IP 地址的请求频率和账户操作行为。短时间内大量重复请求会导致 IP 被封禁或触发验证码。
1. IP 代理池
使用代理 IP 可以有效分散请求来源。建议维护一个代理 IP 列表,每次请求随机切换。
import urllib.request
import random
proxy_list = [
'http://121.193.143.249:88',
'http://112.126.65.193:88',
'http://122.96.59.184:82'
]
proxy_url = random.choice(proxy_list)
proxy_support = urllib.request.ProxyHandler({: proxy_url})
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)
:
response = urllib.request.urlopen()
html = response.read().decode()
(html)
Exception e:
()


