使用urllib3的池管理器
urllib3是在urllib进行更加深入的改进,最大的好处就是在urllib的基础上添加了池管理,以至于我们不需要再去注意我们需要由那个链接去发送请求,而只需要获取到链接发送回来的相应的数据。这样就可以大大减少我们对于链接的管理。
urllib3的请求发送其实很简单,只是将需要发送请求的链接添加到池中,池管理器就会自动按照流程继续流程进行信息的发送。
以下面一个例子进行简单的联系。
1 ''' 2 @Description: 使用urllib3中的链接池发送请求 3 @Version: 1.0 4 @Autor: Montoin Yan 5 @Date: 2020-02-01 17:38:54 6 @LastEditors : Montoin Yan 7 @LastEditTime : 2020-02-04 19:15:02 8 ''' 9 import urllib3 10 from urllib import parse 11 import simplejson 12 import random 13 14 #设置多个请求头,防止被反扒措施进行拦截 15 ua_list = [ 16 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0", 17 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.29 Safari/537.36", 18 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362", 19 "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400" 20 ] 21 #随机pick one 22 ua = random.choice(ua_list) 23 24 #以https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&page_limit=10&page_start=0 为例 25 #将链接进行分割,将Ajax需要传递的参数存储到字典中 26 url = "https://movie.douban.com/j/search_subjects" 27 d = { 28 'type':'movie', 29 'tag':'热门', 30 'page_limit':'10', 31 'page_start':'0' 32 } 33 34 #使用urllib3中的池管理方法进行连接。 35 with urllib3.PoolManager() as http: 36 response = http.request('GET','{}?{}'.format(url,parse.urlencode(d)),headers={ 37 'User-agent':ua 38 }) 39 print(type(response)) #获取方法响应的类型 40 print(response.status,response.reason) #获取状态码和响应结果 41 # print(response.headers) #获取头信息 42 # print(response.data) #获取数据
requests库的常用的方法
requests库使用了urllib3的内容,他的API的使用比urllib3更加的友好,同时他也在urllib3 的基础上添加了许多的方法,同时去除了urllib3中的糟粕。requests中提供了method方法,使得我们可以在发送请求的同时可以指定发送请求的类型。
同时,为了管理请求更加方便,它采用session的方式进行回话的保持,使得我们能够在session和cookie之间来回进行信息的传递。
下面的两段代码大体实现了requests的常用方法和session发送请求的基本方式。
1 ''' 2 @Description: 3 @Version: 1.0 4 @Autor: Montoin Yan 5 @Date: 2020-02-04 19:14:12 6 @LastEditors : Montoin Yan 7 @LastEditTime : 2020-02-04 20:30:20 8 ''' 9 10 import requests 11 from urllib.parse import urlencode 12 import random 13 14 #设置多个请求头,防止被反扒措施进行拦截 15 ua_list = [ 16 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0", 17 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.29 Safari/537.36", 18 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362", 19 "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400" 20 ] 21 #随机pick one 22 ua = random.choice(ua_list) 23 24 #以https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&page_limit=10&page_start=0 为例 25 #将链接进行分割,将Ajax需要传递的参数存储到字典中 26 j_url = "https://movie.douban.com/j/search_subjects" 27 d = { 28 'type':'movie', 29 'tag':'最新', 30 'page_limit':'10', 31 'page_start':'0' 32 } 33 url = '{}?{}'.format(j_url,urlencode(d)) #必须进行转码,否则无法获取到数据 34 response = requests.request('GET',url,headers={ 35 'User-agent':ua 36 }) 37 38 with response: 39 print(response.status_code) #打印响应的状态码 40 print(type(response)) #打印响应的response的类型 41 print(response.url) #打印最终响应的url 42 print(response.headers) #打印响应的头信息 43 print(response.request.headers) #打印发送请求的头信息 44 print(response.text[:200]) #当我们获取到的数据量比较大的时候,为了方便进行验证,可以将获取到的网页数据转换为文本格式并进行切片处理 45