前言
爬虫的基本功能是读取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请求”几大模块的讲解和代码示例,希望对爬虫初学者或需要的朋友能有所帮助。