【Python】Python爬虫学习路线
文章目录
- Python爬虫学习路线:从入门到实战的全景指南
- 一、地基:Python核心基础
- 1. 基础语法与数据结构
- 2. 面向对象编程(OOP)
- 3. 正则表达式(Regex)
- 4. 模块与包管理
- 二、工具链:Python爬虫核心库
- 1. 网络请求库
- 2. 解析库:从HTML/XML中提取数据
- 3. 动态页面处理库:对抗前端渲染
- 4. 存储与辅助库
- 5. 框架
- 三、进阶:前端知识与反爬对抗
- 1. JS基础:数据从何而来?
- 2. 网页源代码分析:定位数据源头
- 3. JS加密与解密:破解“数据密码”
- 4. Hook技术实战
- 5. Webpack与混淆代码:还原“乱码”JS
- 四、高阶:爬虫工程与反反爬策略
- 1. 反爬对抗:常见手段与破解
- 2. 分布式爬虫:突破单机限制
- 3. 高级技巧:模拟人类行为
- 五、学习资源与避坑指南
- 推荐资源
- 避坑提醒
Python爬虫学习路线:从入门到实战的全景指南
一、地基:Python核心基础
1. 基础语法与数据结构
- 必学内容:
- 基础语法
- 数据类型(
str
、int
、list
、dict
、tuple
、set
)、变量 - 条件判断(
if-elif-else
) - 循环(
for、while
) - 函数定义与调用
- 异常处理(
try-except
)
- 数据类型(
- 数据结构与操作
- 列表推导式、字典推导式
- 字符串处理(
split
、join
、replace
、正则表达式re
模块) JSON
数据处理(json
模块,解析API
返回的JSON
数据,序列化与反序列化)
- 文件操作
- 读写文件(
txt
、json
、csv
) - 使用
with open()
安全操作文件
- 读写文件(
- 基础语法
- 关键作用:爬虫的逻辑控制(如翻页、重试)、数据清洗(如过滤无效信息)均依赖这些基础。例如,用
try-except
捕获网络请求异常,避免程序崩溃;用列表推导式快速清洗数据。
2. 面向对象编程(OOP)
- 重点:类(
class
)与对象,继承、封装、多态,爬虫中常用类设计(如封装请求、数据存储等)。 - 应用场景:设计可复用的爬虫框架(如自定义
Downloader
类封装请求逻辑)、管理爬虫配置(如SpiderConfig
类存储请求头、代理)。
3. 正则表达式(Regex)
- 核心技能:掌握
re
模块的使用,学会用正则匹配文本模式(如邮箱、手机号、HTML
标签)。 - 实战技巧:用
re.findall(r'<title>(.*?)</title>', html)
提取网页标题;用re.sub(r'\s+', '', text)
去除多余空格。
4. 模块与包管理
- 了解:
import
机制、虚拟环境(venv
/conda
)、pip
安装第三方库。 - 提示:爬虫项目依赖复杂(如
requests
、scrapy
),良好的包管理能避免环境冲突。
小目标:能独立编写一个读取本地文件、清洗数据并打印结果的脚本。
二、工具链:Python爬虫核心库
1. 网络请求库
- 同步请求:
requests
(最常用,语法简单)。GET/POST
请求,请求头(headers
)设置(User-Agent
、Cookie
),会话管理(Session
),代理设置(proxies
)- 示例:
response = requests.get("https://httpbin.org/get", headers={"User-Agent": "Mozilla/5.0"})
,response.json()
解析JSON
数据。
- 异步请求:
aiohttp
(高性能,适合大规模并发)。- 优势:单线程异步
IO
,比requests
快数倍(如爬取1000个页面,耗时从100秒降至10秒)。
- 优势:单线程异步
2. 解析库:从HTML/XML中提取数据
- 轻量级:
BeautifulSoup
(语法友好,支持lxml
/html.parser
解析器)。- 示例:
soup.find('div', class_='content').text
提取指定标签内容。
- 示例:
- 高效型:
lxml
(基于C实现,速度快,支持XPath
)。- 优势:用
etree.HTML(html).xpath('//div[@class="content"]/text()')
快速定位节点。
- 优势:用
- 通用解析:
parsel
(Scrapy内置,同时支持XPath
和CSS
选择器)。
3. 动态页面处理库:对抗前端渲染
- 自动化浏览器:
selenium
(模拟真实浏览器,支持JS
执行)、playwright
(新一代工具,支持无头模式,性能更优)。- 适用场景:爬取
SPA
(单页应用,如React/Vue
构建的网站),需等待JS
渲染完成后获取数据。
- 适用场景:爬取
- 接口直连:通过浏览器开发者工具(F12)抓包,直接请求后端
API
(推荐!效率远高于模拟浏览器)。
无头浏览器优化
# 使用Pyppeteer(异步无头浏览器)
import asyncio
from pyppeteer import launchasync def main():browser = await launch(headless=True)page = await browser.newPage()await page.goto('https://dynamic-site.com')# 执行JavaScript获取数据data = await page.evaluate('''() => {return window.__INITIAL_STATE__.userData;}''')print(data)await browser.close()asyncio.get_event_loop().run_until_complete(main())
4. 存储与辅助库
- 数据库:
pymysql
(MySQL
)、pymongo
(MongoDB
)、sqlalchemy
(ORM
工具)。 - 缓存:
redis
(存储已爬URL
,避免重复爬取)。 - 代理与限速:
proxy_pool
(代理池)、scrapy-proxies
(Scrapy
代理中间件)。
5. 框架
Scrapy
: 一个快速、高层次的屏幕抓取和web
抓取框架,用于抓取web
站点并从页面中提取结构化的数据。
学习建议:通过实际项目练手(如爬取豆瓣电影Top250),对比不同库的优劣(如requests
vs aiohttp
的性能差异)。
三、进阶:前端知识与反爬对抗
1. JS基础:数据从何而来?
现代网站多采用“前端渲染+AJAX
请求”模式,数据可能通过JS
动态生成或通过接口(XHR/fetch
)获取。需掌握:
- 核心语法:变量作用域(
let/const
)、函数(箭头函数、闭包)、数组与对象操作。 - 异步编程:回调函数、Promise(
then/catch
)、async/await
(理解AJAX
请求的执行流程)。 - DOM操作:
document.querySelector
、innerHTML
(理解页面元素如何被JS
修改)。
实战场景:某电商网站的商品价格在页面加载后3秒才显示(因JS
异步请求价格接口),需通过调试工具找到价格接口的真实URL
。
2. 网页源代码分析:定位数据源头
拿到一个网站,第一步是判断数据是静态渲染(直接在HTML
中)还是动态生成(通过JS
加载)。
- 静态页面:右键“查看网页源代码”,搜索目标关键词(如“商品名称”),若能找到则为静态。
- 动态页面:源代码中无目标关键词,需通过F12的
Network
面板抓包:- 过滤
XHR/Fetch
类型请求,观察请求的URL
、请求头、响应数据。 - 若响应数据为
JSON
且包含目标信息(如商品列表),则直接请求该接口即可。
- 过滤
技巧:关注请求头中的Referer
(防跨站)、Cookie
(身份验证),这些可能是反爬的关键。
3. JS加密与解密:破解“数据密码”
为防止爬虫,网站常对请求参数加密(如表单提交的token
、接口的sign
参数)。
常见加密方式及破解方法:
加密类型 | 特点 | 破解思路 |
---|---|---|
Base64 编码 | 编码(可逆),含=填充符,字符范围A-Z,a-z,0-9,+,/ ,输出长度随输入线性增长 | 直接解码还原(如Python base64.b64decode()) |
MD5/SHA-1 | 哈希算法(不可逆),固定长度输出(MD5:128bit/SHA-1:160bit ),雪崩效应 | 彩虹表碰撞、已知明文攻击(获取前端生成哈希的参数,如时间戳+userID ) |
DES | 对称加密(可逆),56位有效密钥(总64位),64位块大小,16轮迭代 | 暴力破解(弱密钥可利用)、已知明文攻击、查找代码中硬编码密钥 |
AES | 对称加密(可逆),支持128/192/256位密钥,需IV 向量,输出长度对齐块大小 | 逆向JS 找到加密函数、提取密钥/IV ,用Python 复现(pycryptodome 库) |
RSA | 非对称加密(可逆),依赖大素数分解难题,公钥加密私钥解密,输出长度=密钥长度 | 获取私钥(常存服务端)、短密钥爆破(≤1024位)、选择密文攻击,用Python 复现(pycryptodome 库) |
自定义加密 | 多种算法混合(如XOR +Base64 +RSA ),长度/字符范围不定,混淆性强 | JS 调试逐层分析(Chrome DevTools 断点跟踪)、逆向工程复现逻辑 |
逆向步骤:
- 定位加密入口(搜索关键字
encrypt/crypt
) - 分析加密参数生成逻辑
- 使用
Python
复现算法或调用JS
执行
# 示例:调用JS执行加密函数
import execjswith open('encrypt.js') as f:js_code = f.read()ctx = execjs.compile(js_code)
result = ctx.call('encryptData', 'raw_data')
print("加密结果:", result)
实战案例:某登录接口的password
参数是MD5
加密后的值,通过搜索md5(
定位到加密函数,提取原始密码和盐值,在Python
中用hashlib.md5(password.encode()).hexdigest()
复现。
4. Hook技术实战
// 示例:Hook Fetch请求
const originalFetch = window.fetch;
window.fetch = function(url, config) {console.log('拦截请求:', url);return originalFetch.apply(this, arguments);
};// 输出:拦截请求: https://api.target-site.com/data
5. Webpack与混淆代码:还原“乱码”JS
Webpack
模块分析
// 定位Webpack模块
window.__webpack_modules__[module_id].toString()
现代前端项目常用Webpack
打包JS
,导致线上JS
文件被压缩、混淆(变量名变为a/b/c
,代码逻辑难以阅读)。需掌握:
- 定位源码:通过浏览器开发者工具的
Sources
面板,找到未打包的原始JS
文件(通常在webpack://
目录下)。 - 反混淆:使用
js-beautify
工具格式化代码,或通过Source Map
(映射文件)还原原始代码(需网站未禁用source map
)。
提示:若网站禁用了
source map
,可通过搜索关键字符串(如接口URL)定位加密函数位置。
四、高阶:爬虫工程与反反爬策略
当你能轻松爬取普通网站后,需进一步提升工程能力和反反爬技巧,应对企业级反爬系统(如滑动验证码、IP
封禁、设备指纹)。
1. 反爬对抗:常见手段与破解
- 请求指纹检测:完善请求头(
User-Agent
、Referer
、Accept-Language
等),随机切换UA
(用fake_useragent
库生成真实浏览器的UA
)。TLS
指纹绕过(使用curl_cffi
库) - IP频率限制:使用代理池(如
proxy_pool
、阿布云代理),控制请求频率(添加time.sleep(random.uniform(1,3))
)。 - Cookies验证:模拟登录获取有效
Cookies
(需分析登录流程,处理CSRF
令牌)。 - 验证码:用
OCR
(tesseract
)识别简单验证码,或接入打码平台(如超级鹰);复杂滑动验证码可用Selenium
模拟人类操作(如随机滑动轨迹)。
2. 分布式爬虫:突破单机限制
当需要爬取海量数据(如百万级商品信息),单机爬虫效率不足,需搭建分布式系统:
- Scrapy-Redis:通过
Redis
共享请求队列和去重集合,实现多台机器协同爬取。 - 消息队列:用
Celery
+RabbitMQ
/Kafka
协调任务分发(适合复杂任务流)。 - 集群部署方案:
- 容器化调度:采用
Docker
+Kubernetes
编排爬虫节点 - 分布式去重升级:使用
RedisBloom
模块(布隆过滤器+计数过滤器) - 负载均衡策略:
Nginx
轮询、K8s Service
- 容器化调度:采用
3. 高级技巧:模拟人类行为
- 随机延迟:避免固定间隔请求(如
sleep(random.randint(1,5))
)。 - 浏览器指纹:用
playwright
模拟不同设备的屏幕分辨率、插件信息(绕过设备指纹检测)。 - 模拟鼠标移动、滚动:用
pyautogui
和pywinauto
- JS逆向深度:用
Frida
注入JS
脚本,拦截并修改加密函数(高级反爬场景)。
五、学习资源与避坑指南
推荐资源
- 文档:
- Python3官方中文文档
- 菜鸟教程Python板块
- Requests官方文档
- Scrapy中文文档
- 工具:
Chrome DevTools
(F12)Postman
(接口测试)Charles
(抓包)MitmProxy
(中间人代理)
- 书籍
- 《Python编程从入门到实践 第3版》(埃里克·马瑟斯 )
- 《JavaScript高级程序设计》(红宝书)
- 《Python3网络爬虫开发实战》(崔庆才)
- 《Web Scraping with Python》
- 社区
GitHub
(搜索爬虫项目)、知乎(反爬经验分享)、Stack Overflow
(解决技术问题)。
避坑提醒
- 遵守规则:遵循"先合规再技术"原则,爬取前查看网站的
robots.txt
(如https://www.xxx.com/robots.txt
),尊重网站数据权益,避免爬取禁止的内容;控制请求频率,尊重网站服务器。 - 数据合规:爬取的个人信息需符合《个人信息保护法》,商业用途需获得授权。
- 警惕蜜罐:部分网站会放置隐藏链接(如
display:none
的URL
),爬取这些链接可能触发封禁。 - 异常处理:添加重试机制(如
tenacity
库),记录失败请求。