最新Python爬虫从入门到精通:静态爬取+JS逆向+反爬绕过实战教程
前言
在大数据时代,数据采集是数据分析、人工智能、商业决策的基础环节。Python 凭借简洁的语法、丰富的第三方库,成为爬虫开发的首选语言。但对于大多数初学者而言,往往停留在静态网页爬取阶段,面对当下网站普遍存在的异步加载、参数加密、IP 限制、签名校验等反爬机制时,常常束手无策。
小知识:据调研,目前超过85%的主流网站采用了至少一种反爬手段,其中动态接口和参数加密占比最高。这意味着掌握逆向爬虫技术已成为爬虫工程师的核心竞争力。
本文将以真实网站数据爬取 为实战目标,遵循「零基础入门 → 环境搭建 → 静态爬取 → 动态接口分析 → JS 逆向加密 → 完整爬虫实现 → 反爬绕过 → 数据存储」的完整路径,由浅入深、从理论到实战,带你真正实现 Python 爬虫从入门到精通。全文包含详细原理、逐行注释代码、常见报错解决方案,可直接复制运行,兼顾新手入门与进阶提升。
重要声明 :本文仅用于网络爬虫技术学习与交流,严格遵守《网络安全法》《数据安全法》等法律法规,遵守网站 robots 协议。严禁将本文技术用于非法爬取、商业牟利、侵犯他人数据权益、破坏网站正常运行等违法违规行为,一切违规使用后果自负。
一、爬虫前置基础认知
1.1 什么是网络爬虫
网络爬虫又称为网页蜘蛛、网络机器人,是一种按照一定规则,自动抓取互联网信息的程序或脚本。简单来说,就是模拟浏览器发送请求,获取网页数据并进行提取、清洗、存储的自动化工具。
爬虫工作的三个核心步骤:
1. 请求发送:构造HTTP请求(URL、请求头、请求体等),向目标服务器发起访问。
2. 数据获取:接收服务器返回的响应(HTML、JSON、XML、图片等二进制数据)。
3. 解析与存储:从响应中提取所需字段,经过清洗、去重、结构化后存入文件或数据库。
1.2 爬虫能做什么
- 数据采集:新闻资讯、商品价格、行业数据、论坛帖子等;
- 数据分析:为机器学习、深度学习提供数据集;
- 自动化办公:批量下载文件、自动填报、自动抓取报表;
- 行业监测:竞品数据跟踪、舆情监控、价格监控;
- 搜索引擎:百度、谷歌等均依靠大规模爬虫实现数据收录。
实战案例:某电商价格监控爬虫每天定时抓取竞品SKU价格,当价格低于阈值时自动发送邮件通知采购团队,帮助企业在双11前调整定价策略,单月节省成本超20万元。
1.3 爬虫分类
| 类型 | 原理 | 适用场景 | 技术栈 | 难度 |
|---|---|---|---|---|
| 静态爬虫 | 直接解析HTML源码 | 无异步、无加密的旧式网站 | requests + BeautifulSoup | ★☆☆☆☆ |
| 动态爬虫 | 分析Ajax/Fetch接口,模拟请求 | 数据通过JSON接口返回,但无加密或弱加密 | requests + json + 抓包分析 | ★★★☆☆ |
| 逆向爬虫 | 破解前端JS加密、签名算法 | 接口参数加密、响应密文、防重放机制 | js2py、PyExecJS、Node.js | ★★★★☆ |
| 模拟浏览器爬虫 | 驱动真实浏览器执行 | 页面交互复杂、需执行JS、绕过简单反爬 | Selenium、Playwright | ★★☆☆☆ |
专家建议:不要一上来就使用模拟浏览器(Selenium),它虽然简单但资源消耗大、速度慢,且容易被高级反爬(如指纹检测)识别。优先尝试接口分析+逆向,实在无法破解时再考虑模拟浏览器。
1.4 必须了解的 HTTP 基础
- 请求方法:GET(获取数据)、POST(提交数据)、PUT(更新)、DELETE(删除)
- 请求头:User-Agent、Referer、Origin、Cookie 等校验信息
- 响应状态码:200 成功、301/302 重定向、403 禁止访问、404 页面不存在、500 服务器错误、503 服务不可用
- 常见数据格式:HTML、JSON、XML、密文数据
状态码详解:
- 200 OK:请求成功,正常返回数据。
- 301 Moved Permanently / 302 Found:资源临时或永久转移,爬虫应跟随Location头。
- 403 Forbidden:服务器理解请求但拒绝执行,通常是因为缺少合法Cookie、签名错误或IP被封。
- 429 Too Many Requests:请求频率过高,被限流,需要降低频率或使用代理。
- 5xx:服务器内部错误,可能是反爬机制触发或真实故障,建议延时后重试。
二、开发环境完整搭建
2.1 Python 环境安装
推荐使用 Python 3.8~3.11 版本,兼容绝大多数爬虫库,避免版本过高导致库不支持。安装时勾选 Add Python to PATH,自动配置环境变量。
虚拟环境建议(避免库版本冲突):
# 创建虚拟环境 python -m venv spider_env # 激活(Windows) spider_env\Scripts\activate # 激活(Mac/Linux) source spider_env/bin/activate
验证安装:
python --version pip --version
2.2 爬虫核心第三方库安装
打开 CMD 执行以下命令,使用清华镜像加速安装:
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple pip install beautifulsoup4 lxml -i https://pypi.tuna.tsinghua.edu.cn/simple pip install pyexecjs -i https://pypi.tuna.tsinghua.edu.cn/simple pip install fake-useragent -i https://pypi.tuna.tsinghua.edu.cn/simple pip install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple pip install pandas openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
各库用途一览:
| 库名 | 用途 | 备注 |
|------|------|------|
| requests | 发送HTTP请求,获取响应 | 最常用的网络请求库 |
| beautifulsoup4 | 解析HTML/XML,提取数据 | 适合静态页面 |
| lxml | 高性能解析器,支持XPath | 比BeautifulSoup自带的解析器更快 |
| pandas | 数据清洗与存储(Excel/CSV) | 数据分析标配 |
| execjs | 在Python中调用JS代码 | 逆向必备,需配合Node.js |
2.3 Node.js 环境安装
JS 逆向需要执行前端加密代码,依赖 Node.js 环境。下载地址:https://nodejs.org/ 安装 LTS 版本。
验证安装:
node -v npm -v
安装 crypto-js 用于加密算法:
npm install crypto-js
2.4 抓包工具准备
使用 Chrome 浏览器自带开发者工具,快捷键 F12 或 Ctrl+Shift+I。核心面板:
- Element:查看网页结构;
- Network:抓包分析接口;
- Source:查看前端 JS 代码;
- Console:调试 JS 代码。
进阶抓包工具(可选):
- Fiddler:Windows平台经典抓包工具,可拦截和修改请求。
- Charles:跨平台,支持手机APP抓包(需设置代理)。
- mitmproxy:命令行交互式抓包,适合集成到自动化脚本。
三、入门阶段:静态网页爬虫实战
静态网页数据直接存在 HTML 中,无需处理加密与异步,适合新手入门。
3.1 静态爬虫核心流程
- 构造请求头,模拟浏览器访问;
- 发送 GET 请求,获取网页源码;
- 使用 BeautifulSoup 解析 HTML;
- 提取标题、链接、时间等目标数据;
- 数据清洗与简单存储。
请求头详解:
- User-Agent:告诉服务器你是什么浏览器/设备。许多网站会拒绝非浏览器UA的请求,必须伪造。
- Referer:告诉服务器你从哪个页面跳转过来,部分网站用于防盗链。
- Accept-Encoding:是否接受压缩响应(gzip等),建议保留让requests自动解压。
- Cookie:维持登录状态或会话标识,后续会用到。
3.2 完整静态爬虫代码
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import time
# 随机请求头
ua = UserAgent()
headers = {
"User-Agent": ua.random,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive"
}
def static_spider(url):
try:
# 发送请求
resp = requests.get(url, headers=headers, timeout=10)
if resp.status_code != 200:
print(f"请求失败,状态码:{resp.status_code}")
return []
# 编码处理,解决乱码
resp.encoding = resp.apparent_encoding
soup = BeautifulSoup(resp.text, "lxml")
# 数据存储列表
data_list = []
# 示例提取规则(根据实际页面修改)
items = soup.find_all("div", class_="list-item")
for item in items:
title = item.find("a").get_text(strip=True)
link = item.find("a")["href"]
publish_time = item.find("span", class_="time").get_text(strip=True)
data = {
"标题": title,
"链接": link,
"发布时间": publish_time
}
data_list.append(data)
return data_list
except Exception as e:
print(f"爬取异常:{str(e)}")
return []
if __name__ == "__main__":
target_url = "https://xxx.xxx.com/news" # 替换为目标静态地址
result = static_spider(target_url)
for i, item in enumerate(result, 1):
print(i, item)
3.3 静态爬虫局限性
- 无法获取异步加载数据;
- 无法处理加密参数与加密数据;
- 容易被基础反爬识别,无 IP 防护、无签名机制。
想要爬取主流网站,必须进入动态接口与逆向阶段。
3.4 静态爬虫 vs 动态爬虫对比表
| 对比维度 | 静态爬虫 | 动态爬虫(含逆向) |
|---|---|---|
| 数据位置 | 直接嵌入HTML源码 | 通过Ajax/Fetch接口返回JSON |
| 是否需要分析接口 | 不需要 | 必须抓包分析URL和参数 |
| 是否处理加密 | 不需要 | 需要破解sign、token等 |
| 请求频率限制 | 较宽松 | 非常严格,容易封IP |
| 代表性网站 | 旧版博客、政府信息公开 | 电商、短视频、社交平台 |
四、进阶阶段:动态接口抓包分析
现代网站 90% 数据通过接口异步加载,数据不在 HTML 中,而是通过 JSON 返回。
4.1 抓包步骤
- 打开目标网站 → F12 → Network;
- 勾选 Preserve log(保留日志,防止页面刷新时清空)、筛选 XHR/Fetch;
- 刷新页面或翻页,查看出现的接口;
- 查看接口 URL、请求方法、参数、响应。
抓包技巧:
- 使用 Ctrl+E 清空现有日志,避免干扰。
- 点击接口后,关注 Headers 中的 Request URL、Request Method、Request Headers 以及 Payload(POST参数)。
- 如果响应是密文(乱码或Base64),说明需要解密。
- 尝试在 Initiator 列点击调用栈,可以直接跳转到发起该请求的JS代码行。
4.2 典型加密接口结构
接口地址 :https://api.xxx.com/api/v1/data/list请求方式 :POST请求参数 :
{
"page": 1,
"size": 20,
"timestamp": 1743000000,
"nonce": "x927s1",
"sign": "7a2f9d4e8b1c3e5f0a6b7d8c9e0f1a2b"
}响应内容 :
{
"code": 0,
"msg": "success",
"data": "加密字符串一串"
}4.3 反爬特征分析
- timestamp:时间戳,防止旧请求重复使用;
- nonce:随机字符串,防止请求重复;
- sign:签名,核心加密参数;
- data:返回密文,需 AES 等方式解密。
直接请求会返回:签名错误、参数非法、请求过期、无权限。
术语解释:
- 时间戳(timestamp):从1970年1月1日至今的秒数(或毫秒数)。服务器会校验时间差是否在允许范围内(如5分钟),超时则拒绝。
- 随机数(nonce):每次请求生成唯一字符串,服务器会缓存已使用的nonce,防止重放攻击。
- 签名(sign):将请求参数(包括timestamp、nonce等)按一定顺序拼接后,进行MD5、SHA256或HMAC运算得到的字符串。服务器用相同算法计算并比对,防止参数被篡改。
五、精通阶段:JS 逆向破解加密
JS 逆向是爬虫高薪核心技能,本质是找到前端加密逻辑,用 Python 还原。
5.1 定位加密 JS 代码
- 在 Network 面板 Ctrl+F 搜索 sign、encrypt、md5、aes;
- 在 Source 面板查找混淆 / 压缩的 JS 文件;
- 使用断点调试,查看参数生成过程。
常用定位技巧:
- 搜索关键字:除了sign,还可以搜 hash、token、secret、key、param。
- XHR断点:在Sources面板的XHR/fetch Breakpoints中添加接口URL包含的关键字,当请求发出时会自动断下。
- 事件监听断点:在Sources右侧的Event Listener Breakpoints中勾选 click、timer 等,适合反调试场景。
- Hook技术:对于被封装很深的加密函数,可以重写 window.btoa、window.atob 等常用编码函数,打印调用栈。
5.2 典型加密逻辑(真实通用)
// 生成签名
function makeSign(page, timestamp, nonce){
let key = "spider123456abcdef";
let str = `page=${page}&t=${timestamp}&nonce=${nonce}&key=${key}`;
return md5(str);
}
// 随机字符串
function nonceStr(){
let chars = "0123456789abcdef";
let res = "";
for(let i=0;i<6;i++){
res += chars[Math.floor(Math.random()*chars.length)]
}
return res;
}
// AES解密
function decrypt(data){
let key = CryptoJS.enc.Utf8.parse("1234567890123456");
let iv = CryptoJS.enc.Utf8.parse("abcdef1234567890");
let decrypted = CryptoJS.AES.decrypt(data, key, {
iv:iv,
mode:CryptoJS.mode.CBC,
padding:CryptoJS.pad.Pkcs7
});
return decrypted.toString(CryptoJS.enc.Utf8);
}常见加密算法对比:
| 算法 | 类型 | 特点 | 逆向难度 |
|------|------|------|----------|
| MD5 | 哈希(不可逆) | 速度快,常用于签名校验 | 低(直接调用库即可) |
| SHA1/SHA256 | 哈希 | 更安全,输出长度更长 | 低 |
| AES | 对称加密 | 需要密钥key和iv偏移量,可加解密 | 中(需找到key和iv) |
| RSA | 非对称加密 | 公钥加密,私钥解密,无法逆向还原私钥 | 高(通常需要模拟加密,无法解密) |
| Base64 | 编码(非加密) | 可逆,常配合其他算法使用 | 极低 |
注意事项:不要试图“破解”RSA私钥,这是不可能的。正确做法是找到前端加密函数,直接调用它加密参数后提交,或者使用Python的rsa库加载公钥进行模拟加密。
六、终极实战:完整逆向爬虫(可直接运行)
整合所有技术,实现可落地的加密接口爬虫。
6.1 完整源码
# -*- coding: utf-8 -*-
import execjs
import requests
import time
import json
import pandas as pd
from fake_useragent import UserAgent
# ==================== JS 加密代码 ====================
js_code = """
const CryptoJS = require('crypto-js');
function makeSign(page, timestamp, nonce){
let key = "spider123456abcdef";
let str = `page=${page}&t=${timestamp}&nonce=${nonce}&key=${key}`;
return CryptoJS.MD5(str).toString();
}
function nonceStr(){
let chars = "0123456789abcdef";
let res = "";
for(let i=0;i<6;i++){
res += chars[Math.floor(Math.random()*chars.length)]
}
return res;
}
function decrypt(data){
let key = CryptoJS.enc.Utf8.parse("1234567890123456");
let iv = CryptoJS.enc.Utf8.parse("abcdef1234567890");
let decrypted = CryptoJS.AES.decrypt(data, key, {
iv:iv,
mode:CryptoJS.mode.CBC,
padding:CryptoJS.pad.Pkcs7
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
"""
# ==================== 初始化环境 ====================
ctx = execjs.compile(js_code)
ua = UserAgent()
headers = {
"User-Agent": ua.random,
"Content-Type": "application/json;charset=UTF-8",
"Origin": "https://xxx.com",
"Referer": "https://xxx.com/",
"Accept": "application/json, text/plain, */*"
}
# 目标接口
api = "https://api.xxx.com/api/v1/data/list"
# ==================== 核心爬虫函数 ====================
def crawl(page):
try:
# 构造加密参数
t = int(time.time())
nonce = ctx.call("nonceStr")
sign = ctx.call("makeSign", page, t, nonce)
data = {
"page": page,
"size": 20,
"timestamp": t,
"nonce": nonce,
"sign": sign
}
# 发送请求
resp = requests.post(api, headers=headers, json=data, timeout=15)
if resp.status_code != 200:
print(f"第{page}页请求失败")
return None
res = resp.json()
if res.get("code") != 0:
print(f"错误:{res.get('msg')}")
return None
# 解密密文
cipher = res.get("data")
raw_data = ctx.call("decrypt", cipher)
return json.loads(raw_data)
except Exception as e:
print(f"异常:{str(e)}")
return None
# ==================== 批量爬取 + 保存 ====================
def run():
all_data = []
# 爬取 5 页
for page in range(1, 6):
print(f"正在爬取第 {page} 页")
page_data = crawl(page)
if page_data:
all_data.extend(page_data)
time.sleep(1)
# 保存 Excel
df = pd.DataFrame(all_data)
df.to_excel("爬虫结果.xlsx", index=False)
print("爬取完成,已保存为 爬虫结果.xlsx")
if __name__ == "__main__":
run()
6.2 代码说明
- 内置完整 JS 加密逻辑,无需外部文件;
- 自动生成时间戳、随机串、签名;
- 自动解密接口返回密文;
- 批量爬取多页并保存为 Excel;
- 自带延时,降低反爬风险。
代码执行注意事项:
- 如果遇到 execjs._exceptions.ProgramError,请确保Node.js已安装且crypto-js库已全局安装(npm install -g crypto-js)。
- 部分网站会对执行环境做检测(如检测navigator.webdriver),此时可以改用 PyExecJS + 本地JS文件,或直接使用 subprocess 调用Node命令执行加密。
- 对于更复杂的JS混淆(如obfuscator、JScrambler),建议将整个加密函数抠出来,补全依赖后单独运行。
七、常见反爬绕过方案
7.1 IP 被封
- 增加延时 time.sleep(1~3)
- 使用代理 IP
proxies = {
"http": "http://ip:port",
"https": "https://ip:port"
}
requests.post(..., proxies=proxies)
代理IP来源:
- 免费代理:从 https://free-proxy-list.net/ 等网站获取(可用性低,不稳定)。
- 付费代理:芝麻代理、快代理、阿布云等,提供高匿、高可用代理,按流量或时间收费。
- 自建代理池:购买多台云服务器,部署代理转发服务。
7.2 Cookie 验证
- 登录后复制 Cookie 加入 headers
- 使用 requests.Session() 维持登录态
Session的用法:
session = requests.Session() # 第一次请求登录接口,获取Cookie session.post(login_url, data=login_data) # 后续所有请求都会自动携带Cookie resp = session.get(target_url)
7.3 签名频繁失效
- JS 代码可能更新,重新抓包替换;
- 检查时间戳是否为秒级 / 毫秒级。
额外建议:将签名算法独立成一个可配置模块,当网站更新加密时只需修改该模块,无需重写整个爬虫。同时添加异常捕获,当签名校验失败时自动触发重新抓取JS逻辑。
7.4 请求频率限制
- 单线程慢速爬取
- 随机延时(1~5秒)
- 避免高并发
更优雅的限流方案:使用 ratelimit 库或自定义装饰器:
from ratelimit import limits, sleep_and_retry
@sleep_and_retry
@limits(calls=5, period=60) # 每分钟最多5次
def fetch(url):
return requests.get(url)7.5 验证码识别
- 简单图形验证码:使用 ddddocr(带带弟弟OCR)库免费识别,准确率尚可。
- 滑动验证码:可尝试使用 OpenCV 计算缺口距离,配合 Selenium 模拟滑动。但商业级验证码(如极验)需要更复杂的轨迹模拟或第三方打码平台。
- 专业打码平台:超级鹰、图鉴等,付费解决,价格低廉。
八、爬虫规范与法律边界
8.1 合法爬虫原则
- 遵守 robots.txt 协议;
- 不爬取隐私数据、金融数据、未公开数据;
- 不用于商业用途、不恶意攻击服务器;
- 控制频率,不造成服务器压力。
robots.txt示例:访问 https://example.com/robots.txt 可以看到网站允许哪些爬虫路径:
User-agent: * Disallow: /admin/ Disallow: /api/private/ Allow: /public/
专家建议:即使robots.txt允许,也应主动设置延时。一些网站虽然没有法律禁止,但会在后端风控系统中标记高频IP。建议将爬取速率控制在每秒1~2次以下。
8.2 禁止行为
- 破解登录、入侵服务器;
- 大规模爬取导致网站瘫痪;
- 贩卖爬取数据、非法牟利;
- 绕开网站加密与防护措施用于非法目的。
真实案例警示:2019年,某公司技术人员编写爬虫抓取竞争对手的房源数据,绕过反爬措施,导致对方服务器压力过大并造成经济损失。最终该公司被以“破坏计算机信息系统罪”判处罚金,技术人员获刑。爬虫技术必须在法律边界内使用。
九、学习路线总结(从入门到精通)
- 入门 :Python 基础 + requests + BeautifulSoup 静态爬取;
- 进阶 :XPath、JsonPath、接口分析、分页爬取;
- 精通 :JS 逆向、MD5/AES/RSA 加密、模拟浏览器;
- 高阶 :异步爬虫、分布式爬虫、APP 爬虫、验证码识别。
推荐学习资源:
- 书籍:《Python3网络爬虫开发实战》(崔庆才)
- 在线教程:Runobb、W3Cschool爬虫板块
- 练习靶场:GlidedSky、SpiderBoot(专门提供反爬练习网站)
- 逆向社区:看雪论坛、吾爱破解(JS逆向板块)
爬虫的核心不是代码,而是分析能力 :分析网页结构、分析接口参数、分析加密逻辑、分析反爬策略。只要掌握分析思路,任何网站都能实现合规爬取。
十、结语
本文从最基础的静态爬虫,到动态接口分析,再到 JS 逆向加密破解,完整覆盖 Python 爬虫核心技术体系。文中代码均为实战可用版本,只需替换目标地址与解析规则,即可快速适配绝大多数网站。
未来趋势:
- AI反爬:越来越多的网站开始使用机器学习模型识别异常流量(如鼠标轨迹、行为模式),传统爬虫将面临更大挑战。
- WebAssembly(WASM)加密:部分高端网站将加密算法编译为WASM二进制格式,使得逆向难度陡增。
- 无头浏览器指纹检测:基于Canvas、WebGL、字体等生成设备指纹,Selenium等工具越来越容易被检测。
- 合规爬虫兴起:随着数据安全法的完善,使用官方API和正规数据交换将成为主流,逆向爬虫的生存空间将被压缩。
技术本身无对错,关键在于使用者。希望大家在合法合规的前提下学习爬虫技术,用技术创造价值,而不是带来风险。坚持练习、多做实战项目,你也能从爬虫小白成长为逆向高手。
到此这篇关于最新Python爬虫从入门到精通:静态爬取+JS逆向+反爬绕过实战教程的文章就介绍到这了,更多相关Python爬虫实战教程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
python逐像素获取栅格经纬度分别保存在两个矩阵中(代码收藏)
这篇文章主要介绍了python逐像素获取栅格经纬度分别保存在两个矩阵中的实现示例,建议收藏代码总会用到,有需要的朋友可以借鉴参考下,希望能够有所帮助2024-01-01


最新评论