爬蟲開發python工具包介紹 (2)

本文來自網易雲社區html

做者:王濤python


可選參數咱們一一介紹一下:git

參數 釋義 示例
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
image
headers 自定義http頭,它會和request本身的缺省頭進行合併以後做爲請求的header.
注意: 全部的 header 值必須是 string、bytestring 或者 unicode。
示例1:
r = requests.post(url,headers={"user-agent":"test"})


image
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雙向認證的狀況) 暫未測試過,暫未遇到過須要用這個字段的狀況。感興趣的能夠研究一下

3、tornado中的關鍵函數及參數

1 tornado 非阻塞的httpclient

tornado有兩種非阻塞的httpclient的實現,一個是SimpleAsyncHTTPClient,一個是CurlAsyncHTTPClient. 你能夠調用它們的基類AsyncHTTPClient,經過AsyncHTTPClient.configure方法來選擇使用上面的哪個實現,或者直接實例化上面的任意一個子類。缺省的是SimpleAsyncHTTPClient,雖然它已經能知足絕大多數用戶的需求,可是咱們選擇有更多優勢的 CurlAsyncHTTPClient .github

  • CurlAsyncHTTPClient 有更多特性支持,例如 代理設置,指定網絡出接口等web

  • 對於那些與HTTP兼容不太好的網站,CurlAsyncHTTPClient也能兼容訪問,ajax

  • CurlAsyncHTTPClient 更快json

  • 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的定義,看看有哪些關鍵參數是咱們須要瞭解的。cookie

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冷啓動優化

相關文章
相關標籤/搜索