Python爬蟲之urllib基礎(chǔ)用法教程
綜述
本系列文檔用于對Python爬蟲技術(shù)進(jìn)行簡單的教程講解,鞏固自己技術(shù)知識的同時,萬一一不小心又正好對你有用那就更好了。
Python 版本是3.7.4
urllib庫介紹
它是 Python 內(nèi)置的HTTP請求庫,也就是說我們不需要額外安裝即可使用,它包含四個模塊(主要對前三個模塊進(jìn)行學(xué)習(xí)):
- request : 它是最基本的 HTTP 請求模塊,我們可以用它來模擬發(fā)送一請求,就像在瀏覽器里輸入網(wǎng)址然后敲擊回車一樣,只需要給庫方法傳入 URL 還有額外的參數(shù),就可以模擬實(shí)現(xiàn)這個過程了。
- error : 異常處理模塊,如果出現(xiàn)請求錯誤,我們可以捕獲這些異常,然后進(jìn)行重試或其他操作保證程序不會意外終止。
- parse : 用于解析URL,提供了許多URL處理方法,比如拆分、解析、合并等等的方法,以及對參數(shù)的拼接等待。
- robotparser : 主要是用來識別網(wǎng)站的robots.txt協(xié)議文件,然后判斷網(wǎng)站的那些數(shù)據(jù)可以爬,哪些數(shù)據(jù)不可以爬的,其實(shí)用的比較少。
urllib.request 介紹
urlopen()
1.參數(shù)說明(僅寫了四個最常用的參數(shù))
url : 爬取目標(biāo)的URL;
data : 請求參數(shù),如果設(shè)置該參數(shù),則請求默認(rèn)為post請求;沒有默認(rèn)為get請求;
timeout : 用于設(shè)置超時時間,單位為秒;
context : 必須是一個ssl.SSLContext類型,用來指定SSL設(shè)置,忽略未認(rèn)證的CA證書;
2.具體用法
GET 請求方式
# 導(dǎo)入urllib庫
import urllib.request
# 向指定的url發(fā)送請求,并返回服務(wù)器響應(yīng)的類文件對象
url = "http://www.baidu.com"
response = urllib.request.urlopen(url=url)
print(type(response))
# 類文件對象支持文件對象的操作方法,如read()方法讀取文件全部內(nèi)容,返回字符串
html = response.read()
# html = response.readline() # 讀取一行
# html = response.readlines() # 讀取多行,返回列表
# 打印響應(yīng)結(jié)果(byte類型)
print(html)
# 打印響應(yīng)結(jié)果(utf-8類型)
# 二進(jìn)制和字符串之間的相互轉(zhuǎn)碼使用 encode() 和 decode() 函數(shù)
# encode() 和 decode() 可帶參數(shù),不寫默認(rèn)utf-8,其他不再特別說明
print(html.decode())
# 打印狀態(tài)碼
# print(response.get_code())
print(response.status)
# 獲取響應(yīng)頭
print(response.getheaders())
# 獲取響應(yīng)頭Server信息
print(response.getheader('Server'))
# 獲取響應(yīng)結(jié)果原因
print(response.reason)
POST 請求方式
# 導(dǎo)入urllib庫
import urllib.parse
import urllib.request
# 向指定的url發(fā)送請求,并返回
post_url = 'https://fanyi.baidu.com/sug'
# 傳入?yún)?shù)
form_data = {
'kw': 'honey'
}
# 格式化參數(shù)
form_data = urllib.parse.urlencode(form_data).encode()
response = urllib.request.urlopen(url=post_url, data=form_data)
# 打印服務(wù)器響應(yīng)的類文件對象
print(type(response))
# 類文件對象支持文件對象的操作方法,如read()方法讀取文件全部內(nèi)容,返回字符串
html = response.read()
# 打印響應(yīng)結(jié)果(byte類型)
print(html)
# 打印響應(yīng)結(jié)果(utf-8類型)
print(html.decode())
# 打印狀態(tài)碼
print(response.status)
# print(response.getcode())
# 獲取響應(yīng)頭
print(response.getheaders())
# 獲取響應(yīng)頭Server信息
print(response.getheader('Server'))
# 獲取響應(yīng)結(jié)果原因
print(response.reason)
urlretrleve()
1.參數(shù)說明
url : 下載鏈接地址;
filename : 指定保存本地路徑(如果參數(shù)未指定,urllib會生成一個臨時文件保存數(shù)據(jù));
reporthook : 是一個回調(diào)函數(shù),當(dāng)連接上服務(wù)器、以及相應(yīng)的數(shù)據(jù)塊傳輸完畢時會觸發(fā)該回調(diào),我們可以利用這個回調(diào)函數(shù)來顯示當(dāng)前的下載進(jìn)度;
data : 指post導(dǎo)服務(wù)器的數(shù)據(jù),該方法返回一個包含兩個元素的(filename, headers) 元組,filename 表示保存到本地的路徑,header表示服務(wù)器的響應(yīng)頭;
2.具體用法
# 引入所需要的庫
import os
import urllib.request
# 定義回調(diào)函數(shù)
def call_back(a, b, c):
"""
圖片下載回調(diào)
:param a: 已經(jīng)下載的數(shù)據(jù)塊
:param b: 數(shù)據(jù)塊的大小
:param c: 遠(yuǎn)程文件的大小
:return:
"""
per = 100.0 * a * b / c
if per > 100:
per = 100
print('%.2f%%' % per)
# 定義下下載的地址
url = 'http://www.baidu.com'
# 構(gòu)造文件保存路徑
path = os.path.abspath('.')
file_path = os.path.join(path, 'baidu.html')
# 進(jìn)行下載
urllib.request.urlretrieve(url, file_path, call_back)
urllib.parse 介紹
urlencode()
1.參數(shù)說明
query : url參數(shù),可以是字符串,也可以是字典;
encoding : 編碼方式;
2.具體用法
# 引入所需要的庫
import urllib.parse
# 參數(shù)數(shù)據(jù)
data = {
'name': '張三',
'age': 26
}
# 進(jìn)行編碼
ret = urllib.parse.urlencode(data)
print(ret)
parse_s()
1.參數(shù)說明
qs : url參數(shù),編碼后的字符串;
encoding : 字符方式;
2.具體用法
# 引入所需要的庫
import urllib.parse
# 參數(shù)數(shù)據(jù)
data = {
'name': '張三',
'age': 26
}
# 進(jìn)行編碼
ret1 = urllib.parse.urlencode(data)
print(ret1)
# 進(jìn)行解碼
ret2 = urllib.parse.parse_qs(ret1)
print(ret2)
urlparse()
1.參數(shù)說明
url : url地址字符串;
2.具體用法
# 引入所需要的庫
import urllib.parse
# 聲明url
url = "https://www.baidu.com/s?wd=urlparse&rsv_spt=1&rsv_iqid=0x921f00fe005646ef&issp=1&f=8"
# 進(jìn)行url解析
ret = urllib.parse.urlparse(url)
print(ret)
print('scheme:', ret.scheme) # 協(xié)議
print('netloc:', ret.netloc) # 域名服務(wù)器
print('path:', ret.path) # 相對路徑
print('params:', ret.params) # 路徑端參數(shù)
print('fragment:', ret.fragment) # 片段
print('query:', ret.query) # 查詢
# urlunparse() 與 urlparse() 對應(yīng)相反函數(shù)
# 使用urlparse的格式組合成一個url,可以直接將urlparse的返回傳遞組合
ret1 = urllib.parse.urlunparse(ret)
print(ret1)
urlsplit()
1.參數(shù)說明
url : url地址字符串;
2.具體用法
# 引入所需要的庫
import urllib.parse
# 聲明url
url = "https://www.baidu.com/s?wd=urlparse&rsv_spt=1&rsv_iqid=0x921f00fe005646ef&issp=1&f=8"
# 進(jìn)行url解析
ret = urllib.parse.urlsplit(url)
print(ret)
print('scheme:', ret.scheme) # 協(xié)議
print('netloc:', ret.netloc) # 域名服務(wù)器
print('path:', ret.path) # 相對路徑
print('fragment:', ret.fragment) # 片段
print('query:', ret.query) # 查詢
# urlunsplit() 與 urlsplit() 對應(yīng)相反函數(shù)
# 使用urlsplit的格式組合成一個url,可以直接將urlsplit的返回傳遞組合
ret1 = urllib.parse.urlunsplit(ret)
print(ret1)
# 此函數(shù)和urlparse函數(shù)的區(qū)別在于此函數(shù)沒有params
urljoin()
1.參數(shù)說明
qs : url參數(shù),編碼后的字符串;
encoding : 字符方式;
2.具體用法
# 引入所需要的庫
import urllib.parse
# 聲明url
url = "https://www.baidu.com/"
# 參數(shù)數(shù)據(jù)
data = {
'name': '張三',
'age': 26
}
# 格式化參數(shù)
data = urllib.parse.urlencode(data)
# 進(jìn)行url拼接
ret = urllib.parse.urljoin(url, data)
print(ret)
urllib.error 介紹
我們在爬蟲的時候發(fā)請求的時候難免出現(xiàn)錯誤,如訪問不到服務(wù)器或者訪問被禁止等等,error分為URLError和HTTPError兩類:
1.URLError
沒有網(wǎng)
服務(wù)器鏈接失敗
找不大指定服務(wù)器
2.HTTPError
是URLError的子類
3.兩者區(qū)別和聯(lián)系
1).URLError封裝的錯誤信息一般是由網(wǎng)絡(luò)引起的,包括url錯誤
2).HTTPError封裝的錯誤信息一般是服務(wù)器返回了錯誤狀態(tài)碼
3).URLError是OSERROR的子類,HTTPError是URLError的子類
4).【注意】兩個同時捕獲的時候需要將子類放在上面,父類放在下面
用法
# 引入所需要的庫 import urllib.error import urllib.request # 一個訪問異常的url url = 'https://www.mz.com/156427/100' # 捕獲異常 try: ret = urllib.request.urlopen(url) print(ret) except urllib.error.HTTPError as e: print(e.getcode()) except urllib.error.URLError as e: print(e)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python爬蟲開發(fā)之使用python爬蟲庫requests,urllib與今日頭條搜索功能爬取搜索內(nèi)容實(shí)例
- python爬蟲開發(fā)之urllib模塊詳細(xì)使用方法與實(shí)例全解
- Python爬蟲 urllib2的使用方法詳解
- python爬蟲 urllib模塊url編碼處理詳解
- python爬蟲 urllib模塊反爬蟲機(jī)制UA詳解
- Python3爬蟲之urllib攜帶cookie爬取網(wǎng)頁的方法
- python爬蟲之urllib,偽裝,超時設(shè)置,異常處理的方法
- python爬蟲之urllib3的使用示例
- python利用urllib實(shí)現(xiàn)爬取京東網(wǎng)站商品圖片的爬蟲實(shí)例
- python爬蟲基礎(chǔ)之urllib的使用
相關(guān)文章
Python中pygame的mouse鼠標(biāo)事件用法實(shí)例
這篇文章主要介紹了Python中pygame的mouse鼠標(biāo)事件用法,以完整實(shí)例形式詳細(xì)分析了pygame響應(yīng)鼠標(biāo)事件的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11
使用Python創(chuàng)建一個隨機(jī)密碼生成器
密碼安全是當(dāng)前數(shù)字時代的一個重要議題,在保護(hù)個人信息和賬戶安全方面,安全且可靠的密碼是至關(guān)重要的,本文將帶您逐步了解如何使用Python創(chuàng)建一個隨機(jī)密碼生成器,以生成高強(qiáng)度、難以猜測的密碼,需要的朋友可以參考下2024-01-01
使用 Python 玩轉(zhuǎn) GitHub 的貢獻(xiàn)板(推薦)
這篇文章主要介紹了使用 Python 玩轉(zhuǎn) GitHub 的貢獻(xiàn)板的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04
Python實(shí)現(xiàn)Socket.IO的在線游戲場景方式
本文介紹了Socket.IO的基本概念、應(yīng)用場景,并通過一個簡單的多人在線實(shí)時對戰(zhàn)游戲案例,展示了如何使用Python和Socket.IO庫實(shí)現(xiàn)實(shí)時通信,Socket.IO的核心是事件驅(qū)動模型,支持WebSocket協(xié)議,并在不支持的情況下回退到其他傳輸方式2025-01-01
Python讀取excel文件中帶公式的值的實(shí)現(xiàn)
這篇文章主要介紹了Python讀取excel文件中帶公式的值的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python基于HOG+SVM/RF/DT等模型實(shí)現(xiàn)目標(biāo)人行檢測功能
這篇文章主要介紹了Python基于HOG+SVM/RF/DT等模型實(shí)現(xiàn)目標(biāo)檢測[行人檢測],今天這里并不是說要做出怎樣的效果,而是基于HOG+SVM來實(shí)踐機(jī)器學(xué)習(xí)檢測的流程,需要的朋友可以參考下2022-06-06
Python 爬蟲學(xué)習(xí)筆記之正則表達(dá)式
正則表達(dá)式是用來匹配字符串非常強(qiáng)大的工具,在其他編程語言中同樣有正則表達(dá)式的概念,Python同樣不例外,利用了正則表達(dá)式,我們想要從返回的頁面內(nèi)容提取出我們想要的內(nèi)容就易如反掌了。2016-09-09

