python爬蟲學習第四章
Urllib庫與URLError異常處理
什麽是Urllib庫
Urllib是Python提供的一個用於操作URL的模塊。
快速使用Urllib爬取網頁
首先導入模塊import urllib.request
導入後,爬取file = urllib.request.urlopen("http://www.baidu.com")
讀取,三種方式
1. file.read()讀取文件的全部內容,與readlines不同的是,read會把讀取到的內容賦給一個字符串變量
2. file.readlines()讀取文件的全部內容,與read不同的是,readlines會把讀取到的內容賦給一個列表變量,若要讀取全部內容,推薦使用這種方式
3. File.readline()讀取文件的一行文件。
如何將爬取到的網頁保存到本地以網頁形式
1. 首先,爬取一個網頁並將爬取到的內容賦值給一個變量。
2. 以寫入的方式打開一個本地文件,命名為*.html等網絡格式。
3. 將1中變量寫入文件
4. 關閉該文件。fhandle=open(r"C:\Users\My\Desktop\git學習\1.html",‘wb‘)
fhandle.write(file.read())
fhandle.close()
urlretreve()函數
直接將對應信息寫入文件。格式:urllib.request.urlretrieve(url,filename=本地文件地址)
urllib.request.urlretrieve("http://www.51cto.com/",filename=r"C:\Users\My\Desktop\git學習\2.html")
urlretrieve執行的過程中,會產生緩存,清除緩存urllib.request.urlcleanup()
獲取與當前環境相關的信息使用info。file.info()
獲取當前爬取網頁的狀態碼,使用getcode(),若返回200為正確,返回其他的不正確。file.getcode()
獲取爬取網頁的URL,使用geturl()file.geturl()
一般來說,URL標準中只會允許一部分ASCII字符比如數字、字母、部分符號等,而其他的一些字符,比如漢字等,是不符合URL標準的。所以如果我們在URL中使用一些其他不符合標準的字符就會出現問題,此時需要進行URL編碼方可解決。比如在URL中輸入中文或者“:”或者“&”等不符合標準的字符時,需要編碼。
如果要進行編碼,使用urllib.request.quete()進行,比如,我們對“http://www.sina.com.cn"進行編碼。urllib.reqeust.quote("http://www.sina.com.cn")
輸出‘http%3A//www.sina.com.cn‘
解碼urllib.request.unquote("http%3A//www.sina.com.cn")
輸出‘http://www.sina.com.cn‘
瀏覽器的模擬---Headers屬性
有時候,我們無法爬取一些網頁,出現403錯誤,這是因為這些網頁為了防止別人惡意采集信息進行的反爬蟲的設置。
如果想爬取,我們可以設置Headers信息,模擬成瀏覽器去訪問這些網站。設置Headers,首先需要的是找出User-Agent。
有兩種方法讓爬蟲模擬成瀏覽器範文網頁
1. 使用buildopener()修改報頭import urllib.request
url="網頁地址"
headers=("User-Agent","瀏覽器裏找到的User-Agent")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
data=opener.open(url).read()
fhandler=open("存放網頁的地址","wb")
fhandler.write(data)
fhandler.close()
2. 使用addheader()添加報頭import urllib.request
url="網頁地址"
req=urllib.request.Request(url)
req.add_header(‘User-Agent‘,"瀏覽器找到的User-Agent")
data=urllib.request.urlopen(req).read()
超時設置
有的時候,訪問一個網頁,如果該網頁長時間未響應,那麽系統判斷該網頁超時,即無法打開該網頁。import urllib.requestfile=urllib.request.urlopen("網頁地址",timeout=時間值)
HTTP協議請求實戰
HTTP協議請求主要分為6種類型。
1. GET請求:GET請求會通過URL網址傳遞信息,可以直接在URL中寫上要傳遞的信息,也可以有表單進行傳遞。如果使用表單進行傳遞,這表單中的信息會自動轉為URL地址中的數據,通過URL地址傳遞。
2. POST請求:可以向服務器提交數據,是一種比較主流也比較安全的數據傳遞方式,比如在登錄時,經常使用POST請求發送數據。
3. PUT請求:請求服務器存儲一個資源,通常要指定存儲的位置。
4. DELETE請求:請求服務器刪除一個資源
5. HEAD請求:請求獲取對應的HTTP報頭信息。
6. OPTIONS請求:可以獲得當前URL所支持的請求類型。
除此之外還有TRACE請求和CONNECT請求等,TRACE請求主要用於測試或診斷。
詳細講解GET與POST
- GET請求實例分析 import urllib.request
keywd="hello"
url="http://www.baidu.com/s?wd="+keywd
req=urllib.request.Request(url)
data=urllib.request.urlopen(req).read()
fhandle=open("文件存儲地址","wb")
fhandle=write(data)
fhandle.close()
當檢索中文會報錯。UnicodeEncodeError
import urllib.request
url="http://www.baidu.com/s?wd="
key="韋瑋老師"
key_code=urllib.request.quote(key)
url_all=url+key_code
req=urllib.request.Request(url_all)
data=urllib.request.urlopen(req).read()
fh=open("文件地址","wb")
fh.write(data)
fh.close()
使用GET請求,思路如下:
1. 構建對應的URL地址,該URL地址包含GET請求的字段名和字段內容等信息,並且URL地址滿足GET請求的格式,即“http://網址?字段名1=字段內容1&字段名2=字段內容2”。
2. 對應的URL為參數,構建Request對象。
3. 通過urlopen()打開構建的Request對象。
4. 按需求進行後續的處理操作。比如讀取網頁內容,或寫入文件。
- POST請求實例分析
使用Post請求,思路如下: 1. 設置好URL網址。
2. 構建表單數據,並使用urllib.parse.urlencode對數據進行編碼處理
3. 創建Request對象,參數包括URL地址和要傳遞的數據。
4. 使用add_header()添加頭信息,模擬瀏覽器進行爬取。
5. 使用urllib.request.urlopen()打開對應的Request對象,完成信息的傳遞。
6. 後續處理,比如讀取,寫入文件等。import urllib.request
import urllib.parse
url="網頁地址"
postdata=urllib.parse.urlencode({
‘name‘:‘aaa‘,
‘pass‘:‘bbb‘}).encode(‘utf-8‘)#將數據使用urlencode編碼處理後,使用encode()設置為utf-8編碼
req=urllib.request.Request(url,postdata)
req.add_header(‘User-Agent‘,‘User-Agent數據‘)
data=urllib.request.urlopen(req).read()
fd=open("存儲地址",‘wb‘)
fd.write(data)
fd.close()
代理服務器的設置
#代理服務器網站http://yum.iqianyue.com/proxy
def use_proxy(proxy_addr,url):
import urllib.request
proxy=urllib.request.ProxyHandler({‘http‘:proxy_addr})
opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
data=urllib.request.urlopen(url).read().decode(‘utf-8‘)
return data
proxy_addr="代理服務器地址加端口"
data=use_proxy(proxy_addr,"網頁地址")
print(len(data))
DebugLog實戰
異常處理神器----URLError實戰
import urllib.request
import urllib.error
try:
urllib.request.urlopen("網頁地址")
except urllib.error.URLError as e:
print(e.code)
print(e.reason)
輸出錯誤:
403
Forbidden
產生URLError的原因有如下幾種可能:1. 鏈接不上服務器2. 遠程URL不存在3. 無網絡4. 觸發了HTTPError403觸發了是URLError的子類HTTPError,所以可以改成import urllib.request
狀態碼含義:200 OK
import urllib.error
try:
urllib.request.urlopen("網頁地址")
except urllib.error.HTTPError as e:
print(e.code)
print(e.reason)
一切正常
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://blog.baidusss.net")
except urllib.error.HTTPError as e:
print(e.code)
print(e.reason)
except urllib.error.URLError as e:
print(e.reason)
python爬蟲學習第四章