在爬虫初学阶段,我们常常使用 requests
和 BeautifulSoup
就能轻松抓取网页数据。但当目标网站对爬虫设置了各种“反爬虫机制”时,简单的方法往往无效,甚至直接被封禁 IP 或跳转到验证页面。
本篇文章将深入讲解 常见的反爬虫机制类型,并配合 Python 解决策略与代码实例,帮助你掌握破解反爬的核心技巧,提升数据抓取成功率与稳定性。
反爬类型 | 说明 | 举例网站 |
---|---|---|
User-Agent 限制 | 屏蔽默认爬虫UA请求 | 百度、知乎 |
Referer 校验 | 拒绝无来源请求 | B站、头条 |
Cookie 校验 | 无登录态不给数据 | 微博、知乎 |
IP封锁/频率限制 | 多次访问后封IP | 豆瓣、淘宝 |
JavaScript 渲染 | 内容由JS生成,HTML中无数据 | 京东、B站 |
验证码 / 滑块 | 弹窗验证身份 | 抖音、微博 |
动态参数/加密接口 | 请求中参数加密,需还原算法 | 百度指数、快手 |
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Referer": "https://www.example.com"
}
requests.get(url, headers=headers)
可使用 fake_useragent
自动生成随机 UA:
pip install fake-useragent
from fake_useragent import UserAgent
ua = UserAgent()
headers = {"User-Agent": ua.random}
登录后手动复制浏览器 Cookie,再在请求中添加:
cookies = {
"SUB": "xxxxxxx",
"other": "xxxxx"
}
res = requests.get(url, headers=headers, cookies=cookies)
也可以使用 requests.Session()
自动维护登录态。
import time
import random
for i in range(10):
res = requests.get(url)
time.sleep(random.uniform(1, 3)) # 随机延迟,模拟正常访问
或使用 retrying
模块进行失败重试:
pip install retrying
from retrying import retry
@retry(stop_max_attempt_number=5, wait_fixed=2000)
def fetch():
return requests.get(url)
proxies = {
"http": "http://123.123.123.123:8888",
"https": "https://123.123.123.123:8888"
}
requests.get(url, headers=headers, proxies=proxies)
代理 IP 推荐来源:
proxy_pool
项目)pip install selenium
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.bilibili.com")
time.sleep(5)
html = driver.page_source
driver.quit()
配合 BeautifulSoup
解析动态加载的 HTML。
可使用 selenium
模拟滑动行为,也可以借助 AI 模型识别验证图:
from selenium.webdriver import ActionChains
slider = driver.find_element_by_id("slider")
action = ActionChains(driver)
action.click_and_hold(slider).move_by_offset(200, 0).release().perform()
若遇到极验、腾讯防水墙等复杂验证码,建议使用:
有些接口参数是加密的,比如:
/api/data?sign=xxxxx&time=yyy
PyExecJS
执行 JavaScript 算法pip install PyExecJS
import execjs
js_code = open("encrypt.js", "r").read()
ctx = execjs.compile(js_code)
sign = ctx.call("getSign", "keyword")
这种方式适合有一定 JS 基础的开发者。
创建一个类,封装常用的 UA、Cookie、延迟、重试、代理等逻辑:
class SpiderClient:
def __init__(self):
self.session = requests.Session()
self.ua = UserAgent()
def get(self, url, use_proxy=False):
headers = {"User-Agent": self.ua.random}
proxies = {"http": "http://xxx"} if use_proxy else None
try:
res = self.session.get(url, headers=headers, proxies=proxies, timeout=10)
time.sleep(random.uniform(1, 3))
return res
except Exception as e:
print("请求失败:", e)
return None
工具 | 用途 |
---|---|
Charles / Fiddler | 抓包分析请求 |
mitmproxy | HTTPS 抓包神器 |
browsermob-proxy + selenium | 自动抓包 |
PyExecJS | 执行 JS 加密算法 |
Playwright | 替代 Selenium,更稳定 |
反爬虫并不可怕,关键在于理解目标网站的访问逻辑,找到可“模拟人类行为”的方式:
✅ 模拟浏览器访问
✅ 限速 + 随机 UA
✅ 登录态 + Cookie
✅ 动态分析接口 + 加密破解
✅ 自动化工具辅助(如 Selenium、Playwright)
掌握反爬机制,不仅能提升你的数据采集能力,还能拓展你在数据分析、AI训练和信息整合等方面的资源获取能力。未来我们还会讲解: