urllib--內置函數

python內置函數urllib

urllib是python內置一個處理url的函數,在Python3中還有urllib3,但urllib3基本上能夠使用requests替代html

官方文檔:https://docs.python.org/3.7/library/urllib.html#module-urllibpython

python內各類urlib的區別

urllib 側重於 url 基本的請求構造,urllib2側重於 http 協議請求的處理,而 urllib3是服務於升級的http 1.1標準,且擁有高效 http鏈接池管理及 http 代理服務的功能庫,從 urllib 到 urllib2和 urllib3是順應互聯應用升級浪潮的,這股浪潮從通用的網絡鏈接服務到互聯網網絡的頭部應用:支持長鏈接的 http 訪問,網絡訪問不斷的便捷化。json

urllib功能介紹(主要介紹parse):

  • urllib.request 用於打開和讀取url
  • urllib.error 包含urllib.request提出的異常
  • urllib.parse 解析url
  • urllib.robotparser 解析機器人。txt文件

URL Parsing

URL解析函數的重點是將URL字符串拆分爲其組件,或者將URL組件組合爲URL字符串。api

urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)

將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="")

將列表元素拼接成url

from urllib import parse
# 將列表元素拼接成url
url = ["http", "www", "baidu", "com", "dfdf", "eddffa"] # 這裏至少須要6個元素
print(parse.urlunparse(url))
# 下面是結果 http://www/baidu;com?dfdf#eddffa

urllib.parse.urljoin()

# 鏈接兩個參數的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

urlencode

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'

urldecode

當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")
魔獸

parse_qs parse_qsl

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無效'}
相關文章
相關標籤/搜索