Python?urllib?入門使用詳細教程
一、簡介
urllib 庫,它是 Python 內(nèi)置的 HTTP 請求庫,不需要額外安裝即可使用,它包含四個模塊:
`request` 請求模塊,提供最基本的 `HTTP` 請求處理。 `parse` 工具模塊,提供處理 `url` 的很多方法:拆分、解析、合并等等。 `error` 異常處理模塊,如果出現(xiàn)請求錯誤,可以捕獲這些錯誤,保證程序不會意外終止。 `robotparser` 模塊,主要用來識別網(wǎng)站的 `robots.txt` 文件,判斷哪些網(wǎng)站可以爬取,用的比較少。
二、 request 模塊
1、urlopen:打開一個指定 URL,然后使用 read() 獲取網(wǎng)頁的 HTML 實體代碼。
# 使用 urllib
import urllib.request
# 1、定義一個 url
url = 'http://www.baidu.com'
# 2、模擬瀏覽器向服務(wù)器發(fā)送請求
response = urllib.request.urlopen(url)
# 3、獲取響應(yīng)數(shù)據(jù)中的頁面源碼(注意:read() 返回的是字節(jié)形式的二進制數(shù)據(jù),返回數(shù)據(jù)會被 b'xxx' 進行包裹)
content = response.read()
# 4、輸出二進制數(shù)據(jù) content
print(content)
# 輸出結(jié)果:b'<html>\r\n<head>\r\n\t<script>\r\n\t\tlocation.replace(location.href.replace("https://","http://"));\r\n\t</script>\r\n</head>\r\n<body>\r\n\t<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>\r\n</body>\r\n</html>'
# 5、將二進制數(shù)據(jù)轉(zhuǎn)成字符串,這里需要網(wǎng)頁對應(yīng)的編碼格式(例如:<meta http-equiv="Content-Type" content="text/html;charset=utf-8">),charset= 的就是編碼格式 utf-8
content = content.decode('utf-8')
# 6、輸出字符串 content
print(content)2、response:響應(yīng)的數(shù)據(jù)對象 HTTPResponse 類型
# 使用 urllib import urllib.request # 1、定義一個 url url = 'http://www.baidu.com' # 2、模擬瀏覽器向服務(wù)器發(fā)送請求 response = urllib.request.urlopen(url) # response 是 http.client.HTTPResponse 類型 print(type(response)) # read 方法是按照一個字節(jié)一個字節(jié)的去讀取內(nèi)容 content = response.read() print(content) # read 方法可以指定讀取多少個字節(jié) content = response.read(50) print(content) # 讀取一行 content = response.readline() print(content) # 讀取所有行 content = response.readlines() print(content) # 獲取狀態(tài)碼 print(response.getcode()) # 獲取訪問的鏈接地址 print(response.geturl()) # 獲取 headers print(response.getheaders())
3、Request:自定義請求對象
# 使用 urllib
import urllib.request
# url 的組成
# https://www.baidu.com/s?wd=123
# 協(xié)議 主機 端口號 路徑 參數(shù) 錨點
# http/https www.baidu.com 80 s wd #
# http 80
# https 443
# mysql 3306
# oracle 1521
# redis 6379
# mongdb 27017
# 1、定義一個 https 的 url
url = 'https://www.baidu.com'
# 2、模擬瀏覽器向服務(wù)器發(fā)送請求
response = urllib.request.urlopen(url)
# 3、獲取內(nèi)容字符串
content = response.read().decode('utf-8')
# 4 會發(fā)現(xiàn)直接這么拿回來的數(shù)據(jù)不完整,這就是反扒的其中一種,代表給到服務(wù)器識別的信息不完整,比如 header 頭里面的請求信息缺少。
print(content)
# 解決方式:
# 定義 header
headers = {
# UA 最基本的防爬識別
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
# 1、定義一個 https 的 url
url = 'https://www.baidu.com'
# 2、定義一個 Request 對象,urlopen 方法并不能直接帶 header。
# 細節(jié):為什么這里需要寫 url=url 而有的地方不需要?因為 Request 構(gòu)造方法傳參順序問題 Request(url, data=None, headers={} ...)
request = urllib.request.Request(url=url, headers=headers)
# 3、模擬瀏覽器向服務(wù)器發(fā)送請求
response = urllib.request.urlopen(request)
# 3、獲取內(nèi)容字符串
content = response.read().decode('utf-8')
# 4 輸出
print(content)
4、urlretrieve:下載(例如:圖片、視頻、網(wǎng)頁源碼…)
# 使用 urllib import urllib.request # 下載網(wǎng)頁 url = 'http://www.baidu.com' # 參數(shù)1:頁面地址,參數(shù)2:文件名稱(或路徑與名稱,例如:./test/baidu.html、baidu.html,不指定路徑默認當前) urllib.request.urlretrieve(url, 'baidu.html') # 下載圖片 url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic1.win4000.com%2Fwallpaper%2F8%2F55402f62682e3.jpg&refer=http%3A%2F%2Fpic1.win4000.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1670904201&t=2dc001fbd959432efe8b8ee0792589ba' # 參數(shù)1:頁面地址,參數(shù)2:文件名稱(或路徑與名稱,例如:./test/baidu.html、baidu.html,不指定路徑默認當前) urllib.request.urlretrieve(url, 'dzm.jpg')
二、 parse 模塊
1、quote:(GET)參數(shù)進行 unicode 編碼
quote 會對參數(shù)進行 unicode 編碼,但是得一個一個參數(shù)的進行轉(zhuǎn)換,在進行拼接,在多個參數(shù)時使用起來比較麻煩。
# 使用 urllib
import urllib.request
# 定義 header
headers = {
# UA 最基本的防爬識別
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
# 1、定義一個 https 的 url
# 這種中文寫法會報錯,因為 ascii 檢索不到
# url = 'https://www.baidu.com/s?wd=卡爾特斯CSDN'
# 也就是需要 `卡爾特斯CSDN` 變成 unicode 編碼格式,例如這樣:
# url = 'https://www.baidu.com/s?wd=%E5%8D%A1%E5%B0%94%E7%89%B9%E6%96%AFCSDN'
# 準備基礎(chǔ)地址(不能整個鏈接去進行 quote 轉(zhuǎn)換)(GET)
url = 'https://www.baidu.com/s?wd='
# 通過 urllib.parse.quote() 進行轉(zhuǎn)換
wd = urllib.parse.quote('卡爾特斯CSDN')
# print(wd) # %E5%8D%A1%E5%B0%94%E7%89%B9%E6%96%AFCSDN
# 拼接起來
url = url + wd
# 2、定義一個 Request 對象,urlopen 方法并不能直接帶 header。
# 細節(jié):為什么這里需要寫 url=url 而有的地方不需要?因為 Request 構(gòu)造方法傳參順序問題 Request(url, data=None, headers={} ...)
request = urllib.request.Request(url=url, headers=headers)
# 3、模擬瀏覽器向服務(wù)器發(fā)送請求
response = urllib.request.urlopen(request)
# 3、獲取內(nèi)容字符串
content = response.read().decode('utf-8')
# 4 輸出
print(content)
2、urlencode:(GET)參數(shù)進行 unicode 編碼
urlencode 會對多個參數(shù)進行 unicode 編碼。
# 使用 urllib
import urllib.request
# 定義 header
headers = {
# UA 最基本的防爬識別
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
# 1、定義一個 https 的 url
# 這種中文寫法會報錯,因為 ascii 檢索不到
# url = 'https://www.baidu.com/s?wd=卡爾特斯CSDN&sex=男'
# 也就是需要 `卡爾特斯CSDN` 與 `男` 變成 unicode 編碼格式,例如這樣:
# url = 'https://www.baidu.com/s?wd=%E5%8D%A1%E5%B0%94%E7%89%B9%E6%96%AFCSDN&sex=%E7%94%B7'
# 準備基礎(chǔ)地址(不能整個鏈接去進行 quote 轉(zhuǎn)換)(GET)
url = 'https://www.baidu.com/s?'
# 參數(shù)
params = {
'wd': '卡爾特斯CSDN',
'sex': '男'
}
# 通過 urllib.parse.urlencode() 進行轉(zhuǎn)換(多個參數(shù))
str = urllib.parse.urlencode(params)
# print(str) # wd=%E5%8D%A1%E5%B0%94%E7%89%B9%E6%96%AFCSDN&sex=%E7%94%B7
# 通過 urllib.parse.quote() 進行轉(zhuǎn)換(單個參數(shù))
# wd = urllib.parse.urlencode('卡爾特斯CSDN')
# print(wd) # %E5%8D%A1%E5%B0%94%E7%89%B9%E6%96%AFCSDN
# 拼接起來
url = url + str
# 2、定義一個 Request 對象,urlopen 方法并不能直接帶 header。
# 細節(jié):為什么這里需要寫 url=url 而有的地方不需要?因為 Request 構(gòu)造方法傳參順序問題 Request(url, data=None, headers={} ...)
request = urllib.request.Request(url=url, headers=headers)
# 3、模擬瀏覽器向服務(wù)器發(fā)送請求
response = urllib.request.urlopen(request)
# 3、獲取內(nèi)容字符串
content = response.read().decode('utf-8')
# 4 輸出
print(content)
2、urlencode:(POST)參數(shù)進行 unicode 編碼,附:Python爬蟲Xpath定位數(shù)據(jù)的兩種方法
# 使用 urllib
import urllib.request
# 使用 json
import json
# 定義 header
headers = {
# UA 最基本的防爬識別
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
# 請求地址(POST)
url = 'https://fanyi.baidu.com/sug'
# 參數(shù)
params = {
'kw': '名稱'
}
# post 請求,參數(shù)不能進行拼接,需放到請求對象指定的參數(shù)對象中
# 通過 urllib.parse.urlencode() 進行轉(zhuǎn)換(多個參數(shù))
# str = urllib.parse.urlencode(params)
# 直接使用轉(zhuǎn)換的參數(shù)字符串會報錯:POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.
# request = urllib.request.Request(url=url, data=str, headers=headers)
# 上面直接使用參數(shù)字符串會報錯,是因為 post 請求參數(shù)必須要要進行編碼,指定編碼格式
data = urllib.parse.urlencode(params).encode('utf-8')
# 模擬瀏覽器向服務(wù)器發(fā)送請求
request = urllib.request.Request(url=url, data=data, headers=headers)
# 模擬瀏覽器向服務(wù)器發(fā)送請求
response = urllib.request.urlopen(request)
# 獲取內(nèi)容字符串
content = response.read().decode('utf-8')
# 將字符串轉(zhuǎn)成 json
obj = json.loads(content)
# 輸出 json
print(obj)
三、 error 模塊(URLError 與 HTTPError)
1、HTTPError 類是 URLError 類的子類。
2、導(dǎo)入包分別是:urllib.error.URLError、urllib.error.HTTPError。
3、通過 urllib 發(fā)送請求的時候,有可能發(fā)送失敗,可以通過 try-except 進行異常捕獲,異常有兩類:URLError 與 HTTPError 類。
# 使用 urllib
import urllib.request
# 使用 json
import json
# 定義 header
headers = {
# UA 最基本的防爬識別
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
# 請求地址(POST)
url = 'https://fanyi.baidu.com/sug'
# 參數(shù)
params = {
'kw': '名稱'
}
# post 請求,參數(shù)不能進行拼接,需放到請求對象指定的參數(shù)對象中
# 通過 urllib.parse.urlencode() 進行轉(zhuǎn)換(多個參數(shù))
# str = urllib.parse.urlencode(params)
# 直接使用轉(zhuǎn)換的參數(shù)字符串會報錯:POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.
# request = urllib.request.Request(url=url, data=str, headers=headers)
# 上面直接使用參數(shù)字符串會報錯,是因為 post 請求參數(shù)必須要要進行編碼,指定編碼格式
data = urllib.parse.urlencode(params).encode('utf-8')
# 模擬瀏覽器向服務(wù)器發(fā)送請求
request = urllib.request.Request(url=url, data=data, headers=headers)
# 模擬瀏覽器向服務(wù)器發(fā)送請求
response = urllib.request.urlopen(request)
# 獲取內(nèi)容字符串
content = response.read().decode('utf-8')
# 將字符串轉(zhuǎn)成 json
obj = json.loads(content)
# 輸出 json
print(obj)
四、Handler 處理器(IP 代理)
五、xppath 使用
到此這篇關(guān)于Python urllib 入門使用詳細教程的文章就介紹到這了,更多相關(guān)Python urllib使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python爬蟲爬取全球疫情數(shù)據(jù)并存儲到mysql數(shù)據(jù)庫的步驟
這篇文章主要介紹了Python爬蟲爬取全球疫情數(shù)據(jù)并存儲到mysql數(shù)據(jù)庫的步驟,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03
python基于三階貝塞爾曲線的數(shù)據(jù)平滑算法
這篇文章主要介紹了python基于三階貝塞爾曲線的數(shù)據(jù)平滑算法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Python中使用dwebsocket實現(xiàn)后端數(shù)據(jù)實時刷新
dwebsocket是Python中一款用于實現(xiàn)WebSocket協(xié)議的庫,可用于后端數(shù)據(jù)實時刷新。在Django中結(jié)合使用dwebsocket和Channels,可以實現(xiàn)前后端的實時通信,支持雙向數(shù)據(jù)傳輸和消息推送,適用于實時聊天、數(shù)據(jù)監(jiān)控、在線游戲等場景2023-04-04
利用python將圖片轉(zhuǎn)換成excel文檔格式
編寫了一小段Python代碼,將圖片轉(zhuǎn)為了Excel,純屬娛樂,下面這篇文章主要給大家介紹了關(guān)于利用python將圖片轉(zhuǎn)換成excel文檔格式的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-12-12

