本博客內容來自韋瑋老師網絡爬蟲課堂筆記,僅用於個人學習和複習,請勿轉載用於其他商業用途。
Urllib庫(二)
1、自動模擬HTTP請求
客戶端如果要與服務器端進行通信,需要通過http請求進行,http請求有很多種,這裏只講post和get兩種請求方式。登陸、搜索某些信息的時候會用到。
import urllib.request
keyword = "Python"
url = "http://www.baidu.com/s?wd=" + keyword
req = urllib.request.Request(url) #封裝成一個請求
data = urllib.request.urlopen(req).read()
fh = open("D:/PROGRAMMING/數據分析/Python數據分析與挖掘實戰視頻教程/實驗/2.html", "wb")
fh.write(data)
fh.close()
運行後我們可以看到,百度網頁被爬下來了,打開後顯示的是搜索“Python”後的結果。這裏面要注意的是,編寫代碼輸入網址時,不要寫成https://而要寫成http://,不然會由於證書的問題爬取失敗。
此外,還有編碼的問題:如果上面keyword出現的是中文,也運行的時候就會報錯。此時我們需要進行編碼上的操作。
keyword = "編程"
keyword = urllib.request.quote(keyword) #對中文進行編碼
url = "http://www.baidu.com/s?wd=" + keyword
req = urllib.request.Request(url)
data = urllib.request.urlopen(req).read()
fh = open("D:/PROGRAMMING/數據分析/Python數據分析與挖掘實戰視頻教程/實驗/2.html", "wb")
fh.write(data)
fh.close()
上面的例子中增加了一行代碼,keyword = urllib.request.quote(keyword)
2、處理POST請求
我們在登陸網站輸入用戶名和密碼的時候,會使用到POST請求。使用韋瑋老師的網站可以進行驗證:www.iqianyue.com/mupost/
首先我們需要分析一下這個網站:
<html>
<head>
<title>Post Test Page</title>
</head>
<body>
<form action="" method="post">
name:<input name="name" type="text" /><br>
passwd:<input name="pass" type="text" /><br>
<input name="" type="submit" value="submit" />
<br />
</body>
</html>
可以看到姓名的name的屬性對應的是"name",密碼的name屬性對應的是"pass"。我們要關注的就是name屬性所對應的值。
我們也可以用新浪的登陸頁面來試一下:網址爲www.login.sina.com.cn,然後我們查看頁面源代碼,通過搜索<form表單找到登陸相關代碼如下:
我們只要關注name所對應的值,因爲涉及到我們自己寫代碼時需要賦值的對象。可以看到,圖片中爲"username"。同理,密碼的值可以找到爲password。
import urllib.request
import urllib.parse
url = "http://www.iqianyue.com/mypost/"
my_data = urllib.parse.urlencode({
"name": "hello123",
"pass": "hello123"
}).encode("utf-8")
req = urllib.request.Request(url, my_data) #封裝爲請求後發過去
data = urllib.request.urlopen(req).read()
fh = open("D:/PROGRAMMING/數據分析/Python數據分析與挖掘實戰視頻教程/實驗/3.html", "wb")
fh.write(data)
fh.close()
奇怪的是,視頻裏面老師的操作成功了,但是我在實際操作過程中並沒有成功……很奇怪
3、爬蟲的異常處理
爬蟲在運行的過程中,很多時候都會遇到異常。如果沒有異常處理,爬蟲遇到異常時就會直接崩潰,停止運行,下次再次運行時,又會從頭開始。所以,要開發一個具有頑強生命力的爬蟲,必須有要進行異常處理。
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 | 服務器不支持實現請求所需要的功能 |
4、URLError與HTTPError類
兩者都是異常處理的類,HTTPError是URLError的子類,HTTPError有異常狀態碼與異常原因,URLError沒有異常狀態碼。所以,在處理的時候,不能使用URLError直接代替HTTPError。如果需要代替,必須判斷是否有狀態碼屬性。
URLError的主要原因包括:
1、連不上服務器
2、url不存在
3、本地沒有網絡
4、觸發了HTTPError中的異常
import urllib.request
import urllib.error
try:
urllib.request.urlopen("http://blog.csdn.net")
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
#
403
Forbidden
上面的例子我們故意去爬取CSDN的博客,肯定會被禁止訪問。通過使用hasattr()方法,可以檢查是否有錯誤代碼和原因。通過使用if語句,我們可以用URLError來代替HTTPError,如果不使用if語句是肯定不行的。
奇怪的是,我輸入上面的代碼並沒有出現異常,難道因爲我是vip麼……