本文來自網易雲社群
作者:王濤
可選引數我們一一介紹一下:
引數 | 釋義 | 示例 |
params | 生成url中?號後面的查詢Key=value | 示例1: >>>payload = {'key1': 'value1', 'key2': 'value2'} >>>r = requests.get("http://httpbin.org/get", params=payload) 檢視結果: >>> print(r.url)http://httpbin.org/get?key2=value2&key1=value1示例2: >>> param = 'httpparams' >>> r = requests.get("http://httpbin.org/get",params=param) >>> print r.urlhttp://httpbin.org/get?httpparams |
data | 支援字典、列表、字串。 post方法中常用,模擬html中的form表單 | 示例1:>>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.post("http://httpbin.org/post", data=payload) >>> print(r.text) { ... "form": { "key2": "value2", "key1": "value1" }, ... }示例2: >>> payload = (('key1', 'value1'), ('key1', 'value2')) >>> r = requests.post('http://httpbin.org/post', data=payload) >>> print(r.text) { ... "form": { "key1": [ "value1", "value2" ] }, ... } |
json | post時使用,傳遞json資料到服務端, 很多ajax請求是傳遞的json | 示例1:r = requests.post(url, json={"key":"value"}})抓取的報文頭如下,content-type:application/json |
headers | 自定義http頭,它會和request自己的預設頭進行合併之後作為請求的header. 注意: 所有的 header 值必須是 string、bytestring 或者 unicode。 | 示例1: r = requests.post(url,headers={"user-agent":"test"}) |
cookies | 可以通過cookies訪問應答裡的cookie, 也可以向伺服器傳送自定義的cookie. 通過自定義的cookie物件,還可以指定有效域等屬性 | 示例1:獲取應答中的cookie>>> url ='http://example.com/some/cookie/setting/url' >>> r = requests.get(url) >>>r.cookies['example_cookie_name']示例2: 向服務端傳送cookie >>> jar = requests.cookies.RequestsCookieJar() >>> jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies') >>> url = '' >>> r = requests.get(url, cookies=jar) >>> r.text '{"cookies": {"tasty_cookie": "yum"}}' |
files | 上傳多部分編碼(multipart-encoded)檔案 | 示例1 :上傳一個檔案>>> url = 'http://httpbin.org/post' >>> files = {'file': open('report.xls', 'rb')} >>> r = requests.post(url, files=files)示例2 : 顯示地設定檔名,檔案型別和請求頭 >>> url = 'http://httpbin.org/post' >>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})} >>> r = requests.post(url, files=files) |
auth | 支援多 HTTPBasicAuth/HTTPDigestAuth/HTTPProxyAuth 種認證 | 示例1 >>>url = 'http://httpbin.org/digest-auth/auth/user/pass' >>>requests.get(url, auth=HTTPDigestAuth('user', 'pass'))抓包後,http頭如下: GET http://httpbin.org/digest-auth/auth/user/pass HTTP/1.1 Host:httpbin.org Connection: keep-alive Accept-Encoding: gzip, deflate Accept: /User-Agent: python-requests/2.12.4Authorization: Basic dXNlcjpwYXNz |
timeout | 1 float:連線等待時間,只針對socket連線過程有效。 2 tuple:(connect timeout, read timeout) | 示例1: >>> requests.get('http://github.com', timeout=0.001) Traceback (most recent call last): File "", line 1, inrequests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001) |
allow_redirects | 如果你使用的是GET、OPTIONS、POST、PUT、PATCH 或者 DELETE, 那麼你可以通過 allow_redirects 引數禁用重定向處理. 注:在爬蟲過程中,我們有些場景需要禁用跳轉,置為False, 預設True | 示例1 收到3xx時,會主動跳轉訪問: >>>r = requests.get('http://github.com', allow_redirects=False) >>> r.status_code 301 >>> r.history [] |
proxies | 配置代理資訊,沒啥好講的.根據實際情況配置http,https代理 | 示例1: >>>proxies = { "http": "http://127.0.0.1:8888", "https": "https://127.0.0.1:8888", } >>>r=requests.get(url, headers=headers,proxies=proxies) |
stream | 如果應答是流式的時候,需要把stream設定成true.注:需要呼叫主動關閉,否則連線不會釋放 | 示例 1:下載百度圖片: import requests from contextlib import closing def download_image_improve(): url = ('' 'image&quality=80&size=b9999_10000' '&sec=1504068152047&di=8b53bf6b8e5deb64c8ac726e260091aa&imgtype=0' '&src=http%3A%2F%2Fpic.baike.soso.com%2Fp%2F' '20140415%2Fbki-20140415104220-671149140.jpg') with closing(requests.get(url, stream=True,verify=False)) as response: # 這裡開啟一個空的png檔案,相當於建立一個空的txt檔案, # wb表示寫檔案 with open('selenium1.png', 'wb') as file: #檔案,這個檔案最後寫入完成就是,selenium.png file.write(data) |
verify | 預設值為True,即校驗服務端證照。 如果是字串,則為CA_BUNDLE的路徑,即證照路徑。如果找不到證照, 可以用示例2中的Fiddler中的PEM替代,也可以安裝certifi包(自帶了一套requests信任的根證照) 個人理解:即瀏覽器訪問Https網站有時會提示需要信任證照的功能一樣。 | 示例1:關閉證照驗證(推薦) r=requests.get(url, verify=False)示例2 :借用Fiddler轉換之後的PEM證照去訪問 中亞. FiddlerRoot.zip 下載地址: http://nos.netease.com/knowledge/ 2b99aacb-e9bf-42f7-8edf-0f8ca0326533?download=FiddlerRoot.zip 注: 證照中包含cer和pem兩種格式,建議先安裝資訊cer證照。 當然你也可以自己安裝Fiddler,把Fiddler證照信任後, 匯出cer格式,再使用 openssl x509 -inform der -in FiddlerRoot.cer -out FiddlerRoot.pem 轉換證照格式 headers = { "Host": "www.amazon.com", "Connection": "keep-alive", "Cache-Control": "max-age=0", "Upgrade-Insecure-Requests": "1", "User-Agent": ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/68.0.3440.106 Safari/537.36"), "Accept": ("text/html,application/xhtml+xml," "application/xml;q=0.9,image/webp,image/apng,/;q=0.8"), "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8" } print requests.get('https://www.amazon.com/', verify=r"FiddlerRoot.pem", headers=headers).content |
cert | 型別: 字串:代表ssl客戶端的cert檔案(.pem)檔案路徑 元組:('cert','key'),verify給定的服務端證照, cert給定的是客戶端的證照(對於https雙向認證的情況) | 暫未測試過,暫未遇到過需要用這個欄位的情況。感興趣的可以研究一下 |
三、tornado中的關鍵函式及引數
1 tornado 非阻塞的httpclient
tornado有兩種非阻塞的httpclient的實現,一個是SimpleAsyncHTTPClient,一個是CurlAsyncHTTPClient. 你可以呼叫它們的基類AsyncHTTPClient,通過AsyncHTTPClient.configure方法來選擇使用上面的哪一個實現,或者直接例項化上面的任意一個子類。預設的是SimpleAsyncHTTPClient,雖然它已經能滿足絕大多數使用者的需求,但是我們選擇有更多優點的 CurlAsyncHTTPClient .
CurlAsyncHTTPClient 有更多特性支援,例如 代理設定,指定網路出介面等
對於那些與HTTP相容不太好的網站,CurlAsyncHTTPClient也能相容訪問,
CurlAsyncHTTPClient 更快
Tornado 2.0 版本之前,CurlAsyncHTTPClient是預設的。
2 tornado 關鍵函式、引數介紹
示例程式碼(與前面類似):
@gen.coroutinedef fetch_url(url): """抓取url""" try: c = CurlAsyncHTTPClient() # 定義一個httpclient req = HTTPRequest(url=url) # 定義一個請求 response = yield c.fetch(req) # 發起請求 print response.body IOLoop.current().stop() # 停止ioloop執行緒 except: print traceback.format_exc()
可以看到,這個httpclient,使用起來也很方便。先建立一個HTTPRequest,然後呼叫HTTPClient的fetch方法來發起這個請求。
此處我們就看一下HTTPRequest的定義,看看有哪些關鍵引數是我們需要了解的。
class HTTPRequest(object): """HTTP client request object.""" # Default values for HTTPRequest parameters. # Merged with the values on the request object by AsyncHTTPClient # implementations. _DEFAULTS = dict( connect_timeout=20.0, request_timeout=20.0, follow_redirects=True, max_redirects=5, decompress_response=True, proxy_password='', allow_nonstandard_methods=False, validate_cert=True) def __init__(self, url, method="GET", headers=None, body=None, auth_username=None, auth_password=None, auth_mode=None, connect_timeout=None, request_timeout=None, if_modified_since=None, follow_redirects=None, max_redirects=None, user_agent=None, use_gzip=None, network_interface=None, streaming_callback=None, header_callback=None, prepare_curl_callback=None, proxy_host=None, proxy_port=None, proxy_username=None, proxy_password=None, proxy_auth_mode=None, allow_nonstandard_methods=None, validate_cert=None, ca_certs=None, allow_ipv6=None, client_key=None, client_cert=None, body_producer=None, expect_100_continue=False, decompress_response=None, ssl_options=None): r"""All parameters except ``url`` are optional.
網易雲免費體驗館,0成本體驗20+款雲產品!
更多網易研發、產品、運營經驗分享請訪問網易雲社群。
相關文章:
【推薦】 4月第4周業務風控關注 | 網路犯罪經濟每年1.5萬億美元 GDP居全球第12位