python爬蟲 - url編碼和post請求 - 筆記

urllib.parse模塊

parse.urlencode() 可以對k-v字典數據進行編碼,對url進行編碼可以讓網站方便讀取我們想要獲取的信息,以免產生歧義。

from urllib.parse import unquote, urlencode

data = {
    "name": "Tom",
    "country": "美國",
    "age": 23
}

# 編碼
print(urlencode(data))
# name=Tom&country=%E7%BE%8E%E5%9B%BD&age=23

# 解碼
print(unquote("name=Tom&country=%E7%BE%8E%E5%9B%BD&age=23"))
# name=Tom&country=美國&age=23
————————————————
版權聲明:本文爲CSDN博主「彭世瑜」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/mouday/article/details/103703122

例:

  1. 定義url和需要編碼的字典變量
  2. 對字典變量進行url編碼;parse.urlencode(dic)
  3. 將url與編碼後的字典組合
from urllib import parse
base_url = 'http://cn.bing.com/search'
d = {'q': '三國'}
dic_ed = parse.urlencode(d)  # url編碼
url = '{}?{}'.format(base_url, dic_ed)
print(url) 
print(parse.unquote(url))    # url解碼

輸出:
unquote(url)可以對已經編碼的url進行解碼

http://cn.bing.com/search?q=%E4%B8%89%E5%9B%BD
http://cn.bing.com/search?q=三國

第一行爲我們目標URL

提交方法

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

GET方法

from urllib import parse
base_url = 'http://cn.bing.com/search'
d = {'q': '三國'}
dic_ed = parse.urlencode(d)  # url編碼
print(dic_ed)
url = '{}?{}'.format(base_url, dic_ed)

# d = parse.unquote(u)  # url解碼
print(url)
print(parse.unquote(url))

from urllib.request import urlopen, Request

ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"

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

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

POST方法

from urllib import parse
from urllib.request import urlopen, Request
import simplejson
url = 'http://httpbin.org/post'
data = parse.urlencode({
    'name': '張三,@=/&*',
    'age': '6'
})  # body
ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
req = Request(url, headers={'User-agent': ua})

with urlopen(req, data=data.encode()) as res:  # post請求,data不能是None
    # with open('/path/myspider/bing.html',
    #           'wb+'
    #           ) as f:
    #     f.write(res.read())
    #     f.flush()
    text = res.read()
    d = simplejson.loads(text)  # 對獲取的數據進行轉換
    print(d)

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