urllib3使用池管理发送请求和requests常用方法的基本使用+session使用

使用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     

 

posted @ 2020-02-04 20:51  啾啾丶丶  阅读(1781)  评论(0编辑  收藏  举报