文章目录
- 专栏导读
- 1、前言
- 2、urllib的使用
- 3、发送请求
-
- [3.1 urlopen](#3.1 urlopen)
- [3.2 request](#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 官网为例,我们把这个网页抓取下来:
python
import urllib.request
response = urllib.request.urlopen("https://www.python.org")
print(response.read().decode("utf-8"))
ps:如果上述代码报错为"utf-8"时,可用下述代码。
python
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方法输出响应的类型:
python
import urllib.request
response = urllib.request.urlopen("https://www.python.org")
print(type(response))
输出结果如下:
python
<class 'http.client.HTTPResponse'>
可以看出,响应是一个HTTPResposne 类型的对象,主要包含read、readinto、getheader、getheaders、fileno 等方法,以及msg、version、status、reason、debuglevel、closed 等属性。得到响应之后,我们把它赋值给response 变量,然后就可以调用上述那些方法和属性,得到返回结果的一系列信息了。
例如,调用 read 方法可以得到响应的网页内容、调用 status 属性可以得到响应结果的状态码(200 代表请求成功,404代表网页未找到等)。
下面再通过一个实例来看看:
python
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:
python
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 类的用法:
python
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类,构造方法如下:
python
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设置为:
python
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博客 ,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗