1. 程式人生 > >Python3 urllib使用

Python3 urllib使用

Python3 urllib使用

基本使用 get,post,timeout超時,異常

# 姓名: 劉帥
# 日期: 2018.11.18
# 功能: urllib.request.urlopen使用方法
from urllib.request import urlopen  # 請求網頁
from urllib.parse import urlencode  # 字典轉字串轉碼
from urllib.error import URLError  # URLError錯誤


def urlA():  # GET請求
    res = urlopen('http://www.baidu.com')  # 開啟指定url
    print(res.read().decode('utf8'))  # 輸出響應內容
    print(type(res))  # 輸出函式返回資料型別
    print(res.status)  # 輸出響應狀態碼
    print(res.getheaders())  # 輸出響應頭
    print(res.getheader('Server'))  # 輸出響應頭Server內容 伺服器資訊
    return


def urlB():  # POST請求
    dataA = {'word': 'hello'}  # 定義post內容 引數word 值hello
    dataB = urlencode(dataA)  # 轉化為字串
    new_data = bytes(dataB, encoding='utf-8')  # 轉碼為位元組流
    res = urlopen('http://httpbin.org/post', data=new_data)  # post請求 new_data為post資料
    print(res.read().decode('utf-8'))  # 輸出響應內容
    return


def urlC():  # 設定timeout超時時間
    try:  # 異常處理
        res = urlopen('http://httpbin.org/', timeout=0.1)  # 開啟指定url, 設定超時時間0.1秒 超時跑出異常
    except URLError as err:  # 異常處理方法
        print(err.reason)
    else:  # 未丟擲異常則執行
        print(res.read().decode('utf8'))  # 輸出響應內容
        print(type(res))  # 輸出函式返回資料型別
        print(res.status)  # 輸出響應狀態碼
        print(res.getheaders())  # 輸出響應頭
        print(res.getheader('Server'))  # 輸出響應頭Server內容 伺服器資訊
    return

Requset使用 get,post,驗證,代理,Cookie儲存讀取,異常

# 姓名: 劉帥
# 日期: 2018.11.18
# 功能: urllib.request.Requset使用方法
from urllib.parse import urlencode  # 字典轉字串轉碼
from urllib.request import Request  # Request類
from urllib.request import urlopen  # 請求網頁
from urllib.request import URLError  # URLError錯誤
from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener  # 驗證
from urllib.request import ProxyHandler  # HTTP代理
from http.cookiejar import CookieJar
from http.cookiejar import MozillaCookieJar
from http.cookiejar import LWPCookieJar
from urllib.request import HTTPCookieProcessor
from urllib.request import HTTPError


def urlA():  # get請求
    req = Request('http://httpbin.org/get')  # 建立填充Requset類
    res = urlopen(req)  # 通過Requset類請求網頁
    print(res.read().decode('utf-8'))  # 輸出響應內容
    return


def urlB():  # post請求
    headersA = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36'
                              ' (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
                'Host': 'httpbin.org'}
    dataA = {'word': 'hello'}  # 定義字典 引數word 值hello
    dataB = urlencode(dataA)  # 轉化為字串
    dataC = bytes(dataB, encoding='utf-8')  # 轉碼為位元組流
    req = Request(url='http://httpbin.org/post', headers=headersA, data=dataC,
                  method='POST')  # 建立填充Requset類 data為post內容 headers為請求頭 method請求方式
    # req.add_header('Host', 'httpbin.org')  # 通過add_headers新增請求頭
    res = urlopen(req)  # 通過Requset類請求網頁
    print(res.read().decode('utf-8'))  # 輸出響應內容
    return


def urlC():  # 驗證
    username = 'LiuShuai'  # 使用者名稱
    password = 'Ls123456'  # 使用者密碼
    url = 'http://www.httpbin.org/basic-auth/LiuShuai/Ls123456'  # url網址
    p = HTTPPasswordMgrWithDefaultRealm()  # 建立HTTPPasswordMgrWithDefaultRealm物件
    p.add_password(None, url, username, password)  # 使用add_password新增賬號密碼
    auth_handler = HTTPBasicAuthHandler(p)  # 建立HTTPBasicAuthHandler物件 引數HTTPPasswordMgrWithDefaultRealm
    opener = build_opener(auth_handler)  # 構建Opener
    try:  # 異常處理
        res = opener.open(url)  # 開啟連線完成驗證返回登入後的頁面
    except URLError as err:  # 異常處理方法
        print(err.reason)
    else:  # 未丟擲異常執行
        print(res.read().decode('utf-8'))  # 輸出返回內容
    return


def urlD():  # 代理
    url = 'http://httpbin.org/get'  # url網址
    proxy = {'http': 'http://111.202.37.195:38431',
             'https': 'https://111.202.37.195:38431'}  # 代理字典
    proxy_handler = ProxyHandler(proxy)  # 通過ProxyHandler使用字典生成handler
    opener = build_opener(proxy_handler)  # 構造opener
    try:  # 異常處理
        res = opener.open(url)  # 開啟網址
    except URLError as err:  # 異常處理方法
        print(err.reason)
    else:  # 未異常則執行
        print(res.read().decode("utf-8"))  # 輸出返回內容
    return


def urlE():  # Cookie 普通使用, 無法儲存或讀取檔案
    cookie = CookieJar()  # 建立CookieJar類 無法儲存或讀取檔案
    handler = HTTPCookieProcessor(cookie)  # 構建handler
    opener = build_opener(handler)  # 構建opener
    try:  # 異常處理
        res = opener.open('http://www.baidu.com')  # 開啟連線
    except URLError as err:  # 異常處理方法
        print(err.reason)
    else:  # 未異常則執行
        for cke in cookie:  # 迴圈輸出cookie 的key  value
            print(cke.name, cke.value)  # 迴圈輸出cookie 的key  value
    return


def urlF():  # Cookie 高階使用, 可以儲存或讀取檔案
    cookie = MozillaCookieJar('1.txt')  # 建立MozillaCookieJar類 可以儲存或讀取檔案 傳入檔名
    cookie.load('1.txt', ignore_expires=True, ignore_discard=True)  # 讀取cookie檔案
    handler = HTTPCookieProcessor(cookie)  # 構建handler
    opener = build_opener(handler)  # 構建opener
    try:  # 異常處理
        res = opener.open('http://www.baidu.com')  # 開啟連線
    except URLError as err:  # 異常處理方法
        print(err.reason)
    else:  # 未異常則執行
        cookie.save(ignore_discard=True, ignore_expires=True)  # 儲存cookie檔案
        for cke in cookie:  # 迴圈輸出cookie 的key  value
            print(cke.name, cke.value)  # 迴圈輸出cookie 的key  value
    return


def urlG():  # Cookie 高階使用, 可以儲存或讀取檔案
    cookie = LWPCookieJar('1.txt')  # 建立LWPCookieJar類 可以儲存或讀取檔案 傳入檔名
    cookie.load('1.txt', ignore_expires=True, ignore_discard=True)  # 讀取cookie檔案
    handler = HTTPCookieProcessor(cookie)  # 構建handler
    opener = build_opener(handler)  # 構建opener
    try:  # 異常處理
        res = opener.open('http://www.baidu.com')  # 開啟連線
    except URLError as err:  # 異常處理方法
        print(err.reason)
    else:  # 未異常則執行
        cookie.save(ignore_discard=True, ignore_expires=True)  # 儲存cookie檔案
        for cke in cookie:  # 迴圈輸出cookie 的key  value
            print(cke.name, cke.value)  # 迴圈輸出cookie 的key  value
    return


def urlH():  # 異常捕獲處理
    try:
        res = urlopen('http://cuiqingcai.com/index.htm')  # 開啟一個不存在的頁面 丟擲Not Found 404
    except HTTPError as err:  # 異常處理方法 先捕獲HTTPError
        print(err.reason, err.code, err.headers)
    except URLError as err:  # 異常處理方法 再捕獲HTTPError
        print(err.reason)
    else:  # 未異常則執行
        print(res.read().decode('utf-8'))  # 輸出請求到的內容
    return

parse使用 url分割合併,構建get引數,get引數轉換為列表或元組,字串轉url編碼

# 姓名: 劉帥
# 日期: 2018.11.18
# 功能: urllib.parse使用方法
from urllib.parse import urlparse  # 分解url為6個數據的元組
from urllib.parse import urlunparse  # 使用6個數據的元組構造url
from urllib.parse import urlsplit  # 分解url為5個數據的元組 忽略params
from urllib.parse import urlunsplit  # 使用5個數據的元組構造url 忽略params
from urllib.parse import urljoin  # url分解合併
from urllib.parse import urlencode  # 構造GET引數
from urllib.parse import parse_qs  # GET引數轉回字典
from urllib.parse import parse_qsl  # GET引數轉為元組組成的列表
from urllib.parse import quote  # 將內容轉化為url編碼格式
from urllib.parse import unquote  # 將url編碼內容轉化為普通字元


def urlA():  # urlparse使用方法 返回6個數據的元組
    res = urlparse('http://www.baidu.com/index.html;user?id=5#comment')  # 傳入url
    print(type(res))  # 輸出變數型別<class 'urllib.parse.ParseResult'>
    print(res)  # 輸出url分解分段內容
    return


def urlB():  # urlparse的scheme引數使用方法 返回6個數據的元組
    res = urlparse('www.baidu.com/index.html;user?id=5#comment', scheme='http')  # 傳入url scheme傳入協議型別
    print(type(res))  # 輸出變數型別<class 'urllib.parse.ParseResult'>
    print(res)  # 輸出url分解分段內容
    return


def urlC():  # urlparse的fragments引數使用方法 返回6個數據的元組
    res = urlparse('www.baidu.com/index.html;user?id=5#comment', allow_fragments=False)
    # 傳入url allow_fragments傳入是否忽略fragments
    print(type(res))  # 輸出變數型別<class 'urllib.parse.ParseResult'>
    print(res)  # 輸出url分解分段內容 fragments為空
    return


def urlD():  # urlparse不包含 params query,並且忽略fragments 返回6個數據的元組
    res = urlparse('www.baidu.com/index.html;user?id=5#comment', allow_fragments=False)
    # 傳入url allow_fragments傳入是否忽略fragments
    print(type(res))  # 輸出變數型別<class 'urllib.parse.ParseResult'>
    print(res)  # 輸出url分解分段內容 fragments params query為空
    return


def urlE():  # urlparse,返回變數的使用方法 獲取 返回6個數據的元組
    res = urlparse('http://www.baidu.com/index.html;user?id=5#comment')  # 傳入url
    print(type(res))  # 輸出變數型別<class 'urllib.parse.ParseResult'>
    print(res.scheme, res[0], res.netloc, res[1])  # 輸出返回內容
    return


def urlF():  # url的構造 許6個數據的可迭代資料
    data = ['http', 'www.baidu', 'index.html', 'user', 'a=6', 'comment']  # 初始化列表
    res = urlunparse(data)  # 根據元組構造url
    print(res)  # 輸出構造結果
    return


def urlG():  # urlsplitd的使用方法 忽略params合併進path內
    res = urlsplit('http://www.baidu.com/index.html;user?id=5#comment')  # 分解返回url 返回5個數據的元組
    print(type(res))  # 輸出變數型別<class 'urllib.parse.SplitResult'>
    print(res)  # 輸出返回內容
    print(res.scheme, res[0], res.netloc, res[1])  # 輸出返回內容 使用key或下標 獲取
    return


def urlH():
    data = ['http', 'www.baidu.com', '/index.html;user', 'id=5', 'comment']
    res = urlunsplit(data)
    print(res)
    return


def urlI():  # urljoin使用
    print(urljoin('http://www.baidu.com', 'FAQ.html'))
    print(urljoin('http://www.baidu.com', 'https://cuiqingcai.com/FAQ.html'))
    print(urljoin('http://www.baidu,com/about.html', 'https://cuiqingcai/FAQ.html'))
    print(urljoin('http://www.baidu,com/about.html', 'http://cuiqingcai/FAQ.html?question=2'))
    print(urljoin('http://baidu.com?wd=abc', 'https://cuiqingcai/index.php'))
    print(urljoin('http://www.baidu.com', '?category=2#comment'))
    print(urljoin('www.baidu.com', 'category=2#comment'))
    print(urljoin('www.baidu.com#comment', '?category=2'))
    return


def urlJ():  # 使用urlencode,構建GET引數
    params = {'name': 'LiuShuai', 'age': '55'}  # get引數 引數key 值valude
    base_url = 'http://www.baidu.com?'  # 網址基址
    url = base_url + urlencode(params)  # 連線url與引數
    print(url)  # 輸出完整url
    return


def urlK():  # GET引數的使用轉換列表 元組
    query = 'name=LiuShuai&age=55'  # 建立一個get引數
    print(parse_qs(query))  # GET引數轉回字典
    print(parse_qsl(query))  # GET引數轉為元組組成的列表
    return


def urlL():  # 使用quote將字串轉化為url編碼格式
    word = '桌布'  # 定義字串
    url = 'http://www.baidu.com/s?wd=' + quote(word)  # 將字串轉化為url編碼格式
    print(url)  # 輸出轉化url編碼格式合併後的url
    url = unquote(url)  # 將url轉化為普通字串
    print(url)  # 輸出轉化為普通字串的url
    return