Python之網絡爬蟲(2)

本博客內容來自韋瑋老師網絡爬蟲課堂筆記,僅用於個人學習和複習,請勿轉載用於其他商業用途。

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麼……

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章