Python標準庫中提供了:urllib、urllib二、httplib等模塊以供Http請求,可是,它的 API 太渣了。它是爲另外一個時代、另外一個互聯網所建立的。它須要巨量的工做,甚至包括各類方法覆蓋,來完成最簡單的任務。html
Requests 是使用 Apache2 Licensed 許可證的 基於Python開發的HTTP 庫,其在Python內置模塊的基礎上進行了高度的封裝,從而使得Pythoner進行網絡請求時,變得美好了許多,使用Requests能夠垂手可得的完成瀏覽器可有的任何操做。python
經常使用的request請求方式:git
1.GET請求github
方式1、 r1 = requests.get('https://github.com/login') #請求的登陸頁面, print(r1.text) #經過請求,獲取html頁面,以字符串的方式返回 方式2、 import requests payload = {'key1': 'value1', 'key2': 'value2'} ret = requests.get("http://httpbin.org/get", params=payload) print(ret.url)#打印請求的url print(ret.text)
2.POST請求json
# 一、基本POST實例 import requests payload = {'key1': 'value1', 'key2': 'value2'} ret = requests.post("http://httpbin.org/post", data=payload) print ret.text # 二、發送請求頭和數據實例 import requests import json url = 'https://api.github.com/some/endpoint' payload = {'some': 'data'} headers = {'content-type': 'application/json'} #請求發送的數據,需加上headers,默認是自帶的... ret = requests.post(url, data=json.dumps(payload), headers=headers) print(ret.text) print(ret.cookies)#經過cookies再去訪問站內其餘的頁面
3.其餘的請求方式:api
requests.get(url, params=None, **kwargs) requests.post(url, data=None, json=None, **kwargs) requests.put(url, data=None, **kwargs) requests.head(url, **kwargs) requests.delete(url, **kwargs) requests.patch(url, data=None, **kwargs) requests.options(url, **kwargs) # 以上方法均是在此方法的基礎上構建 requests.request(method, url, **kwargs)
4.其餘參數的示例:瀏覽器
#!/usr/bin/python # -*- coding: UTF-8 -*- import requests def _method_url(): ''' method:請求的類型 url:請求的路徑 :return: ''' response = requests.request(method='post', url='http://www.baidu.com') def _param(): # - 能夠字典方式 # - 能夠是字符串方式 # - 能夠字節方式 r1 = requests.get( url='htpp://www.baidu.com', params={"user": "yang", "pwd": "123"} ) # - --字典方式 r2 = requests.get( url='htpp://www.baidu.com', params="user=yang&pwd=123" ) # - --字符串方式 r3 = requests.get( url='htpp://www.baidu.com', params=bytes("user=yang&pwd=123", encoding='utf-8') ) # ---字節方式 #編碼報錯... r4 = requests.request(method='get', url='http://www.baidu.com', params=bytes("k1=v1&k2=水電費&k3=v3&k3=vv3", encoding='utf8')) def _data(): ''' post:只有psot發送請求才可data :return: ''' # 能夠是字典 # 能夠是字符串 # 能夠是字節 # 能夠是文件對象 r1 = requests.post( url='htpp://www.baidu.com', data={ "user": "yangxiang", "commit": "sing in", } ) #- --字典方式 r2 = requests.post( url='htpp://www.baidu.com', data="user=yang;pwd=123" ) #- --字符串方式, 以;分割, r3 = requests.post( url='htpp://www.baidu.com', data=bytes("user=yang;pwd=123", encoding='utf-8') ) #- --字符串方式, 以;分割 r4 = requests.post( url='htpp://www.baidu.com', data=open('data.file.py', mode='r', encoding='utf-8') # 文件內容須要是k1=v1;k2=v2;k3=v3;k3=v4 ) #- --文件傳輸方式, 以;分割 def _json(): #將json中對應的數據進行序列化成一個字符串,json.dumps(....) #而後發送到服務端的body中,而且Content-Type是{'Content-Type': 'application/json'} r1 = requests.post( url = 'http://www.baidu.com', json={'k1':'v1','k2':'v2'}, ) def _headers(): #發送請求頭到服務端 #請求頭的方式Content-Type是{'Content-Type': 'application/x-www-form-urlencoded'} r1 = requests.post( url='http://www.baidu.com', json={'k1': 'v1', 'k2': 'v2'}, headers={'Content-Type': 'application/x-www-form-urlencoded'} ) def _cookies(): #發送cookies到服務端 r1 = requests.post( url='http://www.baidu.com', data={ "user": "yangxiang", "commit": "sing in", }, cookies={'cookie':'value'} ) #也可使用cookiesJar(字典形式就是在此基礎上封裝的) from http.cookiejar import CookieJar from http.cookiejar import Cookie obj = CookieJar() obj.set_cookie(Cookie(version=0, name='c1', value='v1', port=None, domain='', path='/', secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False, port_specified=False, domain_specified=False, domain_initial_dot=False, path_specified=False) ) requests.request(method='POST', url='http://127.0.0.1:8000/test/', data={'k1': 'v1', 'k2': 'v2'}, cookies=obj) def _files(): # 發送文件 file_dict = { 'f1': open('readme', 'rb') } requests.request(method='POST', url='http://127.0.0.1:8000', files=file_dict) # 發送文件,定製文件名 file_dict = { 'f1': ('test.txt', open('readme', 'rb')) } requests.request(method='POST', url='http://127.0.0.1:8000', files=file_dict) # 發送文件,定製文件名 file_dict = { 'f1': ('test.txt', "hahsfaksfa9kasdjflaksdjf") } requests.request(method='POST', url='http://127.0.0.1:8000', files=file_dict) # 發送文件,定製文件名 file_dict = { 'f1': ('test.txt', "hahsfaksfa9kasdjflaksdjf", 'application/text', {'k1': '0'}) } requests.request(method='POST', url='http://127.0.0.1:8000', files=file_dict) def _auth(): '''基本的驗證方式''' from requests.auth import HTTPBasicAuth,HTTPDigestAuth res = requests.get('https://api.github.com/user', auth=HTTPBasicAuth('yang','efsdfsadf')) print(res.text) # ret = requests.get('http://192.168.1.1', # auth=HTTPBasicAuth('admin', 'admin')) # ret.encoding = 'gbk' # print(ret.text) # ret = requests.get('http://httpbin.org/digest-auth/auth/user/pass', auth=HTTPDigestAuth('user', 'pass')) # print(ret) # def _timeout(): #訪問超時時間 # res = requests.get('http://www.baidu.com',timeout=2) # print(res) res = requests.get('http://www.baidu.com',timeout=(5,1)) print(res) def _allow_redirects(): '''是否容許重定向 allow_redirects=False''' ret = requests.get('http://www.baidu.com', allow_redirects=False) ret.encoding = ret.apparent_encoding print(ret.text) def _proxies(): ''' 代理, 經過ip的限制,網站會根據ip訪問的次數進行限制登陸, 那麼就須要代理,獲取和諾ip來進行訪問 ''' proxies = { "http": "61.172.249.96:80", "https": "http://61.185.219.126:3128", } proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'} ret = requests.get("http://www.proxy360.cn/Proxy", proxies=proxies) print(ret.headers) from requests.auth import HTTPProxyAuth proxyDict = { 'http': '77.75.105.165', 'https': '77.75.105.165' } auth = HTTPProxyAuth('username', 'mypassword') r = requests.get("http://www.google.com", proxies=proxyDict, auth=auth) print(r.text) def _stream(): #流的方式,超大文件,一點一點的接收 ret = requests.get('http://127.0.0.1:8000/test/', stream=True) #能夠打開一個文件,一點一點的寫入... print(ret.content) ret.close() # 自動關閉上下文.. from contextlib import closing with closing(requests.get('http://httpbin.org/get', stream=True)) as r: # 在此處理響應。 for i in r.iter_content(): print(i) def _session(): session = requests.Session() ### 一、首先登錄任何頁面,獲取cookie i1 = session.get(url="http://dig.chouti.com/help/service") ### 二、用戶登錄,攜帶上一次的cookie,後臺對cookie中的 gpsd 進行受權 i2 = session.post( url="http://dig.chouti.com/login", data={ 'phone': "8615131255089", 'password': "xxxxxx", 'oneMonth': "" } ) i3 = session.post( url="http://dig.chouti.com/link/vote?linksId=8589623", ) print(i3.text)
使用示例:cookie
html_doc = """ <html><head><title>The Dormouse's story</title></head> <body> <a href='#' class='c1'>123</a> </body> </html> """ soup = BeautifulSoup(html_doc, features="lxml")
1. name(標籤名稱)網絡
tag = soup.find('a') name = tag.name # 獲取標籤名稱 print(name) tag.name = 'span' # 設置標籤 print(soup)
2.attr(標籤屬性)session
tag = soup.find('a') attrs = tag.attrs print(attrs) #獲取標籤的屬性 #兩種設置標籤屬性的方式 tag.attrs = {'id':'i1'} tag.attrs['id'] = 'i1' print(soup)
3.children,全部子標籤
body = soup.find('body') v = body.children print(v) print([ v for i in v])
4.children,獲取子子孫孫的全部標籤
body = soup.find('body') v = body.descendants print(v)
5.clear,將標籤的全部子標籤所有清空(保留標籤名)
tag = soup.find('body') tag.clear()#清除全部的子標籤 print(soup)
6.decpmpose,遞歸的刪除全部的標籤
body = soup.find('body') body.decompose() print(soup)
7.extract,遞歸的刪除全部的標籤,並獲取刪除的標籤
body = soup.find('body') v = body.extract() print(v) #獲取刪除的標籤 # print(soup) #刪除後的html
8.decode,轉換爲字符串(含當前標籤)
decode_contents(不含當前標籤)
body = soup.find('body') v = body.decode() print(v) v = body.decode_contents() print(v)
9.encode,轉換爲字節(含當前標籤)
encode——contents(不含當前標籤)
body = soup.find('body') v = body.encode() v = body.encode_contents() print(v)
10.find,獲取匹配的第一個標籤
tag = soup.find('a') print(tag) tag = soup.find(name='a', attrs={'class': 'c1'}, recursive=True, text='123') #class_:屬性也能夠這麼的去找。也可經過attrs去查找 # tag = soup.find(name='a', class_='sister', recursive=True, text='Lacie') print(tag)
未完待續.......