使用urllib3库实现HTTP请求


前言

       爬虫的基本功能是读取URL和抓取网站内容,这就需要爬虫能够实现HTTP请求。请求过程包括生成请求、请求头处理、超时设置、请求重试、查看状态码等。下面记录的是通过urllib3库实现向网站“http://www.baidu.com”发送GET类型HTTP请求并获得响应的过程。


一、urllib3是什么?

urllib3库是Python的一个增强版的HTTP客户端开发包,它增强了Python标准库中的很多特性,例如失败重试、HTTP重定向、HTTP代理。

二、urllib3库实现HTTP请求步骤

1.生成请求

        urllib3库使用一个PoolManager实例来生成请求,由该实例处理与线程池的连接及线程安全的所有细节。之后通过urllib3库的request函数即可创建一个请求,该函数返回一个HTTP响应对象。request函数基本语法格式如下。

urllib3.request(method,url,fields=None,headers=None,**urlopen_kw)

向网站“http://www.baidu.com”发送GET请求,并返回该网站的响应:

代码如下(示例):

import urllib3
#创建PoolManager实例
http=urllib3.PoolManager()
#通过request方法创建请求,此处使用GET方法
rq=http.request('GET','http://www.baidu.com')
#查看服务器响应码
print("服务器响应码:",rq.status)
#查看响应实体
print('响应实体:",rq.data)

2.请求头处理

       在request函数中,如果需要传入headers参数,则可通过定义一个字典类型来实现。可以定义一个包含User-Agent信息的字典,使用火狐和Chrome浏览器,设置操作系统为“Windows NT10.0;Win64;x64”,向网站“ http://www.baidu.com”发送带headers参数的GET请求, hearders参数为定义的User-Agent字典

代码如下(示例):

ua = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/65.0.3325.181'}
rq = http.request('GET','http://www.baidu.com',headers = ua)
print("响应实体:",rq.data)

3.timeout设置

       为防止因为网络不稳定、服务器不稳定等问题造成连接不稳定时的丢包,可以在GET请求中增加timeout参数设置, timeout参数通常为浮点数。依据不同需求, request函数的timeout参数提供了多种设置方法,可直接在URL后设置该次请求的全部timeout参数,也可分别设置该次请求的连接与读取的timeout参数,在PoolManager实例中设置timeout参数可应用至该实例的全部请求中。

分别使用3种方式向网站“ http://www.baidu.com ”发送带timeout参数的GET请求,可仅指定超时时间或分别指定连接和读取的超时时间。

方法1: 直接在url参数之后添加统一的timeout参数

代码(示例):

#直接在url参数之后添加统一的timeout参数
url = 'http://www.tipdm.com/tipdm/index.html'
rq = http.request('GET',url,timeout = 3.0)

方法2: 分别设置连接与读取的timeout参数

代码(示例):

#分别设置连接与读取的timeout参数
rq = http.request('GET',url,timeout = urllib3.Timeout(connect = 1.0, read =3.0))

方法3: 在PoolManager实例中设置timeout参数

代码(示例):

#在PoolManager实例中设置timeout参数
http=urllib3.PoolManager(timeout=3.5)
#或
http=urllib3.PoolManager(timeout=urllib3.Timeout(connect=2.0,read=2.0))

需要注意的是,若已经在PoolManager实例中设置timeout参数,则之后在request 函数中另行设置的timeout参数将会替代PoolManager实例中的timeout参数。

4.请求重试设置

       urllib 3库可以通过设置request函数的retries参数来对重试进行控制。默认进行3次请求重试,以及3次重定向。自定义重试次数可通过赋值一个整型给retries参数来实现,可通过定义retries实例来定制请求重试次数及重定向次数。若需要同时关闭请求重试及重定向,则可将retries参数赋值为False;若仅关闭重定向,则将redirect参数赋值为False。与timeout设置类似,可以在PoolManager实例中设置retries参数控制全部该实例下的请求重试策略。

直接在url之后添加retries参数: 

代码(示例):

rq=http.request(‘GET’,url,headers=ua,timeout=3.5,retries=10)

分别设置5次请求重试次数与4次重定向的retries参数:

代码(示例):

rq=http.request(‘GET’,url,headers=ua,timeout=3.5,retries=5,redirect=4)

同时关闭请求重试与重定向:

代码(示例):

rq=http.request(‘GET’,url,headers=ua,timeout=3.5,retries=False)

仅关闭重定向:

代码(示例):

rq=http.request(‘GET’,url,headers=ua,timeout=3.5,redirect=False)

在PoolManager实例中设置retries参数:

代码(示例):

http=urllib3.PoolManager(retries=5)
#或
http=urllib3.PoolManager(timeout=urllib3.Retry(5,read=4))

5. 生成完整HTTP请求

       向网站“ http://www.baidu.com ”发送一个完整的请求,该请求应当包含链接、请求头、超时时间和重试次数设置。

代码(示例):

http=urllib3.PoolManager()
url='http://www.baidu.com'
ua={'User-Agent':'''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.81'''}
tm=urllib3.Timeout(connect=2.0,read=2.0)
rq=http.request('GET',url,headers=ua,timeout=tm,retries=5,redirect=4)
print("服务器响应码:",rq.status)
print("获取的内容:",rq.data.decode('utf-8'))

总结

以上就是今天要讲的内容,本文详细介绍了使用urllib3库实现HTTP请求的方法,共包含“request函数生成请求”、“请求头hraders参数设置”、“超时参数timeout设置”’、“请求重试(重定向)参数retries(redirect)设置”、“生成完整HTTP请求”几大模块的讲解和代码示例,希望对爬虫初学者或需要的朋友能有所帮助。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

° 数据小新 °

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值