開發與維運

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

urllib.parse模塊

該模塊可以完成對url的編解碼。
先看一段代碼,進行編碼。

image.png
image.png

此時查看結果,程序顯示TypeError錯誤,urlencode函數第一參數要求是一個字典或者二元組序列。
我們修改代碼:

from urllib import parse

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

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

執行結果:

image.png

我們將結果拼接:

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)

執行結果:

image.png

我們修改name為“張三”:

'name': '張三'

執行結果:

image.png
image.png

從運行結果來看冒號、斜槓、&、等號、問號等符號全部被編碼了,%之後實際上是單字節十六進制表示的值。

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

網頁使用utf-8編碼:

image.png

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

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)

執行結果:

image.png

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

提交方法method

最常用的HTTP交互數據的方法是GET、POST。

GET方法, 數據是通過URL傳遞的, 也就是說數據是在HTTP報文的header部分。POST方法, 數據是放在HTTP報文的body部分提交的。
數據都是鍵值對形式, 多個參數之間使用&符號連接。例如a=1&b=abc

GET方法

連接 必應 搜索引擎官網,獲取一個搜索的URLhttp://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))

執行結果:

image.png

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

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()

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

image.png
image.png

POST方法

http://httpbin.org/ 測試網站

image.png
image.png

我們來測試一下:

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()

執行結果:

image.png

打印一下d的類型

print(type(d))

執行結果:

image.png

通過這種方式就實現了post交互,我們將data提交上去,就是發送post請求,如果對方的網站有響應,會返回數據,返回的數據是正好是json,所以對其用simplejson進行轉換。我們是需要根據網站返回的結果,去選擇合適的方法處理轉換數據。

配套視頻課程,點擊這裡查看

獲取更多資源請訂閱Python學習站

Leave a Reply

Your email address will not be published. Required fields are marked *