当前位置: 首页 > news >正文

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

爬虫的本质是什么?

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

  • 发送 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.parseurl = '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.parsequery_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.parseparams = {'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.parsebase_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 还有更多高级用法可以探索。

http://www.lryc.cn/news/611835.html

相关文章:

  • Unity3D水下场景与游泳系统开发指南
  • Scrapy(一):轻松爬取图片网站内容​
  • 安宝特方案丨工业AR+AI质检方案:致力于提升检测精度与流程效率
  • linux-系统性能监控
  • Python爬虫实战:研究spiderfoot工具,构建网络情报收集系统
  • python每日一题 贪心算法
  • 线程-线程池篇(二)
  • 基于Hadoop的木鸟民宿数据分析与可视化、民宿价格预测模型系统的设计与实现
  • 使用 gptqmodel 量化 Qwen3-Coder-30B-A3B-Instruct
  • MyBatis基础操作完整指南
  • smart-water表设计方案
  • 百度华为硬件笔试机试题-卷4
  • 希赛《华为 HCIA-Datacom 》核心考点之 NAT 技术解析
  • 解决远程连接云服务器mysql编号1130问题
  • 文本编码扫盲及设计思路总结
  • 应急响应排查(windows版)
  • JAVA高级编程第七章
  • 【Linux系统】进程间通信:命名管道
  • 嵌入式处理器指令系统:精简指令集RISC与复杂指令集CISC的简介,及区别
  • Chrontel 昆泰【CH7107B-BF】CH7107B ——HDMI to CVBS Converter
  • 【arcmap中shp图层数据导入到postgresql数据库中,中文出现乱码,怎么办?】
  • 使用 Maxwell 和 RabbitMQ 监控 Mysql Flowable 表变更
  • 医学影像PACS系统的设计与实现,PACS系统源码
  • LMS/NLMS最小均值算法:双麦克风降噪
  • python中的推导式
  • YOLOv5 上使用 **labelImg** 标注并训练自己的数据集
  • PyTorch生成式人工智能——Hugging Face环境配置与应用详解
  • 【32】C++实战篇—— m行n列的坐标点,求每行相邻点X差值dX,每列相邻点y差值dY,并以矩阵形式左端对齐
  • 远程连接----ubuntu ,rocky 等Linux系统,WindTerm_2.7.0
  • Spring选择哪种方式代理?