用python怎樣爬網頁呢?其實就是根據URL來獲取它的網頁資訊!

shenmanli發表於2017-08-18
我們在瀏覽器中看到的畫面優美的介面,其實是由瀏覽器,對網頁內容做了解釋後,才呈現出來的類似word的WYSIWYG
實質它是一段HTML程式碼,加JS、CSS等。如果把網頁比作一個人,那麼HTML便是他的骨架,JS便是他的肌肉,CSS便是它的衣服。最重要的部分是存在於HTML中的。


用一個例子來爬網頁


import urllib2
response = urllib2.urlopen("http://www.baidu.com")
print response.read()


這個例子中,真正的程式就兩行,把它儲存成demo.py,進入該檔案的目錄,執行如下命令檢視執行結果。
python demo.py
可以看到這個網頁的原始碼已經被爬下來了。


網頁爬取方法


那麼我們來分析這幾行Python程式碼:
import urllib2
response = urllib2.urlopen("http://www.baidu.com")
print response.read()


第2行
response = urllib2.urlopen("http://www.baidu.com")
首先我們呼叫的是urllib2庫裡面的urlopen方法,傳入一個URL
這個網址是百度首頁,協議是HTTP協議
當然你也可以把HTTP換做FTP,FILE,HTTPS 等等,只是代表了一種訪問控制協議


三個引數
urlopen一般接受三個引數,它的引數如下:
urlopen(url, data, timeout)
第一個引數url即為URL,第二個引數data是訪問URL時要傳送的資料,第三個timeout是設定超時時間。
第一個引數URL是必須要傳送的,本例裡傳送了百度的URL
第二三個引數可以不傳,
data預設為空None
timeout預設為socket._GLOBAL_DEFAULT_TIMEOUT


執行urlopen方法之後,返回一個response物件,返回資訊便儲存在這裡面。
print response.read()
response物件有一個read方法,可以返回獲取到的網頁內容。


第3行
print response.read()
如果不加read直接列印會是什麼?
直接列印出了該物件的描述
<addinfourlat 139728495260376 whose fp= <socket._fileobjectobject at 0x7f1513fb3ad0>>
所以一定要加read方法


構造Requset
其實上面的urlopen引數,可以傳入一個request請求
它其實就是一個Request類的例項,構造時需要傳入Url,Data等等的內容。


比如上面的三行程式碼,我們可以這麼改寫
import urllib2
request = urllib2.Request("http://www.baidu.com")
response = urllib2.urlopen(request)
print response.read()


執行結果是完全一樣的,只不過中間多了一個request物件
推薦大家這麼寫,因為在構建請求時還需要加入好多內容
通過構建一個request,伺服器響應請求得到應答,這樣顯得邏輯上清晰明確。

相關文章