这一章主要涵盖了爬虫的基础概念以及 Python 标准库 urllib 的核心用法

🕷️ 第一部分:爬虫核心概念

这部分主要建立对爬虫的宏观认知,理解“我们在做什么”以及“为什么要这么做”。

1. 什么是爬虫?
  • 形象比喻:互联网是一张巨大的蜘蛛网,数据是网上的猎物,爬虫程序就是一只小蜘蛛,沿着网线抓取自己想要的数据。
  • 核心流程
    1. 爬取网页:获取网页的全部内容(HTML代码)。
    2. 解析数据:从 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 结构。

  • URLErrorurllib.error 的基类,通常由网络问题(无连接、DNS失败)引起。
  • HTTPErrorURLError 的子类,特指 HTTP 状态码错误(如 404 页面不存在,500 服务器错误)。
  • 捕获顺序:先捕获子类 HTTPError,再捕获父类 URLError
2. Handler 与 Opener
  • 为什么要用?urlopen 功能有限,无法处理复杂的 Cookies 或代理。
  • 核心组件
    • Handler:处理器,负责处理特定功能(如 HTTPHandler, ProxyHandler)。
    • Opener:打开器,通过 build_opener(handler) 创建,功能比 urlopen 更强大。
  • 代理配置流程
    1. 构建 ProxyHandler 对象(传入代理 IP 字典)。
    2. 用 Handler 创建 Opener 对象。
    3. 使用 opener.open(request) 发送请求。
3. Cookie 登录
  • 用于处理需要登录才能访问的页面(如微博、QQ空间)。
  • 通过携带 Cookie 信息在 Headers 中,或者使用更高级的 CookieJar 对象来维持会话状态。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐