在urllib庫的使用過程中,會在請求發送之前按照發送請求的方式進行編碼處理,來使得傳遞的參數更加的安全,也更加符合模擬瀏覽器發送請求的形式。這就需要用urllib中的parse模塊。parse的使用主要提供了輸送連接的編碼解碼處理。對於不同的請求發送方式,parse的使用方法不是很相同,下面是我的學習筆記。
GET方法
parse的使用流程大體就是在發送請求的時候將發送的內容使用字典封裝起來,然后按照拼湊的方式將查詢的關鍵信息拼湊到鏈接后,然后發送請求。如下所示:
1 d = { 2 'q':'中國' 3 } 4 u = parse.urlencode(d) #將傳遞的參數進行編碼,編碼后的格式是按照字節以%包裹的形式進行傳遞的. 5 #值得注意的是,當傳遞的參數是漢字時,默認是按照‘utf-8’的格式進行編碼的, 6 #比如漢字中國的編碼為%E4%B8%AD%E5%9B%BD 7 url = '{}?{}'.format(base_url,u)
完整的GET方法發送請求請參考下面這個小例子。
1 ''' 2 @Description: url編碼和GET請求 3 @Version: 1.0 4 @Autor: Montoin Yan 5 @Date: 2020-02-02 15:44:59 6 @LastEditors : Montoin Yan 7 @LastEditTime : 2020-02-02 20:29:00 8 ''' 9 ##在使用GET方法進行傳遞參數的過程中,我們一般會進行一些簡單的編碼操作用來保證參數傳遞的保密性。在urllib.parse中提供了這樣一種方法進行編碼與解碼 10 11 from urllib import parse 12 from urllib.request import urlopen,Request 13 import random 14 15 #http://www.bing.com/search?q=中國 16 base_url = 'http://www.bing.com/search' 17 18 #parse在編碼時支持的是字典格式,可以將字典中的鍵值對按照隨機的形式進行排序,拼湊成一個類似於鏈接格式 19 d = { 20 'q':'中國' 21 } 22 u = parse.urlencode(d) #將傳遞的參數進行編碼,編碼后的格式是按照字節以%包裹的形式進行傳遞的. 23 #值得注意的是,當傳遞的參數是漢字時,默認是按照‘utf-8’的格式進行編碼的, 24 #比如漢字中國的編碼為%E4%B8%AD%E5%9B%BD 25 url = '{}?{}'.format(base_url,u) #設置兩個字典,將得到的url拼湊在一起 26 27 print(url) 28 u_url = parse.unquote(url) #將編碼后的結果進行解碼 29 print(u_url) 30 31 #在編碼或者解碼結束后,會進行連接的傳遞訪問,這就運用到urllib.request模塊,這部分常用的知識點上一篇博客已經總結過了 32 ua_list = [ 33 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0", 34 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.29 Safari/537.36", 35 "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", 36 "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" 37 ] 38 #隨機pick one 39 ua = random.choice(ua_list) 40 request = Request(url,headers={ 41 'User-agent':ua 42 }) 43 # response = urlopen(url,timeout=3) #GET 44 response = urlopen(request,timeout=3) 45 #將使用GET方法得到的信息儲存到任意文件中 46 with response: 47 with open('bing.txt','wb') as f: 48 f.write(response.read()) 49 50 print('成功!')
結果可以參考下面的信息:
POST方法
使用POST方法的形式就在於我們不會在發送請求的時候將請求信息顯示出來,而是在表單提交的時候將請求信息隱藏起來進行發送。而使用編碼方式進行發送,也會提高請求發送過程中的安全性。與GET方法不同發是,在請求返回的過程中,會可能返回一些JSON格式的數據,所以在處理這些數據的過程中,需要將JSON數據轉換為字典形式。
這里給大家推薦一個測試的網址:http://httpbin.org 這個網址中很多的關於spider發送請求的測試,很實用。
post方法發送請求可以參考下面這個小例子。
1 ''' 2 @Description: URL編碼和POST請求 3 @Version: 1.0 4 @Autor: Montoin Yan 5 @Date: 2020-02-02 20:18:08 6 @LastEditors : Montoin Yan 7 @LastEditTime : 2020-02-02 20:54:28 8 ''' 9 10 #不同於GET方法請求,POST方法進行數據請求的時候是不能直接看到傳遞的參數的,並且POST方法返回的數據通常是JOSN形式的,所以使用不同的方式進行傳遞 11 from urllib import parse 12 from urllib.request import urlopen,Request 13 import random 14 import simplejson 15 16 17 url = 'http://httpbin.org/post' 18 19 d = { 20 'name':'張三!@#$%^', 21 'age':'11' 22 } 23 data = parse.urlencode(d) #使用POST方式傳遞數據,相當於將data數據放置到body中進行傳輸 24 25 26 27 ua_list = [ 28 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0", 29 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.29 Safari/537.36", 30 "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", 31 "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" 32 ] 33 #隨機pick one 34 ua = random.choice(ua_list) 35 request = Request(url,headers={ 36 'User-agent':ua 37 }) 38 #這里使用urlopen的第二個參數進行數據的傳遞 39 response = urlopen(request,data =data.encode(),timeout=3) 40 #將使用GET方法得到的信息儲存到任意文件中 41 with response: 42 text = response.read() 43 print(type(text)) 44 d = simplejson.loads(text) 45 print(d) 46 print(type(d)) 47 48 print('成功!')
執行的結果可以參考下面的內容: