python爬蟲入門教程--優雅的HTTP庫requests(二),pythonrequests

來源:互聯網
上載者:User

python爬蟲入門教程--優雅的HTTP庫requests(二),pythonrequests

前言

urllib、urllib2、urllib3、httplib、httplib2 都是和 HTTP 相關的 Python 模組,看名字就覺得很反人類,更糟糕的是這些模組在 Python2 與 Python3 中有很大的差異,如果業務代碼要同時相容 2 和 3,寫起來會讓人崩潰。

好在,還有一個非常驚豔的 HTTP 庫叫 requests,它是 GitHUb 關注數最多的 Python 項目之一,requests 的作者是 Kenneth Reitz 大神。

requests 實現了 HTTP 協議中絕大部分功能,它提供的功能包括 Keep-Alive、串連池、Cookie持久化、內容自動解壓、HTTP代理、SSL認證、連線逾時、Session等很多特性,最重要的是它同時相容 python2 和 python3。requests 的安裝可以直接使用 pip 方法:pip install requests

發送請求

>>> import requests# GET 請求>>> response = requests.get(https://foofish.net)

響應內容

請求返回的值是一個Response 對象,Response 對象是對 HTTP 協議中服務端返回給瀏覽器的響應資料的封裝,響應的中的主要元素包括:狀態代碼、原因短語、響應首部、響應體等等,這些屬性都封裝在Response 對象中。

# 狀態代碼>>> response.status_code200# 原因短語>>> response.reason'OK'# 響應首部>>> for name,value in response.headers.items():...  print("%s:%s" % (name, value))...Content-Encoding:gzipServer:nginx/1.10.2Date:Thu, 06 Apr 2017 16:28:01 GMT# 響應內容>>> response.content'<html><body>此處省略一萬字...</body></html>

requests 除了支援 GET 請求外,還支援 HTTP 規範中的其它所有方法,包括 POST、PUT、DELTET、HEADT、OPTIONS方法。

>>> r = requests.post('http://httpbin.org/post', data = {'key':'value'})>>> r = requests.put('http://httpbin.org/put', data = {'key':'value'})>>> r = requests.delete('http://httpbin.org/delete')>>> r = requests.head('http://httpbin.org/get')>>> r = requests.options('http://httpbin.org/get')

查詢參數

很多URL都帶有很長一串參數,我們稱這些參數為URL的查詢參數,用"?"附加在URL連結後面,多個參數之間用"&"隔開,比如:http://fav.foofish.net/?p=4&s=20 ,現在你可以用字典來構建查詢參數:

>>> args = {"p": 4, "s": 20}>>> response = requests.get("http://fav.foofish.net", params = args)>>> response.url'http://fav.foofish.net/?p=4&s=2'

請求首部

requests 可以很簡單地指定請求首部欄位 Headers,比如有時要指定 User-Agent 偽裝成瀏覽器發送請求,以此來矇騙伺服器。直接傳遞一個字典對象給參數 headers 即可。

>>> r = requests.get(url, headers={'user-agent': 'Mozilla/5.0'})

請求體

requests 可以非常靈活地構建 POST 請求需要的資料,如果伺服器要求發送的資料是表單資料,則可以指定關鍵字參數 data,如果要求傳遞 json 格式字串參數,則可以使用json關鍵字參數,參數的值都可以字典的形式傳過去。

作為表單資料轉送給伺服器

>>> payload = {'key1': 'value1', 'key2': 'value2'}>>> r = requests.post("http://httpbin.org/post", data=payload)

作為 json 格式的字串格式傳輸給伺服器

>>> import json>>> url = 'http://httpbin.org/post'>>> payload = {'some': 'data'}>>> r = requests.post(url, json=payload)

響應內容

HTTP返回的響應訊息中很重要的一部分內容是響應體,響應體在 requests 中處理非常靈活,與響應體相關的屬性有:content、text、json()。

content 是 byte 類型,適合直接將內容儲存到檔案系統或者傳輸到網路中

>>> r = requests.get("https://pic1.zhimg.com/v2-2e92ebadb4a967829dcd7d05908ccab0_b.jpg")>>> type(r.content)<class 'bytes'># 另存新檔 test.jpg>>> with open("test.jpg", "wb") as f:...  f.write(r.content)

text 是 str 類型,比如一個普通的 HTML 頁面,需要對文本進一步分析時,使用 text。

>>> r = requests.get("https://foofish.net/understand-http.html")>>> type(r.text)<class 'str'>>>> re.compile('xxx').findall(r.text)

如果使用第三方開放平台或者API介面爬取資料時,返回的內容是json格式的資料時,那麼可以直接使用json()方法返回一個經過json.loads()處理後的對象。

>>> r = requests.get('https://www.v2ex.com/api/topics/hot.json')>>> r.json()[{'id': 352833, 'title': '在長沙,父母同住...

代理設定

當爬蟲頻繁地對伺服器進行抓取內容時,很容易被伺服器屏蔽掉,因此要想繼續順利的進行爬取資料,使用代理是明智的選擇。如果你想爬取牆外的資料,同樣設定代理可以解決問題,requests 完美支援代理。這裡我用的是本地 ShadowSocks 的代理,(socks協議的代理要這樣安裝 pip install requests[socks]

import requestsproxies = { 'http': 'socks5://127.0.0.1:1080', 'https': 'socks5://127.0.0.1:1080',}requests.get('https://foofish.net', proxies=proxies, timeout=5)

逾時設定

requests 發送請求時,預設請求下線程一直阻塞,直到有響應返回才處理後面的邏輯。如果遇到伺服器沒有響應的情況時,問題就變得很嚴重了,它將導致整個應用程式一直處於阻塞狀態而沒法處理其他請求。

>>> import requests>>> r = requests.get("http://www.google.coma")...一直阻塞中

正確的方式的是給每個請求顯示地指定一個逾時時間。

>>> r = requests.get("http://www.google.coma", timeout=5)5秒後報錯Traceback (most recent call last):socket.timeout: timed out

Session

在python爬蟲入門教程--快速理解HTTP協議(一)中介紹過HTTP協議是一中無狀態的協議,為了維持用戶端與伺服器之間的通訊狀態,使用 Cookie 技術使之保持雙方的通訊狀態。

有些網頁是需要登入才能進行爬蟲操作的,而登入的原理就是瀏覽器首次通過使用者名稱密碼登入之後,伺服器給用戶端發送一個隨機的Cookie,下次瀏覽器請求其它頁面時,就把剛才的 cookie 隨著請求一起發送給伺服器,這樣伺服器就知道該使用者已經是登入使用者。

import requests# 構建會話session = requests.Session()# 登入urlsession.post(login_url, data={username, password})# 登入後才能訪問的urlr = session.get(home_url)session.close()

構建一個session會話之後,用戶端第一次發起請求登入賬戶,伺服器自動把cookie資訊儲存在session對象中,發起第二次請求時requests 自動把session中的cookie資訊發送給伺服器,使之保持通訊狀態。

項目實戰

最後是一個實戰項目,如何用 requests 實現知乎自動登入並給使用者發私信,我會在下一篇文章中進行講解。

總結

好了,以上就是這篇文章的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的協助,如果有疑問大家可以留言交流,謝謝大家對幫客之家的支援。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.