Python爬虫 urllib 模块详细教程:零基础小白的入门指南

发布于:2025-08-07 ⋅ 阅读:(13) ⋅ 点赞:(0)

爬虫的本质是什么?

爬虫的本质就是用代码模拟人类在浏览器里的操作,像点击网页、填写表单、提交数据等行为,自动化地进行网页数据的获取和处理。比如:

  • 发送 GET 请求 来请求网页内容,相当于你在浏览器地址栏输入网址按回车。
  • 发送 POST 请求 来提交表单数据,比如登录、注册、搜索等操作。

所以爬虫其实就是用程序来“模仿”人的浏览器操作,通过网络请求与服务器交互,自动抓取和处理网页信息。

在学习爬虫之前尽量要学习一些HTML基础知识,html是构建Web内容的一种语言描述方式

什么是urllib?

urllib 是 Python 的一个标准库,用于处理 URL 和发送 HTTP 请求。它是 Python 网络编程中常用的模块,能够帮助我们实现从发送 HTTP 请求到处理 URL 的各种功能。

本质上是通过这个库模拟在浏览器访问网页的操作

本文将详细介绍 urllib 模块的知识点,包括如何发送 GET 请求、POST 请求,如何使用代理 IP 发送请求、如何使用 Cookies,以及如何保存和使用 Cookies。来帮助大家更好地理解 urllib 的使用方法。


2. 发送 GET 请求

GET 请求是 HTTP 中最常见的请求方法,通常用于从服务器获取数据。你可以使用 urllib.request 模块中的 urlopen() 方法来发送 GET 请求。

GET请求后得到的内容基本为网页的原始 HTML 代码

如何查看源代码?

本质上不算是源代码,而是网页的原始 HTML 代码,可以看到该页面的结构、标签、脚本等内容

  • 在访问的网页使用右键后点击查看网页源代码

  • 使用快捷键Ctrl+u查看网页源代码
    在这里插入图片描述

  • 网页的原始 HTML 代码为:

原始 HTML 代码
在这里插入图片描述

view-source: 加上网站的 URL,它会直接显示该网页的源代码,而不是渲染出来的页面

GET请求示例代码:
import urllib.request

# 发送 GET 请求
response = urllib.request.urlopen('https://www.baidu.com')

# 获取响应内容
html = response.read()
  • urlopen() 用于发送请求,获取响应。
  • read() 方法读取返回的 HTML 数据。
运行效果:

在这里插入图片描述

响应内容为html乱码,需要进行解码为字符串

解码为字符串

html.decode('utf-8')
  • decode('utf-8') 将字节数据解码为字符串。

UTF-8(全称:8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码

解码后的运行结果:

在这里插入图片描述


3. 发送 POST 请求

POST 请求通常用于提交数据,比如表单提交、用户登录、注册等。你可以使用 urllib.requesturlencode() 方法来构造 POST 数据,并通过 urlopen() 发送。

示例代码:
import urllib.request
import urllib.parse

# 要发送的数据  登录数据
data = {'name': 'Alice', 'password': 25}

# 将数据编码成字节格式
data_encoded = urllib.parse.urlencode(data).encode('utf-8')

# 发送 POST 请求
response = urllib.request.urlopen('https://www.example.com/submit', data=data_encoded)

# 获取响应内容
html = response.read()

# 打印响应内容
print(html.decode('utf-8'))
  • urlencode() 方法将字典数据转换为 URL 编码格式。
  • encode('utf-8') 将数据编码成字节格式。
  • urlopen() 发送 POST 请求。

4.带请求头的爬虫请求

import urllib.request

# 设置请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

url = 'https://www.example.com/'

# 创建 Request 对象,封装 URL 和请求头
request = urllib.request.Request(url, headers=headers)

# 发送请求并获取响应
response = urllib.request.urlopen(request)

# 读取并打印响应内容
html = response.read().decode('utf-8')
print(html)

通过携带一个正常的 User-Agent 请求头,服务器更可能返回期望的 HTML 页面,而不是被当作爬虫拦截。

可以参考上一期的文章

小结

携带请求头的目的是为了:

  • 模拟正常浏览器请求,避免被反爬虫机制识别;
  • 处理网站的身份验证和会话管理;
  • 提供与正常用户交互所需的头信息,确保能够正确获取网页内容。

4. 使用代理 IP 发送请求

代理 IP 是一种通过其他服务器转发请求的技术,可以隐藏真实 IP 或绕过 IP 限制。通过 urllib,你可以轻松配置代理服务器并发送请求。

什么是代理 IP?

代理 IP 是指在你访问网站时,通过一个中间服务器(代理服务器)转发请求,从而达到隐藏真实 IP 地址的目的。代理 IP 广泛应用于爬虫程序、绕过访问限制、提高爬取效率等场景。

示例代码:
import urllib.request

# 代理服务器配置
proxy = {'http': 'http://123.45.67.89:8080'}  # 替换为有效的代理 IP 地址

# 创建代理处理器
proxy_handler = urllib.request.ProxyHandler(proxy)

# 创建 opener
opener = urllib.request.build_opener(proxy_handler)

# 使用 opener 发送请求
response = opener.open('https://www.example.com')

# 获取响应内容
html = response.read()

# 打印网页内容
print(html.decode('utf-8'))
  • ProxyHandler() 用于设置代理 IP。
  • build_opener() 创建一个支持代理的 opener 对象。
  • opener.open() 用于发送请求。

5. 使用 Cookies 发送请求

Cookies 是服务器用于在客户端存储会话信息的机制,常用于记住用户登录状态或进行个性化设置。urllib 可以帮助我们处理 Cookies。

登录的时候或生成生成状态,我们使用这个状态发送请求,比如某些网站需要登录后才能查看某些内容

在请求头里面添加cookie示例代码:

这种方法最常用,一般这个cookie在请求接口里面的请求标头找到即可

import urllib.request

# 设置请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Cookie':'channelid=0; _gcl_au=1.1.1020458748.1665057624; Hm_lvt_7ed65b1cc4b810e9fd37959c9bb51b31=1665057624;_ga=GA1.2.530422968.1665057625; _gid=GA1.2.752805622.1665057625; sessionid=4a39e902e581d78a0861077d51d7fb27; sid=1665062637935405;Hm_lpvt_7ed65b1cc4b810e9fd37959c9bb51b31=1665064650'
}

url = 'https://www.example.com/'

# 创建 Request 对象,封装 URL 和请求头
request = urllib.request.Request(url, headers=headers)

# 发送请求并获取响应
response = urllib.request.urlopen(request)

# 读取并打印响应内容
html = response.read().decode('utf-8')
print(html)
保存后发送请求,示例代码:
import urllib.request
import http.cookiejar

# 创建 CookieJar 对象,用于保存 Cookies
cookie_jar = http.cookiejar.CookieJar()

# 创建 Cookie 处理器
cookie_handler = urllib.request.HTTPCookieProcessor(cookie_jar)

# 创建 opener
opener = urllib.request.build_opener(cookie_handler)

# 发送请求并保存 Cookies
response = opener.open('https://www.example.com')

# 查看保存的 Cookies
for cookie in cookie_jar:
    print(cookie.name, cookie.value)
  • CookieJar() 用于保存 Cookies。
  • HTTPCookieProcessor() 处理 HTTP 请求中的 Cookies。
  • build_opener() 创建一个支持 Cookie 处理的 opener 对象。
使用 Cookies 发送后续请求

一旦 Cookies 被保存下来,我们可以在后续的请求中使用这些 Cookies。

# 使用保存的 Cookies 发送请求
response = opener.open('https://www.example.com/after-login')
html = response.read()

# 打印响应内容
print(html.decode('utf-8'))

6. URL 编码和解码

urllib.parse 是 Python 标准库中的一个模块,专门用于处理 URL 编码、解码和解析等操作。它提供了多种函数,用于对 URL 进行拆解、拼接、编码和解码

1. URL 编码和解码

  • urllib.parse.quote: 用于对字符串进行 URL 编码。
  • urllib.parse.unquote: 用于对编码后的 URL 字符串进行解码。
示例:
import urllib.parse

# URL 编码
encoded_url = urllib.parse.quote("Hello World!")
print(encoded_url)  # 输出: Hello%20World%21

# URL 解码
decoded_url = urllib.parse.unquote(encoded_url)
print(decoded_url)  # 输出: Hello World!

2. 解析 URL

  • urllib.parse.urlparse: 用于解析 URL,将其分解为不同的组件,如协议、主机、路径等。
示例:
import urllib.parse

url = 'http://www.example.com/path/to/page?name=ferret&color=purple#section2'
parsed_url = urllib.parse.urlparse(url)

print(parsed_url.scheme)   # 输出: http
print(parsed_url.netloc)   # 输出: www.example.com
print(parsed_url.path)     # 输出: /path/to/page
print(parsed_url.query)    # 输出: name=ferret&color=purple
print(parsed_url.fragment) # 输出: section2

3. 构建 URL

  • urllib.parse.urlunparse: 用于将 URL 的各个部分重新组合成一个完整的 URL。
示例:
import urllib.parse

# 将 URL 组件组合成 URL
url_components = ('http', 'www.example.com', '/path/to/page', '', 'name=ferret&color=purple', 'section2')
url = urllib.parse.urlunparse(url_components)
print(url)  # 输出: http://www.example.com/path/to/page?name=ferret&color=purple#section2

4. 解析查询字符串

  • urllib.parse.parse_qs: 用于将查询字符串解析成字典,返回每个参数的值(列表形式)。
  • urllib.parse.parse_qsl: 用于将查询字符串解析成元组列表。
示例:
import urllib.parse

query_string = 'name=ferret&color=purple&name=badger'
parsed_qs = urllib.parse.parse_qs(query_string)

print(parsed_qs)  # 输出: {'name': ['ferret', 'badger'], 'color': ['purple']}

# 或者使用 parse_qsl 返回元组列表
parsed_qsl = urllib.parse.parse_qsl(query_string)
print(parsed_qsl)  # 输出: [('name', 'ferret'), ('color', 'purple'), ('name', 'badger')]

5. 构建查询字符串

  • urllib.parse.urlencode: 用于将字典或元组列表编码成查询字符串。
示例:
import urllib.parse

params = {'name': 'ferret', 'color': 'purple'}
encoded_params = urllib.parse.urlencode(params)
print(encoded_params)  # 输出: name=ferret&color=purple

6. 处理相对 URL

  • urllib.parse.urljoin: 用于合并一个基本 URL 和一个相对 URL,生成一个完整的 URL。
示例:
import urllib.parse

base_url = 'http://www.example.com/path/to/page'
relative_url = 'anotherpage'
full_url = urllib.parse.urljoin(base_url, relative_url)
print(full_url)  # 输出: http://www.example.com/path/to/anotherpage

7. 实战案例:编码与解码

示例:

如果查询参数中有特殊字符(如中文字符),我们需要对它们进行 URL 编码和解码处理。

# URL 编码
encoded_string = urllib.parse.quote("你好,世界!")
print("编码后的字符串:", encoded_string)

# URL 解码
decoded_string = urllib.parse.unquote(encoded_string)
print("解码后的字符串:", decoded_string)

输出:

编码后的字符串: %E4%BD%A0%E5%A5%BD%EF%BC%8C%E4%B8%96%E7%95%8C%21
解码后的字符串: 你好,世界!

小结:

urllib.parse 模块在处理 URL 时非常有用,特别是在需要处理 URL 编码、解析和拼接等任务时。它提供的函数可以帮助开发者更简便地处理 URL,而不必手动处理每个部分。

7. 总结

本文详细介绍了 Python urllib 模块的核心知识点,包括如何发送 GET 和 POST 请求,如何使用代理 IP,如何发送和使用 Cookies,如何保存 Cookies

对于零基础的小白来说,掌握这些基础操作是学习 Python 网络编程的第一步,帮助你理解和操作 HTTP 请求、Cookies、代理等概念,为后续更复杂的爬虫和网络开发打下基础。如果你有更多的实际需求,urllib 还有更多高级用法可以探索。


网站公告

今日签到

点亮在社区的每一天
去签到