Python爬虫:从概念到urllib
·
这一章主要涵盖了爬虫的基础概念以及 Python 标准库
urllib的核心用法。
🕷️ 第一部分:爬虫核心概念
这部分主要建立对爬虫的宏观认知,理解“我们在做什么”以及“为什么要这么做”。
1. 什么是爬虫?
- 形象比喻:互联网是一张巨大的蜘蛛网,数据是网上的猎物,爬虫程序就是一只小蜘蛛,沿着网线抓取自己想要的数据。
- 核心流程:
- 爬取网页:获取网页的全部内容(HTML代码)。
- 解析数据:从 HTML 中提取出有价值的信息。
- 本质:爬虫与反爬虫之间的一场博弈。
2. 爬虫的分类
- 通用爬虫:
- 代表:百度、Google 等搜索引擎。
- 特点:抓取整张网页, indiscriminate( indiscriminate 意为不加区别的),大多数据是无用的。
- Robots 协议:网站根目录下的
robots.txt,约定哪些能抓哪些不能抓(君子协议,无强制力)。
- 聚焦爬虫:
- 特点:根据需求,只抓取特定的数据。
- 设计思路:确定 URL -> 模拟浏览器发送请求 -> 获取 HTML -> 解析数据。
3. 常见的反爬手段(基础)
- User-Agent (UA):服务器通过 UA 识别客户端的操作系统、浏览器版本等。如果检测到是脚本而非浏览器,可能会拒绝访问。
- 代理 IP:
- 透明代理:对方知道你用了代理,也知道你真实 IP。
- 匿名代理:对方知道你用了代理,但不知道你真实 IP。
- 高匿名代理:对方不知道你用了代理,也不知道你真实 IP(最安全)。
- 其他手段:验证码(需打码平台)、动态加载(需 Selenium)、数据加密(需分析 JS)。
💻 第二部分:Urllib 实战技术
这部分是本章的“干货”核心,主要涉及代码实现细节。
1. 基础请求与响应
- 发送请求:
urllib.request.urlopen() - 响应对象 (
response):read():读取二进制数据(字节)。getcode():获取状态码(如 200, 404)。geturl():获取实际请求的 URL。getheaders():获取响应头信息。
- 编解码:
- 字节转字符串:
decode('utf-8') - 字符串转字节:
encode('utf-8') - 编码集演变:ASCII -> GB2312 -> Unicode(解决乱码的关键)。
- 字节转字符串:
2. 请求对象的定制 (Request)
为了伪装成浏览器,不能只用简单的 urlopen(url),需要构建 Request 对象。
- 语法:
request = urllib.request.Request(url, headers=headers, data=data) - 处理中文参数 (GET 请求):
- 方法一:
urllib.parse.quote('中文')—— 单独编码中文。 - 方法二:
urllib.parse.urlencode(dict)—— 将字典转换为key=value格式的字符串并编码。
- 方法一:
3. GET 与 POST 的区别(重点)
| 特性 | GET 请求 | POST 请求 |
|---|---|---|
| 参数位置 | 拼接到 URL 后面 | 放在请求体(data)中 |
| 编码处理 | 参数需编码,但不需要调用 encode() 方法 |
参数需编码,且必须调用 encode('utf-8') 转为字节 |
| 应用场景 | 普通搜索、列表获取 | 登录、提交表单、百度翻译等 |
4. AJAX 请求处理
- 特点:网页数据是通过 JavaScript 异步加载的,直接请求网页 URL 拿不到数据。
- 解决思路:
- 在浏览器开发者工具(Network/XHR)中找到真实的数据接口(通常是 JSON 格式)。
- 分析接口 URL 的参数规律(如分页参数
start,limit)。 - 模拟构造 URL 发送请求。
🛠️ 第三部分:进阶操作与异常处理
当基础爬虫无法满足需求时,需要使用更高级的工具。
1. 异常处理
网络请求充满不确定性,必须使用 try-except 结构。
- URLError:
urllib.error的基类,通常由网络问题(无连接、DNS失败)引起。 - HTTPError:
URLError的子类,特指 HTTP 状态码错误(如 404 页面不存在,500 服务器错误)。 - 捕获顺序:先捕获子类
HTTPError,再捕获父类URLError。
2. Handler 与 Opener
- 为什么要用?:
urlopen功能有限,无法处理复杂的 Cookies 或代理。 - 核心组件:
- Handler:处理器,负责处理特定功能(如
HTTPHandler,ProxyHandler)。 - Opener:打开器,通过
build_opener(handler)创建,功能比urlopen更强大。
- Handler:处理器,负责处理特定功能(如
- 代理配置流程:
- 构建
ProxyHandler对象(传入代理 IP 字典)。 - 用 Handler 创建
Opener对象。 - 使用
opener.open(request)发送请求。
- 构建
3. Cookie 登录
- 用于处理需要登录才能访问的页面(如微博、QQ空间)。
- 通过携带 Cookie 信息在 Headers 中,或者使用更高级的 CookieJar 对象来维持会话状态。
更多推荐


所有评论(0)