urllib是python內置一個處理url的函數,在Python3中還有urllib3,但urllib3基本上能夠使用requests替代html
官方文檔:https://docs.python.org/3.7/library/urllib.html#module-urllibpython
urllib 側重於 url 基本的請求構造,urllib2側重於 http 協議請求的處理,而 urllib3是服務於升級的http 1.1標準,且擁有高效 http鏈接池管理及 http 代理服務的功能庫,從 urllib 到 urllib2和 urllib3是順應互聯應用升級浪潮的,這股浪潮從通用的網絡鏈接服務到互聯網網絡的頭部應用:支持長鏈接的 http 訪問,網絡訪問不斷的便捷化。json
URL解析函數的重點是將URL字符串拆分爲其組件,或者將URL組件組合爲URL字符串。api
將URL解析爲六個組件,返回一個6元組。這對應於URL的通常結構:scheme://netloc/path;每一個元組項都是一個字符串,可能爲空。組件沒有被分割成更小的部分(例如,網絡位置是一個字符串),而且%轉義沒有擴展。上面所示的分隔符不是結果的一部分,除了path組件中的前導斜槓(若是存在的話會保留它)。例如:網絡
>>> from urllib.parse import urlparse >>> o = urlparse("http://www.cwi.nl:80/%7Eguido/Python.html") >>> o # doctest: +NORMALIZE_WHITESPACE ParseResult(scheme="http", netloc="www.cwi.nl:80", path="/%7Eguido/Python.html", params="''", query="", fragment="") >>> o.scheme "http" >>> o.port 80 >>> o.geturl() "http://www.cwi.nl:80/%7Eguido/Python.html"
遵循RFC 1808中的語法規範,urlparse只在netloc由' // '正確引入時才識別它。不然,輸入被假定爲一個相對URL,所以從一個路徑組件開始。app
>>> from urllib.parse import urlparse >>> urlparse("//www.cwi.nl:80/%7Eguido/Python.html") ParseResult(scheme="", netloc="www.cwi.nl:80", path="/%7Eguido/Python.html", params="", query="", fragment="") >>> urlparse("www.cwi.nl/%7Eguido/Python.html") ParseResult(scheme="", netloc="", path="www.cwi.nl/%7Eguido/Python.html", params="", query="", fragment="") >>> urlparse("help/Python.html") ParseResult(scheme="", netloc="", path="help/Python.html", params="", query="", fragment="")
from urllib import parse # 將列表元素拼接成url url = ["http", "www", "baidu", "com", "dfdf", "eddffa"] # 這裏至少須要6個元素 print(parse.urlunparse(url)) # 下面是結果 http://www/baidu;com?dfdf#eddffa
# 鏈接兩個參數的url, 將第二個參數中缺的部分用第一個參數的補齊,若是第二個有完整的路徑,則以第二個爲主 print(parse.urljoin("https://movie.douban.com/", "index")) print(parse.urljoin("https://movie.douban.com/","https://accounts.douban.com/login")) # 下面是結果 https://movie.douban.com/index6 https://accounts.douban.com/login
urllib庫裏面有個urlencode函數,能夠把key-value這樣的鍵值對轉換成咱們想要的格式,返回的是a=1&b=2這樣的字符串,好比:函數
>>> from urllib import parse >>> data = { ... "a": "test", ... "name": "魔獸" ... } >>> print(parse.urlencode(data)) # a=test&name=%C4%A7%CA%DE 若是隻想對一個字符串進行urlencode轉換,怎麼辦?urllib提供另一個函數:quote() >>> from urllib import quote >>> quote("魔獸") # '%C4%A7%CA%DE'
當urlencode以後的字符串傳遞過來以後,接受完畢就要解碼了——urldecode。urllib提供了unquote()這個函數,可沒有urldecode()!post
>>> from urllib import parse >>> parse.unquote("%C4%A7%CA%DE") "\xc4\xa7\xca\xde" >>> print unquote("%C4%A7%CA%DE") 魔獸
from urllib import parse data = "from=2018-07-18+16%3A00%3A00&to=2018-07-18+18%3A00%3A00&page=1&size=1" print(parse.parse_qs(data)) # {"from": ["2018-07-18 16:00:00"], "to": ["2018-07-18 18:00:00"], "page": ["1"], "size": ["1"]} print(parse.parse_qsl(data)) # [("from", "2018-07-18 16:00:00"), ("to", "2018-07-18 18:00:00"), ("page", "1"), ("size", "1")]
import requests import json from urllib import parse HEADERS = {"Content-Type": "application/x-www-form-urlencoded;charset=utf-8"} url = "https://api.newrank.cn/api/sync/weibo/trend" FormData = {"from": "2018-07-18 16:00:00", "to": "2018-07-18 18:00:00", "page": 1, "size": 1} data = parse.urlencode(FormData) # from=2018-07-18+16%3A00%3A00&to=2018-07-18+18%3A00%3A00&page=1&size=1 content = requests.post(url=url, headers=HEADERS, data=data).text content = json.loads(content) print(content) # {'data': [], 'code': 1104, 'msg': 'Key無效'}