> 技术文档 > 【Python】Python爬虫学习路线

【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. 基础语法与数据结构

  • 必学内容
    • 基础语法
      • 数据类型(strintlistdicttupleset)、变量
      • 条件判断(if-elif-else
      • 循环(for、while
      • 函数定义与调用
      • 异常处理(try-except
    • 数据结构与操作
      • 列表推导式、字典推导式
      • 字符串处理(splitjoinreplace、正则表达式 re 模块)
      • JSON数据处理(json模块,解析API返回的JSON数据,序列化与反序列化)
    • 文件操作
      • 读写文件(txtjsoncsv
      • 使用 with open() 安全操作文件
  • 关键作用:爬虫的逻辑控制(如翻页、重试)、数据清洗(如过滤无效信息)均依赖这些基础。例如,用try-except捕获网络请求异常,避免程序崩溃;用列表推导式快速清洗数据。

2. 面向对象编程(OOP)

  • 重点:类(class)与对象,继承、封装、多态,爬虫中常用类设计(如封装请求、数据存储等)。
  • 应用场景:设计可复用的爬虫框架(如自定义Downloader类封装请求逻辑)、管理爬虫配置(如SpiderConfig类存储请求头、代理)。

3. 正则表达式(Regex)

  • 核心技能:掌握re模块的使用,学会用正则匹配文本模式(如邮箱、手机号、HTML标签)。
  • 实战技巧:用re.findall(r\'(.*?)\', html)提取网页标题;用re.sub(r\'\\s+\', \'\', text)去除多余空格。

4. 模块与包管理

  • 了解import机制、虚拟环境(venv/conda)、pip安装第三方库。
  • 提示:爬虫项目依赖复杂(如requestsscrapy),良好的包管理能避免环境冲突。

小目标:能独立编写一个读取本地文件、清洗数据并打印结果的脚本。


二、工具链:Python爬虫核心库

1. 网络请求库

  • 同步请求requests(最常用,语法简单)。
    • GET/POST请求,请求头(headers)设置(User-AgentCookie),会话管理(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()\')快速定位节点。
  • 通用解析parselScrapy内置,同时支持XPathCSS选择器)。

3. 动态页面处理库:对抗前端渲染

  • 自动化浏览器selenium(模拟真实浏览器,支持JS执行)、playwright(新一代工具,支持无头模式,性能更优)。
    • 适用场景:爬取SPA(单页应用,如React/Vue构建的网站),需等待JS渲染完成后获取数据。
  • 接口直连:通过浏览器开发者工具(F12)抓包,直接请求后端API(推荐!效率远高于模拟浏览器)。

无头浏览器优化

# 使用Pyppeteer(异步无头浏览器)import asynciofrom 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. 存储与辅助库

  • 数据库pymysqlMySQL)、pymongoMongoDB)、sqlalchemyORM工具)。
  • 缓存redis(存储已爬URL,避免重复爬取)。
  • 代理与限速proxy_pool(代理池)、scrapy-proxiesScrapy代理中间件)。

5. 框架

  • Scrapy: 一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。

学习建议:通过实际项目练手(如爬取豆瓣电影Top250),对比不同库的优劣(如requests vs aiohttp的性能差异)。


三、进阶:前端知识与反爬对抗

1. JS基础:数据从何而来?

现代网站多采用“前端渲染+AJAX请求”模式,数据可能通过JS动态生成或通过接口(XHR/fetch)获取。需掌握:

  • 核心语法:变量作用域(let/const)、函数(箭头函数、闭包)、数组与对象操作。
  • 异步编程:回调函数、Promise(then/catch)、async/await(理解AJAX请求的执行流程)。
  • DOM操作document.querySelectorinnerHTML(理解页面元素如何被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),雪崩效应 彩虹表碰撞、已知明文攻击(获取前端生成哈希的参数,如时间戳+userIDDES 对称加密(可逆),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-AgentRefererAccept-Language等),随机切换UA(用fake_useragent库生成真实浏览器的UA)。 TLS指纹绕过(使用curl_cffi库)
  • IP频率限制:使用代理池(如proxy_pool、阿布云代理),控制请求频率(添加time.sleep(random.uniform(1,3)))。
  • Cookies验证:模拟登录获取有效Cookies(需分析登录流程,处理CSRF令牌)。
  • 验证码:用OCRtesseract)识别简单验证码,或接入打码平台(如超级鹰);复杂滑动验证码可用Selenium模拟人类操作(如随机滑动轨迹)。

2. 分布式爬虫:突破单机限制

当需要爬取海量数据(如百万级商品信息),单机爬虫效率不足,需搭建分布式系统:

  • Scrapy-Redis:通过Redis共享请求队列和去重集合,实现多台机器协同爬取。
  • 消息队列:用Celery + RabbitMQ/Kafka协调任务分发(适合复杂任务流)。
  • 集群部署方案:
    • 容器化调度:采用 Docker + Kubernetes 编排爬虫节点
    • 分布式去重升级:使用 RedisBloom 模块(布隆过滤器+计数过滤器)
    • 负载均衡策略:Nginx 轮询、K8s Service

3. 高级技巧:模拟人类行为

  • 随机延迟:避免固定间隔请求(如sleep(random.randint(1,5)))。
  • 浏览器指纹:用playwright模拟不同设备的屏幕分辨率、插件信息(绕过设备指纹检测)。
  • 模拟鼠标移动、滚动:用pyautoguipywinauto
  • JS逆向深度:用Frida注入JS脚本,拦截并修改加密函数(高级反爬场景)。

五、学习资源与避坑指南

推荐资源

  1. 文档:
  • Python3官方中文文档
  • 菜鸟教程Python板块
  • Requests官方文档
  • Scrapy中文文档
  1. 工具:
  • Chrome DevTools(F12)
  • Postman(接口测试)
  • Charles(抓包)
  • MitmProxy(中间人代理)
  1. 书籍
  • 《Python编程从入门到实践 第3版》(埃里克·马瑟斯 )
  • 《JavaScript高级程序设计》(红宝书)
  • 《Python3网络爬虫开发实战》(崔庆才)
  • 《Web Scraping with Python》
  1. 社区
  • GitHub(搜索爬虫项目)、知乎(反爬经验分享)、Stack Overflow(解决技术问题)。

避坑提醒

  • 遵守规则:遵循\"先合规再技术\"原则,爬取前查看网站的robots.txt(如https://www.xxx.com/robots.txt),尊重网站数据权益,避免爬取禁止的内容;控制请求频率,尊重网站服务器。
  • 数据合规:爬取的个人信息需符合《个人信息保护法》,商业用途需获得授权。
  • 警惕蜜罐:部分网站会放置隐藏链接(如display:noneURL),爬取这些链接可能触发封禁。
  • 异常处理:添加重试机制(如tenacity库),记录失败请求。