目錄
一、urllib異常?
三、urllib?handler 處理器的基本使用
四、urllib 代理和代理池
參考
一、urllib異常?
URLError/HTTPError
簡介:
1.HTTPError類是URLError類的子類
2.導入的包urllib.error.HTTPError? urllib.error.URLError
3.http錯誤:http錯誤是針對瀏覽器無法連接到服務器而增加出來的錯誤提示。引導并告訴瀏覽者該頁是哪里出了問題。
4.通過urllib發送請求的時候,有可能會發送失敗,這個時候如果想讓你的代碼更加健壯,可以通過try-except進行捕捉異常,異常有兩類URLError和HTTPError
完整代碼:
# 異常
# URLError/HTTPErrorfrom urllib.error import URLError
from urllib.error import HTTPError
import urllib.request# 正確url
# url = 'https://blog.csdn.net/m0_45447650/article/details/1342414341'# 地址錯誤
url = 'https://blog.csdn.net/m0_45447650/article/details/1342414341'
# 主機名錯誤
# url = 'https://blob.csdn.net/m0_45447650'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}
try:# 請求對象定制request = urllib.request.Request(url, headers = headers)# 獲取網頁源碼response = urllib.request.urlopen(request)content = response.read().decode('utf-8')print(content)
except HTTPError:print('url地址寫錯了')
except URLError:print('url主機名錯了')
二、urllib cookie登錄
# 微博的cookie登錄
# 應用場景: 數據采集時,繞開登錄,進入到某個頁面
完整代碼:
# 微博的cookie登錄
# 應用場景: 數據采集時,繞開登錄,進入到某個頁面# 個人信息界面是utf-8,但還是報編碼錯誤,因為并沒有進入到個人信息頁面,而是跳轉到登錄頁面,登錄頁面不是utf-8,所以報錯。
# 什么情況下訪問不成功,請求頭的信息不夠才會訪問不成功
# refere :防盜鏈,判斷當前路徑是不是由上一個路徑進來的,一般情況下是做圖片的防盜鏈
import urllib.request
url = 'https://weibo.com/你的微博主頁'
headers = {"User-Agent": "主頁的UA",'Cookie':'主頁的CK','Referer':'https://weibo.com/'
}
request = urllib.request.Request(url, headers = headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
with open ('weibo.html', 'w',encoding='utf-8') as file:file.write(content)
三、urllib?handler 處理器的基本使用
?為什么要學handler?
urllib.request.urlopen(url)
?????? 不能定制請求頭
urllib.request.Request(url,header,data)
?????? 可以定制請求頭
handler
?????? 定制更高級的請求頭(隨著業務邏輯的復雜,請求對象的定制已經滿足不了我們的需求(動態cookie和代理不能使用請求對象的定制))
使用handler三步:
1.獲取handler對象
2.獲取opener對象
3.調用open方法
完整代碼:
# 使用handler訪問百度,獲取網頁源碼import urllib.request
url = 'http://www.baidu.com'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}# 請求對象定制
request = urllib.request.Request(url, headers=headers)# handler build_opener open
# 1.獲取handler對象
handler = urllib.request.HTTPHandler()
# 2.獲取opener對象
opener = urllib.request.build_opener(handler)
# 3.調用open方法
response = opener.open(request)content = response.read().decode('utf-8')
print(content)
四、urllib 代理和代理池
?1.代理的常用功能?
(1).突破自身IP訪問限制,訪問國外站點
(2).訪問一些單位或團體內部資源
擴展:某大學FTP(前提是該代理地址在該資源的允許訪問范圍之內),使用教育網內地址段免費代理股務器,就可以用于對教育網開放的各類FTP下載上傳,以及各類資料查詢共亨等服務,
(3).提高訪問速度
擴展: 通常代理服務器都設置一個較大的硬盤緩沖區,當有外界的信息通過時,同時也將其保存到緩沖區中,當其他用戶再訪問相同的信息時, 則直接由緩沖區中取出信息,傳給用戶,以提高訪問速度,
(4).隱感真實IP
擴展:上網者也可以通過這種方法隱藏自己的IP,免受攻擊
2.代碼配置代理
創建Reuqest對象
創建ProxyHandler對象
用handler對象創建opener對象
使用opener.open函數發送請求
使用handler模擬客戶端向服務器發送請求
# handler build_opener open
handler = urllib.request.ProxyHandler(proxies=proxies)
opener = urllib.request.build_opener(handler)
response = opener.open(request)
設置一個簡單的代理池
# 代理池
proxies_pool= [# 'key':'主機'+'端口號'{'http':'61.216.185.88:60808'},{'http':'182.140.244.163:8118'}
]
import random
proxies = random.choice((proxies_pool))
完整代碼
import urllib.request
url = 'https://www.baidu.com/s?wd=ip'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}# 請求對象定制
request = urllib.request.Request(url, headers=headers)
# response = urllib.request.urlopen(request)# 獲取免費快代理 https://www.kuaidaili.com/free/
# 代理 ip 以字典的方式存在
proxies = {# 'key':'主機'+'端口號''http':'61.216.185.88:60808'
}"""
# 代理池
proxies_pool= [# 'key':'主機'+'端口號'{'http':'61.216.185.88:60808'},{'http':'182.140.244.163:8118'}
]
import random
proxies = random.choice((proxies_pool))
"""# handler build_opener open
handler = urllib.request.ProxyHandler(proxies=proxies)
opener = urllib.request.build_opener(handler)
response = opener.open(request)content = response.read().decode('utf-8')
print(content)
# with open ('weibo.html', 'w',encoding='utf-8') as file:
# file.write(content)
參考
尚硅谷Python爬蟲教程小白零基礎速通(含python基礎+爬蟲案例)