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)

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