天天看點

python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三

urllib.parse子產品

該子產品可以完成對url的編解碼。

先看一段代碼,進行編碼。

python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三
python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三

此時檢視結果,程式顯示TypeError錯誤,urlencode函數第一參數要求是一個字典或者二進制組序列。

我們修改代碼:

from urllib import parse

d = {
      'id':1
      'name': 'tom'
}

url = 'http://www.magedu.com/python'
u = parse.urlencode(d)
print(u)           

執行結果:

python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三

我們将結果拼接:

url = 'http://www.magedu.com/python?id=1&name=tom'           

此時,類似于查詢字元串,相當于get方法

若再次修改:

url = 'http://www.magedu.com/python'
body 'id=1&name=tom'           

則此時相當于post請求。

from urllib import parse

d = {
      'id':1
      'name': 'tom'
      'url': 'http://www.magedu.com/python?id=1&name=tom'
}

u = parse.urlencode(d)
print(u)           
python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三

我們修改name為“張三”:

'name': '張三'           
python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三
python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三

從運作結果來看冒号、斜杠、&、等号、問号等符号全部被編碼了,%之後實際上是單位元組十六進制表示的值。

一般來說url中的位址部分, 一般不需要使用中文路徑, 但是參數部分, 不管GET還是POST方法, 送出的資料中,可能有斜杆、等号、問号等符号,這樣這些字元表示資料,不表示元字元。如果直接發給伺服器端,就會導緻接收方無法判斷誰是元字元, 誰是資料了。為了安全, 一般會将資料部分的字元做url編碼, 這樣就不會有歧義了。後來可以傳送中文, 同樣會做編碼, 一般先按照字元集的encoding要求轉換成位元組序列, 每一個位元組對應的十六進制字元串前加上百分号即可。

網頁使用utf-8編碼:

python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三

之前都是進行編碼過程,現在來看一下解碼的過程:

from urllib import parse

d = {
      'id':1
      'name': 'tom'
      'url': 'http://www.magedu.com/python?id=1&name=tom'
}

u = parse.urlencode(d)
print(u)

x = parse.unquote(u)
print(x)           
python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三

以上就是對parse子產品的介紹,其餘的我們不再進行示範了,下面來了解method方法。

送出方法method

最常用的HTTP互動資料的方法是GET、POST。

GET方法, 資料是通過URL傳遞的, 也就是說資料是在HTTP封包的header部分。POST方法, 資料是放在HTTP封包的body部分送出的。

資料都是鍵值對形式, 多個參數之間使用&符号連接配接。例如a=1&b=abc

GET方法

連接配接 必應 搜尋引擎官網,擷取一個搜尋的URL

http://cn.bing.com/search?q=馬哥教育

需求

請寫程式完成對關鍵字的bing搜尋, 将傳回的結果儲存到一個網頁檔案。

from urllib import parse

base_url = 'http://cn.bing.com/search'
d = {
      'q':'馬哥教育'
}

u = parse.urlencode(d)
url = '{}?{}'.format(base_url, u)

print(url)
print(parse.unquote(url))           
python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三

此時不能送出請求。我們添加代碼:

from urllib.request import urlopen, Request

ua = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"

req = Request(url, headers={
    'User-agent':ua
})

with urlopen(req) as res:
    with open('o:/bing.html', 'wb+') as f:
        f.write(res.read())
        f.flush()           

程式執行成功。這是對特定頁面的爬取。

python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三
python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三

POST方法

http://httpbin.org/

測試網站

python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三
python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三

我們來測試一下:

from urllib import parse
from urllib.request import urlopen, Request
import simplejson

url = 'http://httpbin.org/post'  # POST
data = parse.urlencode({'name':'張三,@=/&*', 'age':'6' })    # body
ua = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"

req = Request(url, headers={
    'User-agent':ua
})

print(data)

with urlopen(req, data=data.encode()) as res:  # POST請求,data不能為None
    text = res.read()           
python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三

列印一下d的類型

print(type(d))           
python爬蟲URL編碼和GETPOST請求 | python爬蟲實戰之三

通過這種方式就實作了post互動,我們将data送出上去,就是發送post請求,如果對方的網站有響應,會傳回資料,傳回的資料是正好是json,是以對其用simplejson進行轉換。我們是需要根據網站傳回的結果,去選擇合适的方法處理轉換資料。

配套視訊課程,點選這裡檢視

擷取更多資源請訂閱

Python學習站