文章目錄
URLlib庫概述
URLlib是python提供的一個用於操作URL的模塊,常用於爬取網頁,python3.x中將python2.x中的URLlib和URLlib2合併成爲新的URLlib。
使用URLlib爬取網頁
-
導入URLlib.request
import urllib.request
-
使用urllib.request.urlopen打開需要爬取的網站並用web接收一下
web=urllib.request.urlopen('http://www.baidu.com')
-
讀取網頁內容
data=web.read() #讀取網頁的全部內容 dataline=web.readline() #讀取網頁的一行內容
-
查看網頁內容
-
將網頁存到本地
urlllib.request.urlretrieve(url,filename)- url:網頁的網址
- filename:存放文件的地址與名稱
urllib.request.urlretrieve('http://www.baidu.com','./baidu. html')
打開文件
全過程import urllib.request web=urllib.request.urlopen('http://www.baidu.com') data=web.read() #讀取網頁的全部內容 dataline=web.readline() #讀取網頁的一行內容 print(dataline) print('-------------------') print(data) urllib.request.urlretrieve('http://www.baidu.com','./baidu.html')
urllib常用方法
- urllib.request.urlcleanup()
清除urlretrieve()執行時產生的緩存urllib.request.urlcleanup()
- 網頁.info()
返回當前環境有關的信息
因爲之前將爬取的網頁賦值給了web,所以直接使用web.info()即可
- 網頁.getcode()
返回當前爬取網頁的狀態碼,200爲正確,其他均爲不正確
- 網頁.geturl()
返回當前爬取的URL地址
- urllib.request.quote()
因爲URL標準中不允許漢字、:、&等字符的出現,所以如果我們需要輸入這些字符時需要編碼
- urllib.request.unquote()
對編碼後的網址解碼查看原網址
瀏覽器僞裝
在爬取某些網頁時會出現403錯誤,是因爲這些網頁設置了反爬蟲措施。此時,我們可以設置Headers屬性僞裝成瀏覽器去訪問這些網站。
獲取瀏覽器Headers屬性
打開百度網頁→右鍵檢查→上方network→點擊左邊all→點擊百度一下,使網頁發生動作→找到左下方最上邊的www.baidu.com→點擊後找到後邊最下方的User-Agent,並將後面的值複製出來
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36
使用build_opener()修改報頭
此處以爬取my前一篇博客爲例
-
直接使用之前的方法爬取
urllib.request.urlretrieve('https://blog.csdn.net/Late_whale/article/details/104559134','./baidu.html')
查看結果,發現該方法會被重定向到csdn首頁
-
導入URLlib.request
import urllib.request
-
定義一個url用於存儲網址url
url='https://blog.csdn.net/Late_whale/article/details/104559134'
-
定義headers用於存儲之前的Headers
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36")
-
定義一個urllib.request.build_opener()對象
opener=urllib.request.build_opener() opener.address=[headers]
-
開始爬取數據
data=opener.open(url).read()
-
將數據存進html文件
file=open('./test.html','web') file.write(data) file.close()
-
爬取完畢後查看結果
爬取成功
使用add_header()添加報頭
- urllib.request.Request(url).add_header(‘User-Agent’,value)
- url:需要爬取的網址url
- value:瀏覽器的headers屬性值
import urllib.request
url='https://blog.csdn.net/Late_whale/article/details/104559134'
req=urllib.request.Request(url) #創建Request對象
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36")# 添加報頭信息格式:對象名.add_header()
data=urllib.request.urlopen(req).read()#打開網址
file=open('./test_add.html','wb')
file.write(data)
file.close()
超時設置
在我們訪問一個網頁時,如果該網頁長時間未響應,則系統會判斷超時。我們可以根據自己的需求來設置超時的時間值。
設置超時時間值爲10秒鐘
urllib.request.urlopen('http://www.baidu.com',timeout=10)
http協議請求
http協議用於進行客戶端和服務器端之間的消息傳遞,http協議請求主要分爲6類
- get請求:get請求通過URL網址傳遞信息,可以直接在URL中寫上要傳遞的信息,也可以由表單傳遞,如果用表單傳遞信息,表單中的信息會自動轉化爲URL地址中的數據,通過URL地址傳遞
- post請求:可以向服務器提交數據,是一種常用也比較安全的數據傳遞方式,登錄時常使用該方式
- put請求:請求服務器存儲一個資源,通常要直到存儲的位置
- delete請求:請求服務器刪除一個資源
- head請求:請求獲取http報頭信息
- options請求:獲取當前URL支持的請求類型
- 另外trace請求和contact請求用得不多就不講解了
代理服務器設置
用同一個ip地址去爬取同一個網頁上時間久了會被屏蔽,我們可以用代理服務器來解決這個問題,這樣我們自己爬取是用的就不是自己的IP了
urllib.request.ProxyHandler({‘http’:proxy_add})用於設置代理服務器信息
- proxy_add:代理服務器ip地址:端口
urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
創建一個自定義opener對象
- proxy:代理服務器信息
- urllib.request.HTTPHandler:urllib.request.HTTPHandler類
data=urllib.request.urlopen(url).read().decode(‘utf-8’)
打開url對應的網址並指定編碼爲utf-8
使用正確的代理ip,爬取成功
def proxy(proxy_add,url):
import urllib.request
proxy=urllib.request.ProxyHandler({'http':proxy_add})
opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
data=urllib.request.urlopen(url).read().decode('utf-8')
return data
proxy_add='194.75.157.1:7777'
data1=proxy(proxy_add,'http://www.baidu.com')
print(data1)
DebugLog
開啓DebugLog,即可打印程序運行日誌
-
將urllib.request.HTTPHandler(debuglevel=1)和urllib.request.HTTPSHandler(debuglevel=1)裏debuglevel設置爲1
hh=urllib.request.HTTPHandler(debuglevel=1) hsh=urllib.request.HTTPSHandler(debuglevel=1)
-
urllib.request.build_opener(hh,hsh)
用前面設置好的變量做參數定義opener對象opener=urllib.request.build_opener(hh,hsh)
-
urllib.request.install_opener(opener)創建全局默認opener對象,在調用urlopen時也會使用我們自定義的opener對象
urllib.request.install_opener(opener)
-
訪問網頁
data=urllib.request.urlopen('http://www.baidu.com')
import urllib.request
hh=urllib.request.HTTPHandler(debuglevel=1)
hsh=urllib.request.HTTPSHandler(debuglevel=1)
opener=urllib.request.build_opener(hh,hsh)
urllib.request.install_opener(opener)
data=urllib.request.urlopen('http://www.baidu.com')
URLRrror
通常情況下,產生URLError的情況如下:
- 連接不上服務器
- URL不存在
- 無網絡
- 觸發了HTTPRrror(返回狀態碼)
我們可以導入urllib.error使用try……catch語句對異常進行處理
服務器返回的狀態碼及其意義
狀態碼 | 意義 |
---|---|
200 | OK,一切正常 |
301 | Moved Permanently,永久性地重定向到新URL |
302 | Found,暫時地重定向到新URL |
304 | Not Modified,請求的資源未更新 |
400 | Bad Request,非法請求 |
401 | Unauthorized,請求未經允許 |
403 | Forbidden,禁止訪問 |
404 | Not Found,找不到該頁面 |
500 | Internal Server Error,服務器內部錯誤 |
501 | Not Implemented,服務器不支持請求的操作 |
通常情況下我們都是先用HTTPError進行異常處理,若無法處理在用URLError進行異常處理
該情況下,無論何種異常都可以解決
訪問一個不存在的網頁
import urllib.request
import urllib.error
try:
urllib.request.urlopen('http://www.aaa.com')
except urllib.error.HTTPError as e:
print(e.code)
except urllib.error.URLError as e:
print(e.reason)