Python爬蟲入門三之Urllib庫的基本使用

2021-10-01 07:55:38 字數 3235 閱讀 5125

1.分分鐘扒乙個網頁下來

怎樣扒網頁呢?其實就是根據url來獲取它的網頁資訊,雖然我們在瀏覽器中看到的是一幅幅優美的畫面,但是其實是由瀏覽器解釋才呈現出來的,實質它是一段html**,加 js、css,如果把網頁比作乙個人,那麼html便是他的骨架,js便是他的肌肉,css便是它的衣服。所以最重要的部分是存在於html中的,下面我們就寫個例子來扒乙個網頁下來。

import urllib2

response = urllib2.urlopen("")

print response.read()

是的你沒看錯,真正的程式就兩行,把它儲存成 demo.py,進入該檔案的目錄,執行如下命令檢視執行結果,感受一下。

看,這個網頁的原始碼已經被我們扒下來了,是不是很酸爽?

2.分析扒網頁的方法

那麼我們來分析這兩行**,第一行

response = urllib2.urlopen(「」)

urlopen(url, data, timeout)
第乙個引數url即為url,第二個引數data是訪問url時要傳送的資料,第三個timeout是設定超時時間。

第二三個引數是可以不傳送的,data預設為空none,timeout預設為socket._global_default_timeout

print response.read()
response物件有乙個read方法,可以返回獲取到的網頁內容。

如果不加read直接列印會是什麼?答案如下:

>
直接列印出了該物件的描述,所以記得一定要加read方法,否則它不出來內容可就不怪我咯!

3.構造request

其實上面的urlopen引數可以傳入乙個request請求,它其實就是乙個request類的例項,構造時需要傳入url,data等等的內容。比如上面的兩行**,我們可以這麼改寫

import urllib2

request = urllib2.request("")

response = urllib2.urlopen(request)

print response.read()

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

4.post和get資料傳送

上面的程式演示了最基本的網頁抓取,不過,現在大多數**都是動態網頁,需要你動態地傳遞引數給它,它做出對應的響應。所以,在訪問時,我們需要傳遞資料給它。最常見的情況是什麼?對了,就是登入註冊的時候呀。

把資料使用者名稱和密碼傳送到乙個url,然後你得到伺服器處理之後的響應,這個該怎麼辦?下面讓我來為小夥伴們揭曉吧!

資料傳送分為post和get兩種方式,兩種方式有什麼區別呢?

最重要的區別是get方式是直接以鏈結形式訪問,鏈結中包含了所有的引數,當然如果包含了密碼的話是一種不安全的選擇,不過你可以直觀地看到自己提交了什麼內容。post則不會在**上顯示所有的引數,不過如果你想直接檢視提交了什麼就不太方便了,大家可以酌情選擇。

post方式:

上面我們說了data引數是幹嘛的?對了,它就是用在這裡的,我們傳送的資料就是這個引數data,下面演示一下post方式。

import urllib

import urllib2

values =

data = urllib.urlencode(values)

url = ""

request = urllib2.request(url,data)

response = urllib2.urlopen(request)

print response.read()

我們引入了urllib庫,現在我們模擬登陸csdn,當然上述**可能登陸不進去,因為csdn還有個流水號的字段,沒有設定全,比較複雜在這裡就不寫上去了,在此只是說明登入的原理。一般的登入**一般是這種寫法。

我們需要定義乙個字典,名字為values,引數我設定了username和password,下面利用urllib的urlencode方法將字典編碼,命名為data,構建request時傳入兩個引數,url和data,執行程式,返回的便是post後呈現的頁面內容。

注意上面字典的定義方式還有一種,下面的寫法是等價的

import urllib

import urllib2

values = {}

values['username'] = "[email protected]"

values['password'] = "***x"

data = urllib.urlencode(values)

url = ""

request = urllib2.request(url,data)

response = urllib2.urlopen(request)

print response.read()

以上方法便實現了post方式的傳送

import urllib

import urllib2

values={}

values['username'] = "[email protected]"

values['password']="***x"

data = urllib.urlencode(values)

url = ""

geturl = url + "?"+data

request = urllib2.request(geturl)

response = urllib2.urlopen(request)

print response.read()

你可以print geturl,列印輸出一下url,發現其實就是原來的url加?然後加編碼後的引數

?username=1016903103%40qq.com&password=***x
和我們平常get訪問方式一模一樣,這樣就實現了資料的get方式傳送。

python網路爬蟲入門之URL編碼模組

為什麼要給位址 編碼 我們在瀏覽器裡面輸入查詢引數時瀏覽器會自動給我們進行編碼,當我們用爬蟲程式進行獲取內容時瀏覽器識別不了我們所輸入的內容,所以就要編碼給url位址中查詢引數進行編碼 編碼前 https 美女編碼後 https e7 be 8e e5 a5 b3 比如我們在瀏覽器裡輸入 美女 瀏覽...

Python爬蟲入門三

1.設定請求頭 我們繼續以教務系統為例,下面來模擬一下,用python登入教務系統,在入門二中分析了from data 中的資料,樣子是這樣的 from data username password x login b5 c7 a1 a1 c2 bc 那我們就在請求的時候將資料值傳過去 如下 imp...

python爬蟲之 入門基礎

可以參考我之前學習的時候 的一篇文章一次完整的http事務過程 超詳細 2.還需要了解一下http的請求方式 有興趣的同學可以去查一下http的八種請求方法,這裡呢主要說下get請求和post請求,這兩種在以後學習中會用到的比較多。get請求 get方法用於使用給定的uri從給定伺服器中檢索資訊,即...