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