Python 的 requests 库的用法
?
Python爬蟲利器一之Requests庫的用法:http://cuiqingcai.com/2556.html
Python利用Requests庫寫爬蟲(一):http://www.jianshu.com/p/e1f8b690b951
Python-第三方庫requests詳解:http://blog.csdn.net/shanzhizi/article/details/50903748
Python requests模塊學習筆記:http://www.cnblogs.com/tangdongchu/p/4229049.html
Requests 官方文檔:http://cn.python-requests.org/zh_CN/latest
Requests 官方 API:http://cn.python-requests.org/zh_CN/latest/api.html
Requests 高級用法:http://docs.python-requests.org/zh_CN/latest/user/advanced.html
?
?
安裝
?
下面是幾種安裝方式
利用 pip 安裝:$ pip install requests 利用 easy_install安裝:$ easy_install requests 下載代碼后安裝: $ git clone git://github.com/kennethreitz/requests.git $ cd requests $ python setup.py install 再懶一點,通過IDE安裝吧,如pycharm!Requests 使用簡單入門
#HTTP請求類型 r = requests.get('https://github.com/timeline.json') # get 類型 r = requests.post("http://m.ctrip.com/post") # post 類型 r = requests.put("http://m.ctrip.com/put") # put 類型 r = requests.delete("http://m.ctrip.com/delete") # delete 類型 r = requests.head("http://m.ctrip.com/head") # head 類型 r = requests.options("http://m.ctrip.com/get") # options類型#獲取響應內容 print r.content #以字節的方式去顯示,中文顯示為字符 print r.text #以文本的方式去顯示# 向 URL 傳遞參數 payload = {'keyword': '日本', 'salecityid': '2'} r = requests.get("http://m.ctrip.com/webapp/tourvisa/visa_list", params=payload) print r.url # 示例為 http://m.ctrip.com/webapp/tourvisa/visa_list?salecityid=2&keyword=日本# 獲取/修改網頁編碼 r = requests.get('https://github.com/timeline.json') print r.encoding r.encoding = 'utf-8'# json處理 r = requests.get('https://github.com/timeline.json') print r.json() # 需要先 import json # 定制請求頭 (get 和 post 都一樣方式) url = 'http://m.ctrip.com' headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'} r = requests.post(url, headers=headers) # 或者 r = requests.get(url, headers=headers) print r.request.headers# 復雜post請求 url = 'http://m.ctrip.com' payload = {'some': 'data'} r = requests.post(url, data=json.dumps(payload)) # 如果傳遞的payload是string而不是dict,需要先調用dumps方法格式化一下# post 多部分編碼文件 url = 'http://m.ctrip.com' files = {'file': open('report.xls', 'rb')} r = requests.post(url, files=files)# 響應狀態碼 r = requests.get('http://m.ctrip.com') print r.status_code# 響應頭 r = requests.get('http://m.ctrip.com') print r.headers print r.headers['Content-Type'] print r.headers.get('content-type') # 訪問響應頭部分內容的兩種方式# Cookies url = 'http://example.com/some/cookie/setting/url' r = requests.get(url) r.cookies['example_cookie_name'] # 讀取cookiesurl = 'http://m.ctrip.com/cookies' cookies = dict(cookies_are='working') r = requests.get(url, cookies=cookies) # 發送cookies#設置超時時間 r = requests.get('http://m.ctrip.com', timeout=0.001)#設置訪問代理(get 和 post 都一樣方式) proxies = {"http": "http://10.10.10.10:8888","https": "http://10.10.10.100:4444",} r = requests.get('http://m.ctrip.com', proxies=proxies)?
?
發送請求與傳遞參數
?
一個小例子:
r = requests.get('http://www.baidu.com') print type(r) print r.status_code # 獲取響應狀態碼 print r.encoding # 獲取網頁編碼 print r.text # r.text來獲取響應的內容。以字符的形式獲取 print r.content # 以字節的形式獲取響應的內容。requests會自動將內容轉碼。大多數unicode字體都會無縫轉碼。 print r.cookies # 獲取cookies不但GET方法簡單,其他方法都是統一的接口樣式!
requests.get(‘https://github.com/timeline.json’) # GET請求 requests.post(“http://httpbin.org/post”) # POST請求 requests.put(“http://httpbin.org/put”) # PUT請求 requests.delete(“http://httpbin.org/delete”) # DELETE請求 requests.head(“http://httpbin.org/get”) # HEAD請求 requests.options(“http://httpbin.org/get”) # OPTIONS請求?
GET請求
最基本的GET請求可以直接用get方法
r = requests.get("http://httpbin.org/get")如果想要加參數,可以利用 params 參數
import requestspayload = {'key1': 'value1', 'key2': 'value2'} r = requests.get("http://httpbin.org/get", params=payload) print r.url運行結果
http://httpbin.org/get?key2=value2&key1=value1 url = "https://www.baidu.com/s" r = requests.get(url, params={'wd': 'python'}) print r.url r = requests.get(url, params={'wd': 'php'}) print r.url print r.text帶參數的請求實例:
import requests requests.get('http://www.baidu.com/s', params={'wd': 'python'}) #GET參數實例 requests.post('http://www.itwhy.org/wp-comments-post.php', data={'comment': '測試POST'}) #POST參數實例url = "http://httpbin.org/post"# get 方法 使用 params 參數傳遞數據 # post 方法 使用 data 參數傳遞數據r = requests.get("http://httpbin.org/get", params={'wd': 'python'}) # get 參數示例 print r.url print r.text# post 方法 如果使用 params 參數傳遞數據時,傳遞的數據可以在url中以明文看到 r = requests.post(url, params={'wd': 'python'}) print r.url print r.text# post 如果使用 data 參數傳遞數據時,傳遞的數據在url中無法看到 r = requests.post(url, data={'comment': 'TEST_POST'}) # post 參數示例 print r.url print r.text如果想請求JSON文件,可以利用 json() 方法解析。例如自己寫一個JSON文件命名為a.json,內容如下
["foo", "bar", {"foo": "bar" }]利用如下程序請求并解析
import requestsr = requests.get("a.json") # a.json 代表的一個服務器json文件,這里為了演示,實際是:http://xxx.com/a.json 形式的URL地址 print r.text print r.json()運行結果如下,其中一個是直接輸出內容,另外一個方法是利用 json() 方法解析。
?
["foo", "bar", {"foo": "bar"}][u'foo', u'bar', {u'foo': u'bar'}]?
如果想獲取來自服務器的原始套接字響應,可以取得 r.raw 。 不過需要在初始請求中設置 stream=True 。
r = requests.get('https://github.com/timeline.json', stream=True) r.raw <requests.packages.urllib3.response.HTTPResponse object at 0x101194810> r.raw.read(10) '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'這樣就獲取了網頁原始套接字內容。如果想添加 headers,可以傳 headers 參數
import requestspayload = {'key1': 'value1', 'key2': 'value2'} headers = {'content-type': 'application/json'} r = requests.get("http://httpbin.org/get", params=payload, headers=headers) print r.url通過headers參數可以增加請求頭中的headers信息
?
定制header:
import requests import jsondata = {'some': 'data'} headers = {'content-type': 'application/json','User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}r = requests.post('https://api.github.com/some/endpoint', data=data, headers=headers) print(r.text)請求頭內容可以用r.request.headers來獲取。
>>> r.request.headers自定義請求頭部:定制headers,使用headers參數來傳遞
偽裝請求頭部是采集時經常用的,我們可以用這個方法來隱藏:
r = requests.get('http://www.zhidaow.com') print r.request.headers['User-Agent'] #python-requests/1.2.3 CPython/2.7.3 Windows/XPheaders = {'User-Agent': 'alexkh'} r = requests.get('http://www.zhidaow.com', headers = headers) print r.request.headers['User-Agent'] #alexkh?
POST請求
對于 POST 請求來說,我們一般需要為它增加一些參數。那么最基本的傳參方法可以利用 data 這個參數。
import requestspayload = {'key1': 'value1', 'key2': 'value2'} r = requests.post("http://httpbin.org/post", data=payload) print r.text運行結果
{"args": {}, "data": "", "files": {}, "form": {"key1": "value1", "key2": "value2"}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "23", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1"}, "json": null, "url": "http://httpbin.org/post" }可以看到參數傳成功了,然后服務器返回了我們傳的數據。有時候我們需要傳送的信息不是表單形式的,需要我們傳JSON格式的數據過去,所以我們可以用 json.dumps() 方法把表單數據序列化。
?
POST發送JSON數據:
import json import requestsurl = 'http://httpbin.org/post' payload = {'some': 'data'} r = requests.post(url, data=json.dumps(payload)) print r.text運行結果
{"args": {}, "data": "{\"some\": \"data\"}", "files": {}, "form": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "16", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1"}, "json": {"some": "data"}, "url": "http://httpbin.org/post" }示例
import requests import jsonr = requests.post('https://api.github.com/some/endpoint', data=json.dumps({'some': 'data'})) print(r.json())通過上述方法,我們可以POST JSON格式的數據。如果想要上傳文件,那么直接用 file 參數即可。新建一個 a.txt 的文件,內容寫上 Hello World!
import requestsurl = 'http://httpbin.org/post' files = {'file': open('test.txt', 'rb')} r = requests.post(url, files=files) print r.text運行結果如下
{"args": {}, "data": "", "files": {"file": "Hello World!"}, "form": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "156", "Content-Type": "multipart/form-data; boundary=7d8eb5ff99a04c11bb3e862ce78d7000", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1"}, "json": null, "url": "http://httpbin.org/post" }這樣便成功完成了一個文件的上傳。
requests 是支持流式上傳的,這允許你發送大的數據流或文件而無需先把它們讀入內存。要使用流式上傳,僅需為你的請求體提供一個類文件對象即可。這是一個非常實用方便的功能。
你可以把字符串當著文件進行上傳:
import requestsurl = 'http://127.0.0.1:5000/upload' files = {'file': ('test.txt', b'Hello Requests.')} #必需顯式的設置文件名r = requests.post(url, files=files) print(r.text)發送文件的post類型,這個相當于向網站上傳一張圖片,文檔等操作,這時要使用files參數
>>> url = 'http://httpbin.org/post' >>> files = {'file': open('touxiang.png', 'rb')} >>> r = requests.post(url, files=files)?
POST請求模擬登陸及一些返回對象的方法:
#-*- coding:utf-8 -*- import requests url1 = 'http://www.exanple.com/login' # 登陸地址 url2 = "http://www.example.com/main" # 需要登陸才能訪問的地址 data={"user":"user","password":"pass"} headers = { "Accept":"text/html,application/xhtml+xml,application/xml;","Accept-Encoding":"gzip","Accept-Language":"zh-CN,zh;q=0.8","Referer":"http://www.example.com/","User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36"} res1 = requests.post(url1, data=data, headers=headers) res2 = requests.get(url2, cookies=res1.cookies, headers=headers)print res2.content # 獲得二進制響應內容 print res2.raw # 獲得原始響應內容,需要stream=True print res2.raw.read(50) print type(res2.text) # 返回解碼成unicode的內容 print res2.url print res2.history # 追蹤重定向 print res2.cookies print res2.cookies['example_cookie_name'] print res2.headers print res2.headers['Content-Type'] print res2.headers.get('content-type') print res2.json # 講返回內容編碼為json print res2.encoding # 返回內容編碼 print res2.status_code # 返回http狀態碼 print res2.raise_for_status() # 返回錯誤狀態碼?
?
Response對象
使用requests方法后,會返回一個response對象,其存儲了服務器響應的內容,如上實例中已經提到的 r.text、r.status_code……
獲取文本方式的響應體實例:當你訪問 r.text 之時,會使用其響應的文本編碼進行解碼,并且你可以修改其編碼讓 r.text 使用自定義的編碼進行解碼。
?
Cookies
如果一個響應中包含了cookie,那么我們可以利用 cookies 變量來拿到。會話對象讓你能夠跨請求保持某些參數,最方便的是在同一個Session實例發出的所有請求之間保持cookies,且這些都是自動處理的
import requestsurl = 'http://example.com' r = requests.get(url) print r.cookies print r.cookies['example_cookie_name']以上程序僅是樣例,可以用 cookies 變量來得到站點的 cookies。另外可以利用 cookies 變量來向服務器發送 cookies 信息
import requestsurl = 'http://httpbin.org/cookies' cookies = dict(cookies_are='working') r = requests.get(url, cookies=cookies) print r.text運行結果 '{"cookies": {"cookies_are": "working"}}'如果某個響應中包含一些Cookie,你可以快速訪問它們:
import requestsr = requests.get('http://www.google.com.hk/') print(r.cookies['NID']) print(tuple(r.cookies))要想發送你的cookies到服務器,可以使用 cookies 參數:
import requestsurl = 'http://httpbin.org/cookies' cookies = {'testCookies_1': 'Hello_Python3', 'testCookies_2': 'Hello_Requests'} # 在Cookie Version 0中規定空格、方括號、圓括號、等于號、逗號、雙引號、斜杠、問號、@,冒號,分號等特殊符號都不能作為Cookie的內容。 r = requests.get(url, cookies=cookies) print(r.json())如下是快盤簽到腳本
import requestsheaders = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Encoding': 'gzip, deflate, compress','Accept-Language': 'en-us;q=0.5,en;q=0.3','Cache-Control': 'max-age=0','Connection': 'keep-alive','User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}s = requests.Session() s.headers.update(headers) # s.auth = ('superuser', '123') s.get('https://www.kuaipan.cn/account_login.htm')_URL = 'http://www.kuaipan.cn/index.php' s.post(_URL, params={'ac':'account', 'op':'login'},data={'username':'****@foxmail.com', 'userpwd':'********', 'isajax':'yes'}) r = s.get(_URL, params={'ac':'zone', 'op':'taskdetail'}) print(r.json()) s.get(_URL, params={'ac':'common', 'op':'usersign'})獲取響應中的cookies
獲取響應中的cookies >>> r = requests.get('http://www.baidu.com') >>> r.cookies['BAIDUID'] 'D5810267346AEFB0F25CB0D6D0E043E6:FG=1'也可以自已定義請求的COOKIES >>> url = 'http://httpbin.org/cookies' >>> cookies = {'cookies_are':'working'} >>> r = requests.get(url,cookies = cookies) >>> >>> print r.text {"cookies": {"cookies_are": "working"} } >>>?
?
超時配置
可以利用 timeout 變量來配置最大請求時間。timeout 僅對連接過程有效,與響應體的下載無關。
requests.get('http://github.com', timeout=0.001)注:timeout 僅對連接過程有效,與響應體的下載無關。
?
也就是說,這個時間只限制請求的時間。即使返回的 response 包含很大內容,下載需要一定時間,然而這并沒有什么卵用。
?
?
Session
自動登錄教務處網站
會話對象
訪問中使用session
? ? 1. 先初始化一個session對象,s = requests.Session()
? ? 2. 然后使用這個session對象來進行訪問,r = s.post(url,data = user)
在以上的請求中,每次請求其實都相當于發起了一個新的請求。也就是相當于我們每個請求都用了不同的瀏覽器單獨打開的效果。也就是它并不是指的一個會話,即使請求的是同一個網址。
比如
import requestsrequests.get('http://httpbin.org/cookies/set/sessioncookie/123456789') r = requests.get("http://httpbin.org/cookies") print(r.text) 結果是: {"cookies": {} }很明顯,這不在一個會話中,無法獲取 cookies,那么在一些站點中,我們需要保持一個持久的會話怎么辦呢?就像用一個瀏覽器逛淘寶一樣,在不同的選項卡之間跳轉,這樣其實就是建立了一個長久會話。
解決方案如下
import requestss = requests.Session() s.get('http://httpbin.org/cookies/set/sessioncookie/123456789') r = s.get("http://httpbin.org/cookies") print(r.text)在這里我們請求了兩次,一次是設置 cookies,一次是獲得 cookies。運行結果
{"cookies": {"sessioncookie": "123456789"} }發現可以成功獲取到 cookies 了,這就是建立一個會話到作用。那么既然會話是一個全局的變量,那么我們肯定可以用來全局的配置了。
import requestss = requests.Session() s.headers.update({'x-test': 'true'}) r = s.get('http://httpbin.org/headers', headers={'x-test2': 'true'}) print r.text通過 s.headers.update 方法設置了 headers 的變量。然后我們又在請求中設置了一個 headers,那么會出現什么結果?
很簡單,兩個變量都傳送過去了。運行結果:
{"headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1", "X-Test": "true", "X-Test2": "true"} }如果get方法傳的headers 同樣也是 x-test 呢?
r = s.get('http://httpbin.org/headers', headers={'x-test': 'true'})嗯,它會覆蓋掉全局的配置
{"headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1", "X-Test": "true"} }那如果不想要全局配置中的一個變量了呢?很簡單,設置為 None 即可
r = s.get('http://httpbin.org/headers', headers={'x-test': None})運行結果
{"headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1"} }以上就是 session 會話的基本用法
?
使用Session()對象的寫法(Prepared Requests):
#-*- coding:utf-8 -*- import requests s = requests.Session() url1 = 'http://www.exanple.com/login'#登陸地址 url2 = "http://www.example.com/main"#需要登陸才能訪問的地址 data={"user":"user","password":"pass"} headers = { "Accept":"text/html,application/xhtml+xml,application/xml;","Accept-Encoding":"gzip","Accept-Language":"zh-CN,zh;q=0.8","Referer":"http://www.example.com/","User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36"}prepped1 = requests.Request('POST', url1,data=data,headers=headers ).prepare() s.send(prepped1)''' 也可以這樣寫 res = requests.Request('POST', url1, data=data, headers=headers ) prepared = s.prepare_request(res) # do something with prepped.body # do something with prepped.headers s.send(prepared) '''prepare2 = requests.Request('POST', url2,headers=headers ).prepare() res2 = s.send(prepare2)print res2.content另一種寫法 :
#-*- coding:utf-8 -*- import requests s = requests.Session() url1 = 'http://www.exanple.com/login'#登陸地址 url2 = "http://www.example.com/main"#需要登陸才能訪問的頁面地址 data={"user":"user","password":"pass"} headers = { "Accept":"text/html,application/xhtml+xml,application/xml;","Accept-Encoding":"gzip","Accept-Language":"zh-CN,zh;q=0.8","Referer":"http://www.example.com/","User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36"} res1 = s.post(url1, data=data) res2 = s.post(url2) print(resp2.content)?
SSL證書驗證
現在隨處可見 https 開頭的網站,Requests可以為HTTPS請求驗證SSL證書,就像web瀏覽器一樣。要想檢查某個主機的SSL證書,你可以使用 verify 參數。
現在 12306 證書不是無效的嘛,來測試一下
來試下 github 的
import requestsr = requests.get('https://github.com', verify=True) print r.text正常請求,內容我就不輸出了。如果我們想跳過剛才 12306 的證書驗證,把 verify 設置為 False 即可
import requestsr = requests.get('https://kyfw.12306.cn/otn/', verify=False) print r.text發現就可以正常請求了。在默認情況下 verify 是 True,所以如果需要的話,需要手動設置下這個變量。
?
身份驗證
基本身份認證(HTTP Basic Auth):
import requests from requests.auth import HTTPBasicAuthr = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=HTTPBasicAuth('user', 'passwd')) # r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=('user', 'passwd')) # 簡寫 print(r.json())另一種非常流行的HTTP身份認證形式是摘要式身份認證,Requests對它的支持也是開箱即可用的:
requests.get(URL, auth=HTTPDigestAuth('user', 'pass'))?
代理
如果需要使用代理,你可以通過為任意請求方法提供 proxies 參數來配置單個請求
import requestsproxies = {"https": "http://41.118.132.69:4433" } r = requests.post("http://httpbin.org/post", proxies=proxies) print r.text也可以通過環境變量 HTTP_PROXY 和 HTTPS_PROXY 來配置代理
export HTTP_PROXY="http://10.10.1.10:3128" export HTTPS_PROXY="http://10.10.1.10:1080"采集時為避免被封IP,經常會使用代理。requests也有相應的proxies屬性。
import requestsproxies = { "http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080", }requests.get("http://www.zhidaow.com", proxies=proxies)如果代理需要賬戶和密碼,則需這樣:
proxies = { "http": "http://user:pass@10.10.1.10:3128/", }?
利用Requests來抓取火車票數據。
根據觀察,數據接口如下:
https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate=2015-05-23&from_station=NCG&to_station=CZQ返回的是2015-5-23南昌到郴州的火車票信息,格式為json。
返回的數據的如下(只截取了一部分):
看著很亂,我們稍加整理:
{"validateMessagesShowId":"_validatorMessage","status":true,"httpstatus":200,"data":{"datas":[{"train_no":"5u000G140101","station_train_code":"G1401","start_station_telecode":"NXG","start_station_name":"南昌西","end_station_telecode":"IZQ","end_station_name":"廣州南","from_station_telecode":"NXG","from_station_name":"南昌西","to_station_telecode":"ICQ","to_station_name":"郴州西","start_time":"07:29","arrive_time":"10:42","day_difference":"0",..."swz_num":"無"},{...}] }這樣就比較清晰了,代碼如下,提取自己需要的信息。
#-*- coding:utf-8 -*- import requests import jsonclass trainTicketsSprider:def getTicketsInfo(self,purpose_codes,queryDate,from_station,to_station):self.url = 'https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=%s&queryDate=%s&from_station=%s&to_station=%s' %(purpose_codes,queryDate,from_station,to_station)self.headers = { "Accept":"text/html,application/xhtml+xml,application/xml;","Accept-Encoding":"gzip","Accept-Language":"zh-CN,zh;q=0.8","User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36"}self.TicketSession = requests.Session()self.TicketSession.verify = False #關閉https驗證 self.TicketSession.headers = self.headerstry:self.resp_json = self.TicketSession.get(self.url)self.ticketsDatas = json.loads(self.resp_json.text)["data"]["datas"]return self.ticketsDatasexcept Exception,e:print edef isZero(num):if num == '--' or '無':return '0'else:return numdef main():purpose_codes = 'ADULT'queryDate = '2015-05-23'from_station = 'NCG'to_station = 'CZQ'TicketSprider = trainTicketsSprider()res= TicketSprider.getTicketsInfo(purpose_codes,queryDate,from_station,to_station)for i,ticketInfo in enumerate(res): print u"車次:%s" %ticketInfo["station_train_code"]print u"起始站:%s" %ticketInfo["start_station_name"]print u"目的地:%s" %ticketInfo["to_station_name"]print u"開車時間:%s" %ticketInfo["start_time"]print u"到達時間:%s" %ticketInfo["arrive_time"]print u"二等座還剩:%s張票" %isZero(ticketInfo["ze_num"])print u"硬座還剩:%s張票" %isZero(ticketInfo["yz_num"])print u"硬臥還剩:%s張票" %isZero(ticketInfo["yw_num"])print u"無座還剩:%s張票" %isZero(ticketInfo["wz_num"])print u"是否有票:%s" %ticketInfo["canWebBuy"]print "**********************************"if __name__ == '__main__':main()?
?
Requests POST多部分編碼(Multipart-Encoded)的文件方法
?
http://lovesoo.org/requests-post-multiple-part-encoding-multipart-encoded-file-format.html
?
更多請參考:
1. http://cn.python-requests.org/zh_CN/latest/user/quickstart.html#post-multipart-encoded
2. http://toolbelt.readthedocs.io/en/latest/uploading-data.html
?
Requests本身雖然提供了簡單的方法POST多部分編碼(Multipart-Encoded)的文件,但是Requests是先讀取文件到內存中,然后再構造請求發送出去。
如果需要發送一個非常大的文件作為 multipart/form-data 請求時,為了避免把大文件讀取到內存中,我們就希望將請求做成數據流。
默認requests是不支持的(或很困難), 這時需要用到第三方包requests-toolbelt。
兩個庫POST多部分編碼(Multipart-Encoded)的文件示例代碼分別如下:
Requests庫(先讀取文件至內存中)
?
import requestsurl = 'http://httpbin.org/post' files = {'file': open('report.xls', 'rb')}r = requests.post(url, files=files) print r.text?
Requests+requests-toolbelt庫(直接發送數據流)
?
? # -*- coding:utf-8 -*-import requests from requests_toolbelt.multipart.encoder import MultipartEncoderproxies = {"http": "http://172.17.18.80:8080","https": "http://172.17.18.80:8080", }if __name__ == "__main__":print "main"m = MultipartEncoder(fields={'field0': 'value', 'field1': 'value','field2': ('names.txt', open(r'd:\names.txt', 'r'), 'application/zip')})r = requests.post('http://httpbin.org/post',data=m,headers={'Content-Type': m.content_type},proxies=proxies)print r.text?
??
?
?
?
總結
以上是生活随笔為你收集整理的Python 的 requests 库的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式3—行为型模式
- 下一篇: CompletableFuture详解~