爬蟲開發python工具包介紹 (2)
阿新 • • 發佈:2018-09-30
dir 部分 loop 網易 pat 選擇 服務器 mode follow
本文來自網易雲社區
作者:王濤
可選參數我們一一介紹一下:
參數 | 釋義 | 示例 |
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+款雲產品!
更多網易研發、產品、運營經驗分享請訪問網易雲社區。
相關文章:
【推薦】 雲計算交互設計師的正確出裝姿勢
【推薦】 從細節處談Android冷啟動優化
爬蟲開發python工具包介紹 (2)