Python爬虫实战:应对反爬虫策略的完整指南

## 一、反爬虫机制概述

网站为了保护数据和服务器资源,会部署各种反爬虫策略。了解这些策略是突破限制的第一步。

### 常见反爬手段

| 类型 | 原理 | 难度 |
|——|——|——|
| User-Agent 检测 | 识别非浏览器请求 | ⭐ |
| 频率限制 | 封禁高频 IP | ⭐⭐ |
| Cookie/Session | 需登录才能访问 | ⭐⭐ |
| JavaScript 加密 | 动态生成签名参数 | ⭐⭐⭐ |
| 验证码 | 人机验证 | ⭐⭐⭐ |
| 字体加密 | CSS 字体映射 | ⭐⭐⭐⭐ |

## 二、基础反反爬策略

### 2.1 设置请求头

“`python
import requests

headers = {
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36’,
‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8’,
‘Accept-Language’: ‘zh-CN,zh;q=0.9,en;q=0.8’,
‘Accept-Encoding’: ‘gzip, deflate, br’,
‘Referer’: ‘https://www.google.com/’,
‘Connection’: ‘keep-alive’,
}

response = requests.get(url, headers=headers)
“`

### 2.2 随机 User-Agent 池

“`python
import random

USER_AGENTS = [
‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36’,
‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36’,
‘Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0’,
‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15’,
]

headers[‘User-Agent’] = random.choice(USER_AGENTS)
“`

### 2.3 控制请求频率

“`python
import time
import random

# 固定延时
time.sleep(2)

# 随机延时(更像人类行为)
time.sleep(random.uniform(1, 3))

# 使用 Session 保持连接
session = requests.Session()
session.get(url1)
session.get(url2) # 复用 TCP 连接
“`

## 三、代理 IP 突破频率限制

### 3.1 使用免费代理

“`python
proxies = {
‘http’: ‘http://proxy-ip:port’,
‘https’: ‘https://proxy-ip:port’,
}

response = requests.get(url, proxies=proxies, timeout=10)
“`

### 3.2 代理池管理

“`python
import requests
from itertools import cycle

class ProxyPool:
def __init__(self):
self.proxies = []
self.proxy_cycle = None

def fetch_proxies(self):
“””从代理网站获取免费代理”””
url = ‘https://free-proxy-list.net/’
response = requests.get(url)
# 解析代理列表…
self.proxy_cycle = cycle(self.proxies)

def get_proxy(self):
return next(self.proxy_cycle)

def remove_bad_proxy(self, proxy):
“””移除失效代理”””
self.proxies.remove(proxy)
self.proxy_cycle = cycle(self.proxies)

# 使用
pool = ProxyPool()
pool.fetch_proxies()

for url in urls:
proxy = pool.get_proxy()
try:
response = requests.get(url, proxies={‘http’: proxy}, timeout=10)
except:
pool.remove_bad_proxy(proxy)
“`

## 四、处理 Cookie 与登录

### 4.1 模拟登录

“`python
import requests

session = requests.Session()

# 获取登录页面,获取 CSRF token
login_page = session.get(‘https://example.com/login’)
# 解析 token…

# 提交登录表单
login_data = {
‘username’: ‘your_username’,
‘password’: ‘your_password’,
‘csrf_token’: ‘token_value’,
}

response = session.post(‘https://example.com/login’, data=login_data)

# 登录后访问受保护页面
protected_page = session.get(‘https://example.com/dashboard’)
“`

### 4.2 使用 Selenium 模拟登录

“`python
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get(‘https://example.com/login’)

# 填写表单
driver.find_element(By.NAME, ‘username’).send_keys(‘your_username’)
driver.find_element(By.NAME, ‘password’).send_keys(‘your_password’)
driver.find_element(By.ID, ‘submit’).click()

# 获取登录后的 cookies
cookies = driver.get_cookies()

# 转换为 requests 可用格式
session = requests.Session()
for cookie in cookies:
session.cookies.set(cookie[‘name’], cookie[‘value’])
“`

## 五、处理 JavaScript 加密

### 5.1 分析加密逻辑

“`python
# 打开浏览器开发者工具 -> Network -> 查看请求参数
# 找到 JS 加密函数位置

# 方法一:使用 execjs 执行 JS 代码
import execjs

js_code = ”’
function sign(params) {
// 从网站提取的加密逻辑
return CryptoJS.MD5(params);
}
”’
ctx = execjs.compile(js_code)
sign_value = ctx.call(‘sign’, ‘key=value’)
“`

### 5.2 使用 Selenium/Playwright

“`python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get(url)

# 等待页面加载完成
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, ‘content’))
)

# 获取动态生成的内容
content = driver.find_element(By.CLASS_NAME, ‘content’).text

# 执行 JavaScript
result = driver.execute_script(‘return window.encryptedData;’)
“`

## 六、验证码识别

### 6.1 简单验证码(OCR)

“`python
import pytesseract
from PIL import Image
import requests

# 下载验证码图片
response = requests.get(captcha_url)
with open(‘captcha.png’, ‘wb’) as f:
f.write(response.content)

# OCR 识别
image = Image.open(‘captcha.png’)
code = pytesseract.image_to_string(image)
“`

### 6.2 滑块验证码

“`python
from selenium import webdriver
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()
driver.get(url)

# 定位滑块
slider = driver.find_element(By.CLASS_NAME, ‘slider’)

# 计算滑动距离(需要分析背景图)
distance = 200 # 像素

# 模拟拖动
action = ActionChains(driver)
action.click_and_hold(slider).perform()
action.move_by_offset(distance, 0).perform()
action.release().perform()
“`

## 七、字体加密破解

某些网站使用自定义字体,字符显示为乱码:

“`python
from fontTools.ttLib import TTFont
import requests

# 下载字体文件
font_response = requests.get(font_url)
with open(‘custom.woff’, ‘wb’) as f:
f.write(font_response.content)

# 解析字体映射
font = TTFont(‘custom.woff’)
cmap = font.getBestCmap()

# 建立字符映射表
char_map = {}
for unicode, name in cmap.items():
# 根据字形特征匹配真实字符
char_map[chr(unicode)] = ‘真实字符’

# 替换加密字符
def decrypt(text):
return ”.join(char_map.get(c, c) for c in text)
“`

## 八、最佳实践

1. **遵守法律法规**:不爬取个人隐私、商业机密
2. **尊重 robots.txt**:检查网站爬虫协议
3. **合理控制频率**:避免对服务器造成压力
4. **数据脱敏处理**:不公开他人敏感信息
5. **及时更新策略**:网站反爬机制会升级

## 九、总结

反爬虫与反反爬虫是持续博弈的过程。核心原则:

– 模拟真实用户行为
– 分布式降低单 IP 压力
– 保持耐心,持续迭代

记住:技术要用在正当途径,爬虫不是黑客工具。

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
4爷资源网 » Python爬虫实战:应对反爬虫策略的完整指南

提供最优质的资源集合

立即查看 了解详情