python网络爬虫实战教学——urllib的使用(1)

文章目录
- 专栏导读
- 1、前言
- 2、urllib的使用
- 3、发送请求
- 3.1 urlopen
- 3.2 request
专栏导读
✍ 作者简介:i阿极,CSDN 数据分析领域优质创作者,专注于分享python数据分析领域知识。
✍ 本文录入于《python网络爬虫实战教学》,本专栏针对大学生、初级数据分析工程师精心打造,对python基础知识点逐一击破,不断学习,提升自我。
✍ 订阅后,可以阅读《python网络爬虫实战教学》中全部文章内容,包含python基础语法、数据结构和文件操作,科学计算,实现文件内容操作,实现数据可视化等等。
✍ 其他专栏:《数据分析案例》 ,《机器学习案例》😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍
1、前言
❓学习爬虫’其基本的操作便是模拟测览器向服务器发出请求’那么我们需要从哪个地方做起呢?
❓请求需要我们自己构造吗?
❓我们需要关心请求这个数据结构怎么实现吗?
❓需要了解HTTP`TCP`IP层的网络传输通信吗?需要知道服务器如何响应以及响应的原理吗?
😍可能你无从下手’不过不用担心,Python的强大之处就是提供了功能齐全的类库来帮助我们实现这些需求°最基础的HTTP库有urlljb、Iequ≈ts、httpx等°
😍拿urllib这个库来说’有了它’我们只需要关心请求的链接是什么’需要传递的参数是什么’以及如何设置可选的请求头,而无须深人到底层去了解到底是怎样传输和通信的°有了urllib库’只用两行代码就可以完成_次请求和响应的处理过程’得到网页内容,是不是感觉方便极了?
👇接下来’就让我们从最基础的部分开始了解HTTP库的使用方法吧。
2、urllib的使用
首先介绍一个Python库叫作urllib,利用它就可以实现HTTP请求的发送,而且不需要关心HTTP协议本身甚至更底层的实现,我们要做的是指定请求的URL`请求头`请求体等信息。此外urlljb还可以把服务器返回的响应转化为Python对象,我们通过该对象便可以方便地获取响应的相关信息’如响应状态码、响应头、响应体等。
ps:在Python2中,有urllib和urllib2两个库来实现HTTP请求的发送。而在 Python3中,urllib2库已经不存在了,统一为了 urllib。
首先,我们了解一下 urllib 库的使用方法,它是 Python 内置的 HTTP请求库,也就是说不需要额外安装,可直接使用。urllib 库包含如下4个模块。
👉request:这是最基本的 HTTP 请求模块,可以模拟请求的发送。就像在浏览器里输人网址然后按下回车一样,只需要给库方法传入 URL以及额外的参数,就可以模拟实现发送请求的过程了。
👉error:异常处理模块。如果出现请求异常,那么我们可以捕获这些异常,然后进行重试或其他操作以保证程序运行不会意外终止。
👉parse:一个工具模块。提供了许多 URL的处理方法,例如拆分、解析、合并等。
👉robotparser:主要用来识别网站的 robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可
以,它其实用得比较少。
3、发送请求
使用urllib库的request模块可以方便地发送请求并得到响应。我们先来看下它的具体用法。
3.1 urlopen
urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用这个模块可以模拟浏览器的请求发起过程,同时它还具有处理授权验证(Authentication)、重定向(Redirection)、浏览器 Cookie 以及其他一些功能。
下面我们体会-下 request 模块的强大之处。这里以 Python 官网为例,我们把这个网页抓取下来:
import urllib.request
response = urllib.request.urlopen("https://www.python.org")
print(response.read().decode("utf-8"))
ps:如果上述代码报错为”utf-8“时,可用下述代码。
import urllib.request
import gzip
from io import BytesIO
#创建一个请求对象
request = urllib.request.Request('https://python.org')
#发起请求并获取响应对象
response = urllib.request.urlopen(request)
#检查响应头以确认内容是否被 gzip 压缩
if response.info().get('Content-Encoding') == 'gzip': # 读取压缩的响应数据 compressed_data = response.read() # 使用 gzip 解压缩 gzip_stream = gzip.GzipFile(fileobj=BytesIO(compressed_data), mode='rb') decoded_data = gzip_stream.read().decode('utf-8') # 打印解码后的数据 print(decoded_data)
else: # 如果没有被 gzip 压缩,直接解码 print(response.read().decode('utf-8'))`
运行结果如图所示

这里我们只用了两行代码’便完成了Python官网的抓取,输出了其网页的源代码。得到源代码之后’我们想要的链接`图片地址`文本信息不就都可以提取出来了吗?
接下来,看看返回的响应到底是什么。利用type方法输出响应的类型:
import urllib.request
response = urllib.request.urlopen("https://www.python.org")
print(type(response))
输出结果如下:
<class 'http.client.HTTPResponse'>
可以看出,响应是一个HTTPResposne 类型的对象,主要包含read、readinto、getheader、getheaders、fileno 等方法,以及msg、version、status、reason、debuglevel、closed 等属性。得到响应之后,我们把它赋值给response 变量,然后就可以调用上述那些方法和属性,得到返回结果的一系列信息了。
例如,调用 read 方法可以得到响应的网页内容、调用 status 属性可以得到响应结果的状态码(200 代表请求成功,404代表网页未找到等)。
下面再通过一个实例来看看:
import urllib.request
response = urllib.request.urlopen("https://www.python.org")
print(response.status)
print(response.getheaders())
print(response.getheader('Server'))
运行结果如下:

其中前两个输出分别是响应的状态码和响应的头信息;最后一个输出是调用 getheader 方法,并传人参数 Server,获取了响应头中 Server 的值,结果是 nginx,意思为服务器是用 Nginx 搭建的。利用最基本的 urlopen方法,已经可以完成对简单网页的 GET请求抓取。
❓如果想给链接传递一些参数,又该怎么实现呢?
👉首先看一下urlopen 方法的 API:
urllib,request.urlopen(url,data=None,[timeout,]*,cafile=NOne,capath=None,,cadefault=False,context=None)
可以发现,除了第一个参数用于传递 URL之外,我们还可以传递其他内容,例如 data(附加数据)、timeout(超时时间)等。
3.2 request
利用 urlopen方法可以发起最基本的请求,但它那几个简单的参数并不足以构建一个完整的请求。如果需要往请求中加人 Headers 等信息,就得利用更强大的 Request 类来构建请求了。
💪首先,我们用实例感受一下 Request 类的用法:
import urllib.request
request =urllib.request.Request('https://python.org')
response =urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

可以发现,我们依然是用urlopen方法来发送请求,只不过这次该方法的参数不再是URL,而是一个 Request 类型的对象。通过构造这个数据结构,一方面可以将请求独立成一个对象,另一方面可更加丰富和灵活地配置参数。
下面我们看一下可以通过怎样的参数来构造 Request类,构造方法如下:
class urllib.request.Request(url,data=None, headers={},origin_req_host=None, unverifiable=False, method=None)
第一个参数 url用于请求 URL,这是必传参数,其他的都是可选参数。
第二个参数 data如果要传数据,必须传 bytes 类型的。如果数据是字典,可以先用urllib.parse模块里的 urlencode 方法进行编码。
第三个参数 headers是一个字典,这就是请求头,我们在构造请求时,既可以通过 headers 参数直接构造此项,也可以通过调用请求实例的 add header 方法添加。添加请求头最常见的方法就是通过修改User-Agent来伪装测览器。默认的User-Agent是Python-ur1lib,我们可以通过修改这个值来伪装浏览器。例如要伪装火狐浏览器,就可以把 User-Agent设置为:
Mozilla/5.0(X11;U;Linux i686)Gecko/20071127 Firefox/2.0.0.11
第四个参数 origin reg host 指的是请求方的 host 名称或者 IP 地址。
第五个参数 unverifiable 表示请求是否是无法验证的,默认取值是 False,意思是用户没有足够的权限来接收这个请求的结果。例如,请求一个HTML文档中的图片,但是没有自动抓取图像的权限这时 unverifiable 的值就是 True。
第六个参数 method 是一个字符串,用来指示请求使用的方法,例如 GET、POST 和 PUT 等。
📢文章下方有交流学习区!一起学习进步!💪💪💪
📢首发CSDN博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗
相关文章:
python网络爬虫实战教学——urllib的使用(1)
文章目录 专栏导读1、前言2、urllib的使用3、发送请求3.1 urlopen3.2 request 专栏导读 ✍ 作者简介:i阿极,CSDN 数据分析领域优质创作者,专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》,本专栏针对…...
简述归并排序
归并排序 特点: 高效稳定时间复杂度最佳/平均/最差: O(N log N) 递归算法有专门的公式来计算时间复杂度 空间复杂度 O(N) 因为开辟了临时的tem_arr数组 一个静态的演示图(from leetcode) 一个动态的演示图 合并实现使用merge函数 inline void merge(v…...
HTML实现卷轴动画完整源码附注释
动画效果截图 页面的html结构代码 <!DOCTYPE html> <html> <head lang=...
sh: 1: dtc: not found
报错: bl31.bin size: 41632 u-boot-nodtb.bin size: 815816 ai_robot.dtb size: 30552 ./mkimage_uboot -E -p 0x3000 -f u-boot-ai-robot.its u-boot-ai-robot.itb sh: 1: dtc: not found ./mkimage_uboot: Cant open u-boot-ai-robot.itb.tmp: No such file …...
laravel 表单验证的 exists、unique 去除软删除字段的校验
use Illuminate\Validation\Rule; exists 去除软删除字段的校验 $validator \Validator::make($data, [phone_new > [Rule::exists(users, phone)->whereNull(deleted_at),]], [phone_new.exists > 手机号不存在,]);unique 去除软删除字段的校验 // 新增 email>r…...
【PHP + 代码审计】函数详解2.0
🍬 博主介绍👨🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…...
宠物智能喂食机方案设计
我们都知道,现如今养宠物的人群已经很多了,主要是青年人居多,他们在独自漂泊的在外的工作,免不了情感泛滥,养一些小动物也是在预料之中。但由于工作或者其他各种因数,养宠人不可时时刻刻在家,对…...
测试直播打赏需要考虑哪些测试要点?
1.功能测试: 1、检查打赏功能是否正确 :检查打赏操作是否可以正常进行 2、 赞赏余额是否正确: 检查赞赏者和被赞赏者的余额是否正确 3、赞赏交易记录是否正确: 检查赞赏者和被赞赏者的交易记录是否正确; 4、检查赞…...
Python练习(续)
练习1:用户登录注册案例 import sysidname {test:123456}print(""" 英雄联盟商城登录界面~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~1. 用户登录2. 新用户注册3. 退出系统~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ …...
发布镜像到阿里云仓库
发布上一篇Dockerfile实战-自定义的centos镜像。 1、登录阿里云 2、找到容器镜像服务 3、创建命令空间 4、创建镜像仓库 5、点击进入这个镜像仓库,可以看到所有的信息 6、根据操作指南测试推送发布 6.1登录阿里云 [rootzhoujunru home]# docker login --usernam…...
web蓝桥杯真题:灯的颜色变化
代码及注释: // TODO:完善此函数 显示红色颜色的灯 function red() { //将红色图片元素display显示出来,其他隐藏document.querySelector(#defaultlight).style.display nonedocument.querySelector(#redlight).style.display inline-b…...
通过docker容器安装zabbix6.4.12图文详解(监控服务器docker容器)
目录 一、相关环境及镜像二、zabbix-server服务端部署1.使用docker创建zabbix-server服务端(1). 创建专用于Zabbix组件容器的网络(2). 启动空的MySQL服务器实例(3). 启动Zabbix Java网关实例(4). 启动Zabbix服务器实例并将实例与创建的MySQL服务器实例链接(5). 启动Zabbix Web界…...
算法打卡day21|回溯法篇01|理论知识,Leetcode 77.组合
回溯法理论知识 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。所以回溯函数也就是递归函数,指的都是一个函数。 回溯法的效率 回溯法并不是什么高效的算法。因为回溯的本质是穷举,…...
C++ 输入输出
输入 1.1 cin >> str; 遇到“空格”、“TAB”、“回车”就停止 string str; cin >> str;1.2 getline(cin, str) 可用于输入一行数据,遇到空格不会停止,读入string字符中 便于读取一行一行的数据 while(getline(cin, str)){if(str "EN…...
FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS图像缩放+多路视频拼接,提供4套工程源码和技术支持
目录 1、前言免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收OSD动态字符叠加输出应用本方案的SDI接收HLS…...
【gpt实践】50个提升工作效率的GPT指令
收集整理了50个工作不同场景中可能会用到的gpt指令,希望对大家有帮助。 1. 用「532规则」定制月度宣传规划 提示:“对于我的 [产品/服务] 在 [社交媒体平台上 ]定位 [我的目标受众]”,使用 5-3-2 规则制定 1 个月的社交媒体内容计划。” Pro…...
基于Springboot的高校竞赛管理系统(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的高校竞赛管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…...
论文阅读——EarthPT
EarthPT: a time series foundation model for Earth Observation 一个Earth Observation (EO)预训练的Transformer。EarthPT是一个7亿参数解码Transformer基础模型,以自回归自监督方式进行训练,并专门针对EO用例进行开发。我们证明了EarthPT是一个有效的…...
软件测评中心:进行科技成果鉴定测试的注意事项和好处简析
软件产品科技成果鉴定是有效评价科技成果质量和水平的方法之一,也是鼓励科技成果通过市场竞争等方式得到有效的评价和认可,可以推动科技成果的进步和转化。 一、进行科技成果鉴定测试时的注意事项: 1、应由具备一定资质和能力的专业机构…...
Android 系统开发工具大全
写给应用开发的 Android Framework 教程——玩转AOSP篇之 Android 系统开发工具推荐 下面推荐的是我常用的工具,如果你有好用的开发工具欢迎在评论区留言讨论交流。 1. SSH 服务与 Tabby Terminal SSH 服务使得我们在其他平台上通过 SSH 客户端程序即可访问到我们…...
Zotero插件市场终极指南:如何深度解析插件生态系统的技术架构?
Zotero插件市场终极指南:如何深度解析插件生态系统的技术架构? 【免费下载链接】zotero-addons Zotero Add-on Market | Zotero插件市场 | Browsing, installing, and reviewing plugins within Zotero 项目地址: https://gitcode.com/gh_mirrors/zo/z…...
zmq源码分析之mailbox_t
文章目录 概述 核心结构 核心成员及其作用 公开接口 1. 构造函数 2. 获取文件描述符 3. 发送命令 4. 接收命令 工作原理 命令传递流程 状态转换 技术特点 1. 线程安全设计 2. 高效的事件通知 3. 跨平台支持 4. Fork 安全 与其他组件的关系 使用场景 性能优化点 技术细节 1. 命令…...
ViGEmBus虚拟游戏控制器驱动:终极完整指南与快速安装教程
ViGEmBus虚拟游戏控制器驱动:终极完整指南与快速安装教程 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经遇到过心爱的游戏控制器无法…...
Mysql自带三个核心数据库+SQL注入
MySQL 三大默认系统数据库详解MySQL 安装完成后,会自带三个核心系统库,负责数据库权限、元数据管理、性能监控,禁止随意删除、修改,否则会导致数据库异常崩溃。1. mysqlMySQL 权限核心库,存储所有数据库账号、用户密码…...
避坑指南:STM32连接ADS1256时SPI时序与DRDY引脚的那些事儿
STM32与ADS1256高效通信实战:SPI时序优化与DRDY引脚深度解析 调试ADS1256这类高精度ADC时,工程师们常会遇到数据不稳定、通信失败等"玄学问题"。上周深夜,当我第三次抓取到杂乱的SPI波形时,才意识到数据手册里那些微妙…...
别让LaTeX投稿坑了你:BSPC、BMC等期刊的隐藏规则与文件提交全解析
别让LaTeX投稿坑了你:BSPC、BMC等期刊的隐藏规则与文件提交全解析 当你熬夜修改完论文最后一处公式,满心欢喜点击投稿按钮时,系统却弹出一连串编译错误——这可能是每个LaTeX用户都经历过的噩梦。不同于Word投稿的"所见即所得"&…...
translategemma-27b-it开发者案例:为小程序接入Ollama图文翻译后端服务
translategemma-27b-it开发者案例:为小程序接入Ollama图文翻译后端服务 1. 引言:当小程序遇上智能翻译 想象一下这个场景:你的小程序用户上传了一张带有外文菜单的图片,或者截屏了一段看不懂的外语聊天记录。他们需要的不是复杂…...
基于springboot的摄影约拍跟拍预定管理系统
目录同行可拿货,招校园代理 ,本人源头供货商核心功能模块辅助功能模块技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 核心功能模块 用户管理模块 注册与登录:…...
5步搞定Gemma-3-12B-IT:无需代码基础,快速搭建AI对话平台
5步搞定Gemma-3-12B-IT:无需代码基础,快速搭建AI对话平台 1. 为什么选择Gemma-3-12B-IT? Gemma-3-12B-IT是Google最新推出的开源大语言模型,特别适合想要快速搭建AI对话平台的用户。相比前代版本,它在三个方面有明显…...
初试FreeRTOS:创建上位机接收数据驱动个舵机任务,如裸机般无感
本课概览 Microsoft Agent Framework (MAF) 提供了一套强大的 Workflow(工作流) 框架,用于编排和协调多个智能体(Agent)或处理组件的执行流程。 本课将以通俗易懂的方式,帮助你理解 MAF Workflow 的核心概念…...
