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博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/472032.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql 数据库 基本介绍

一 数据 &#xff08;一&#xff09;数据是什么 描述事物的符号记录 包括数字&#xff0c;文字、图形、图像、声音、档案记录气 以“记录”形式按统一的格式进行存储 &#xff08;二&#xff09;数据的分类 1&#xff0c;结构化的数据 即有固定格式和有限长度的数据。例…

01_Kubernetes基础

Kubernetes为什么叫K8S&#xff1a;因为K和S之间有8个字母 为什么需要K8S 对于云计算来说有自己的交互标准 Paas的下一代标准就是容器化&#xff0c;容器的集群化有没有很好的方案&#xff1f;有需求就会有产品&#xff0c;这个产品就叫做资源管理器。 首先是Apache的MESOS&…

Linux虚拟主机默认隐藏文件,如何开启显示

收到一位用户反馈他买了Hostease Linux虚拟主机&#xff0c;想要知道主机默认隐藏文件如何开启。据悉目前大部分主机提供商出售的Linux虚拟主机带的都是cPanel面板&#xff0c;因此开启隐藏文件操做需要进入到cPanel面板。操做步骤如下&#xff1a; 1.首先需要先登陆cPanel面板…

深度强化学习03价值学习

Q*类似于先知&#xff0c;知道动作的后果 价值学习是得到一个近似的价值函数

【Linux】Linux安装软件---软件包管理器 yum

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.Linux中安装软件 1.1 源代码安装 1.2 rpm包安装 1.3 yum安装 1.3.1 举例 1.3.2 图示yum下载安装 2.Linux系统的生态 如何选…

如何构建Docker自定义镜像

说明&#xff1a;平常我们使用Docker运行各种容器&#xff0c;极大地方便了我们对开发应用的使用&#xff0c;如MySQL、Redis&#xff0c;以及各种中间件&#xff0c;使用时只要拉镜像&#xff0c;运行容器即可。本文介绍如何创建一个Demo&#xff0c;自定义构建一个镜像。 开…

酷开科技聚焦大屏端数据研究,构建酷开系统深度挖掘大屏商业价值

中国所有的彩色大屏中&#xff0c;智能电视规模已经过半&#xff0c;OTT平台的数据价值越发引起人们关注。作为OTT行业的头部代表&#xff0c;酷开科技一直聚焦大屏端数据研究&#xff0c;目前已经形成一套基于大屏指数的智慧营销体系&#xff0c;让OTT大屏的数字营销化水平实现…

开源工具专题-02 Confluence企业级wiki

开源工具专题-02 Confluence企业级wiki 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com 转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-3-20 csdn 博客名称&#xff1a;五维空间-影子&#xf…

使用libdivsufsort库构建后缀数组

libdivsufsort是一个C语言库,用于构建后缀数组(Suffix Array)以及执行与后缀数组相关的操作。后缀数组是一种数据结构,用于有效地解决字符串处理问题,如字符串匹配、最长公共子串等。这个库的目标是提供高效、可移植和易于使用的后缀数组实现。 https://github.com/y-256…

我的自建博客之旅06之Mrdoc

这个是我折腾笔记项目的最后一篇文章了,这个项目是类似于语雀的文档笔记项目,因为我当初想找一个既可以当做笔记,又可以作为团队文档分享的笔记,除了语雀,就发现了这个项目。 这个开源项目的界面或者文档组织方式其实是我最喜欢的,但是我后来放弃它的原因是它的后台编辑逻…

Android StateLayout状态页

文章目录 Android StateLayout状态页概述源码使用源码下载 Android StateLayout状态页 概述 StateLayout&#xff08;状态页&#xff09;包含&#xff1a;加载中页面&#xff0c;错误页面&#xff0c;空页面&#xff0c;内含状态默认页面&#xff0c;支持自定义页面。 源码 …

提高WhatsApp营销效果:如何在WhatsApp上增加打开率和提高转化率?

提高WhatsApp营销效果&#xff1a;如何在WhatsApp上增加打开率和提高转化率&#xff1f; WhatsApp是一款广受欢迎的社交应用程序&#xff0c;不仅可以用于个人通讯&#xff0c;也可以用于企业营销。许多企业已经开始在WhatsApp上进行营销活动&#xff0c;但是如何提高营销效果…

极佳文件备份工具支持独占文件备份

1 指定备份的文件夹或者分区盘符 或者子文件夹dir1;dir2;dir3; 2 指定备份到哪里 例如disk1 E分区内的backup文件夹 3 指定备份周期 每日几点几分备份&#xff0c;每周几 几点几分备份 或者 间隔几时几分备份 4 备份模式 单向 将数据源文件夹 完整复制到 目标文件夹, 包括正…

JavaScript高级(十八)---进程和线程,宏任务和微任务

进程和线程 进程&#xff08;process&#xff09;&#xff1a;计算机已经运行的程序&#xff0c;是操作系统管理程序的一种方式&#xff0c;我们可以认为&#xff0c;启动一个应用程序&#xff0c;就会默认启动一个进程&#xff08;也可能是多个进程&#xff09;。 线程&…

【现代C++】移动语义和右值引用

现代C中的移动语义和右值引用是C11引入的重要特性&#xff0c;旨在优化资源管理和提升性能。这些特性允许资源的转移而非复制&#xff0c;特别是对于临时对象和大型对象。 1. 右值引用 右值引用是对临时对象的引用&#xff0c;它允许你修改临时对象。使用&&来声明右值…

阿里云效flow流水线构建时内存不足

云效flow流水线构建时内存不足 报错截图 咨询阿里云后建议自己搭建私有化集群 https://help.aliyun.com/document_detail/201868.html?spm5176.2020520104.0.0.481b3f1bw2Mr1v 搭建地址 打开流水线&#xff0c;只有管理员和拥有者才能看到这个菜单 注意&#xff1a;构建集群…

【数组、字符串】算法例题

每个题的【方法1】是自己的思路&#xff0c;【其他方法】是力扣上更优的解题思路 目录 一、数组、字符串 1. 合并两个有序数组 ① 2. 移除元素 ① 3. 删除有序数组中的重复项 ① 4. 删除有序数组中的重复项 II ② 5. 多数元素 ① 6. 轮转数组 ② 7. 买卖股票的最佳时机…

[leetcode] 45. 跳跃游戏 II

文章目录 题目描述解题方法贪心java代码复杂度分析 题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0…

【二分查找】算法例题

目录 十八、二分查找 114. 搜索插入位置 ① √- 115. 搜索二维矩阵 ② 116. 寻找峰值 ② √- 117. 搜索旋转排序数组 ② 118. 在排序数组中查找元素的第一个和最后一个位置 ② √ 119. 寻找寻钻排序数组中的最小值 ② 120. 寻找两个正序数组的中位数 ③ 136. 直线上最多…

MTLAB 批量下载 脑医学图像数据集BrainWeb: Simulated Brain Database

MTLAB 批量下载 脑医学图像数据集BrainWeb: Simulated Brain Database BrainWeb数据集的网址&#xff1a;https://brainweb.bic.mni.mcgill.ca/brainweb/ 1. 了解 BrainWeb: Simulated Brain Database 这是一个模拟大脑数据的数据库&#xff08;SBD&#xff0c;Simulated Br…