在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('成功!')
执行的结果可以参考下面的内容: