爬虫实战学习笔记_3 网络请求urllib模块:设置IP代理+处理请求异常+解析URL+解码+编码+组合URL+URL连接
1 設置IP代理
1.1 方法論述
使用urllib模塊設置代理IP是比較簡單的,首先需要創建ProxyHandler對象,其參數為字典類型的代理IP,鍵名為協議類型(如HTTP或者HTTPS),值為代理鏈接。然后利用ProxyHandler對象與buildopener()方法構建一個新的opener對象,最后再發送網絡請求即可。
1.2 代碼實現
import urllib.request # 導入urllib.request模塊 url= 'https://www.httpbin.org/get' # 網絡請求地址# 創建代理IP proxy_handler = urllib.request.ProxyHandler({'https':'58.220.95.114:10053' })# 創建opener對象 opener = urllib.request.build_opener(proxy_handler) response = opener.open(url,timeout=2) # 發送網絡請求 print(response.read().decode('utf-8')) # 打印返回內容2 處理請求異常
在實現網絡請求時,可能會出現很多異常錯誤,ulib模塊中的urllib.error模塊包含了URLError與HTTPError兩個比較重要的異常類。
2.1 處理URLError異常
URLError類中reason屬性,可以反饋異常的原因
2.1.1 向不存在的地址發送請求
import urllib.request # 導入urllib.request模塊 import urllib.error # 導入urllib.error模塊 try:# 向不存在的網絡地址發送請求response = urllib.request.urlopen('http://www.52pojie.cn/4040.html') except urllib.error.URLError as error: # 捕獲異常信息print(error.reason) # 打印異常原因print(error.code) # 打印HTTP狀態碼print(error.header) # 返回請求頭2.1.2 雙重異常捕獲
import urllib.request # 導入urllib.request模塊 import urllib.error # 導入urllib.error模塊 try:# 向不存在的網絡地址發送請求response = urllib.request.urlopen('https://www.python12.org/',timeout=0.1) except urllib.error.HTTPError as error: # HTTPError捕獲異常信息print('狀態碼為:',error.code) # 打印狀態碼print('HTTPError異常信息為:',error.reason) # 打印異常原因print('請求頭信息如下:\n',error.headers) # 打印請求頭 except urllib.error.URLError as error: # URLError捕獲異常信息print('URLError異常信息為:',error.reason)# 輸出 URLError異常信息為: [Errno 11001] getaddrinfo failed3 解析URL
urllib模塊中提供了parse子模塊,主要用于解析URL,可以實現URL的拆分或者是組合。它支持多種協議的URL處理。
3.1?urlparse()
3.1.1 urlparse()簡介
urlparse()用于將URL分解成不同部分
3.1.2 urlparse()函數構成
urllib.parse.urlparse (urlstring,scheme ='',allow_fragments=True)- urlstring:需要拆分的URL,該參數為必選參數。
- scheme:可選參數,表示需要設置的默認協議。如果需要拆分的URL中沒有協議,可以通過該參數設置一個默認的協議,該參數的默認值為空字符串。
- allow_fragments:可選參數,如果該參數設置為False,表示忽略fragment這部分內容,默認為Tnue。
3.1.3 使用urlparse()分解URL
import urllib.parse #導入urllib.parse模塊 parse_result = urllib.parse.urlparse('https://www.baidu.com/doc/library/urllib.parse.html') print(type(parse_result)) # 打印類型 print(parse_result) # 打印拆分后的結果 ### 也可以拆分打印 print(parse_result.scheme) # 打印拆分后的結果 print(parse_result.netloc) # 打印拆分后的結果 print(parse_result.path) # 打印拆分后的結果 print(parse_result.params) # 打印拆分后的結果 print(parse_result.query) # 打印拆分后的結果 print(parse_result.fragment) # 打印拆分后的結果<class 'urllib.parse.ParseResult'>
ParseResult(scheme='https', netloc='www.baidu.com', path='/doc/library/urllib.parse.html', params='', query='', fragment='')
https
www.baidu.com
/doc/library/urllib.parse.html
3.2?urlsplit()
3.2.1?urlsplit()簡介
使用urlsplit()方法與urlparse()方法類似,可以實現URL的拆分,只是urlsplit()方法不再單獨拆分params這部分內容,而是將params合并到path中,所以返回的結果中只有5部分內容,并且運數據類型為SplitResult。示例代碼如下,
3.2.2?urlsplit()代碼實現
import urllib.parse #導入urllib.parse模塊 # 需要拆分的URL url = 'https://www.baidu.com/doc/library/urllib.parse.html' print(urllib.parse.urlsplit(url)) # 使用urlsplit()方法拆分URL # 輸出: SplitResult(scheme='https', netloc='www.baidu.com', path='/doc/library/urllib.parse.html', query='', fragment='') print(urllib.parse.urlparse(url)) # 使用urlparse()方法拆分URL # 輸出:ParseResult(scheme='https', netloc='www.baidu.com', path='/doc/library/urllib.parse.html', params='', query='', fragment='')4 組合URL
4.1 urlunparse()
使用urlunpare()方法組合URL時,需要注意可迭代參數中的元素必須是6個
import urllib.parse #導入urllib.parse模塊 list_url = ['https','baidu.org','/3/library/urllib.parse.html','','',''] tuple_url = ('https','baidu.org','/3/library/urllib.parse.html','','','') dict_url = {'scheme':'https','netloc':'docs.baidu.org','path':'/baidu/library/urllib.parse.html','params':'','query':'','fragment':''} print('組合列表類型的URL:',urllib.parse.urlunparse(list_url)) print('組合元組類型的URL:',urllib.parse.urlunparse(tuple_url)) print('組合字典類型的URL:',urllib.parse.urlunparse(dict_url.values()))輸出:
組合列表類型的URL: https://baidu.org/3/library/urllib.parse.html
組合元組類型的URL: https://baidu.org/3/library/urllib.parse.html
組合字典類型的URL: https://docs.baidu.org/baidu/library/urllib.parse.html
4.2 urlunsplit()
import urllib.parse #導入urllib.parse模塊 list_url = ['https','docs.python.org','/3/library/urllib.parse.html','',''] tuple_url = ('https','docs.python.org','/3/library/urllib.parse.html','','') dict_url = {'scheme':'https','netloc':'docs.python.org','path':'/3/library/urllib.parse.html','query':'','fragment':''} print('組合列表類型的URL:',urllib.parse.urlunsplit(list_url)) print('組合元組類型的URL:',urllib.parse.urlunsplit(tuple_url)) print('組合字典類型的URL:',urllib.parse.urlunsplit(dict_url.values()))輸出:
組合列表類型的URL: https://docs.python.org/3/library/urllib.parse.html
組合元組類型的URL: https://docs.python.org/3/library/urllib.parse.html
組合字典類型的URL: https://docs.python.org/3/library/urllib.parse.html
?
5 URL的連接urllib.parse.urljoin()
5.1?函數原型
urllib.parse.urljoin(base,url,allow_fragments = True)- base:表示基礎鏈接
- url:表示新的鏈接
- allow_fragments:可選擇參數,默認為True
5.2 使用urllib.parse.urljoin()實例
import urllib.parse #導入urllib.parse模塊 base_url = 'https://tet.baidu.org' # 定義基礎鏈接 # 第二參數不完整時,合并返回 print(urllib.parse.urljoin(base_url,'3/library/urllib.parse.html')) # 第二參數完成時,不合并直接返回第二參數的鏈接 print(urllib.parse.urljoin(base_url,'https://docs.tet.baidu.org/3/library/urllib.parse.html#url-parsing'))輸出:
https://tet.baidu.org/3/library/urllib.parse.html
https://docs.tet.baidu.org/3/library/urllib.parse.html#url-parsing
?
6 URL的解碼與編碼
quote()方法與urlencode()方法所實現的功能類似,但是urlencode()方法中只接收字典類型的參數,quote()方法則可以將一個字符串進行編碼。
6.1 使用urlcode()方法編碼請求參數
import urllib.parse #導入urllib.parse模塊 base_url = 'http://baidu.org/get?' # 定義基礎鏈接 params = {'name':'Jack','country':'中國','age':30} # 定義字典類型的請求參數 url = base_url+urllib.parse.urlencode(params) # 連接請求地址 print('編碼后的請求地址為:',url)編碼后的請求地址為: http://baidu.org/get?name=Jack&country=%E4%B8%AD%E5%9B%BD&age=30
6.2 使用quote()方法編碼字符串參數
import urllib.parse #導入urllib.parse模塊 base_url = 'http://baidu.org/get?country=' # 定義基礎鏈接 url = base_url+urllib.parse.quote('中國') # 字符串編碼 print('編碼后的請求地址為:',url)編碼后的請求地址為: http://baidu.org/get?country=%E4%B8%AD%E5%9B%BD
7 解碼
7.1 代碼1
import urllib.parse #導入urllib.parse模塊 u = urllib.parse.urlencode({'country':'中國'}) # 使用urlencode編碼 q=urllib.parse.quote('country=中國') # 使用quote編碼 print('urlencode編碼后結果為:',u) print('quote編碼后結果為:',q) print('對urlencode解碼:',urllib.parse.unquote(u)) print('對quote解碼:',urllib.parse.unquote(q))7.2 代碼2?
import urllib.parse #導入urllib.parse模塊 # 定義一個請求地址 url = 'http://httpbin.org/get?name=Jack&country=%E4%B8%AD%E5%9B%BD&age=30' q = urllib.parse.urlsplit(url).query # 獲取需要的參數 q_dict = urllib.parse.parse_qs(q) # 將參數轉換為字典類型的數據 print('數據類型為:',type(q_dict)) print('轉換后的數據:',q_dict)7.3 代碼3
import urllib.parse #導入urllib.parse模塊 str_params = 'name=Jack&country=%E4%B8%AD%E5%9B%BD&age=30' # 字符串參數 list_params = urllib.parse.parse_qsl(str_params) # 將字符串參數轉為元組所組成的列表 print('數據類型為:',type(list_params)) print('轉換后的數據:',list_params)總結
以上是生活随笔為你收集整理的爬虫实战学习笔记_3 网络请求urllib模块:设置IP代理+处理请求异常+解析URL+解码+编码+组合URL+URL连接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 报错curl: (7) Failed t
- 下一篇: 【Pytorch神经网络基础理论篇】 0