python爬蟲經常使用庫之requests詳解

python爬蟲經常使用庫之requests詳解

By 平常學python html

在使用了urllib庫以後,感受很麻煩,好比獲取個cookie都須要分幾步,代碼又多,這和python的風格好像有點不太像哈,那有沒有更加容易點的請求庫呢?答案是有的,那就是第三方庫requests,這個庫的做者是大名鼎鼎的kennethreitz,創做這個庫的緣由就是想讓python開發者更加容易地發起請求,處理請求。裏面還有個名字:HTTP for Humans,顧名思義,就是用來請求http的。想看源代碼的能夠在github上搜索他的名字就能夠看到了。python

接下來介紹下怎樣用這個庫吧!git

( 這文章原創首發於公衆號[平常學python] )github

由於這是第三方庫,因此咱們須要下載,須要在命令行輸入json

pip install requests

若是你裝的是anaconda的忽略這條安全

安裝好了就來進行使用吧markdown

1

進行簡單的操做

發送一個get請求cookie

# 發送請求
import requests
response = requests.get('http://httpbin.org/get')
# 獲取返回的html信息
print(response.text)

這樣就發送了一個get請求,而且還打印了返回的內容,這個再也不須要知道網頁是哪一個編碼的,不過有時會出現編碼問題,可是你也能夠指定編碼類型,如:session

response.encoding = 'utf-8'

指定完成後就能夠正常編碼了,前提你得知道網頁的編碼類型。python爬蟲

出了上面這些,咱們還能夠獲取下面的信息

print(response.headers)
# 請求狀態碼
print(response.status_code)
# 獲取網頁的二進制內容
print(response.content)
print(response.url) # 獲取請求的url
print(response.cookies) # 獲取cookie

是否是以爲很容易,一行代碼就能夠了。再也不須要幾步代碼什麼的了。

接下來被髮爬的話帶上個請求頭來進行請求

# 還能夠添加請求頭進行請求
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'}
response = requests.get('http://httpbin.org/get', headers=headers )
print(response.headers)
print(response.text)

加個請求頭也就是加個關鍵字參數而已

還能夠進行帶參數的get請求

# 進行帶參數的get請求
data = {'name': 'june', 'password': 123456}
response = requests.get('http://httpbin.org/get', params=data)
print(response.text)

那若是須要登錄呢?post請求怎樣發?告訴你,照樣很簡單

# 進行post請求
data = {'name': 'june', 'password': 123456}
response = requests.post('http://httpbin.org/post', data=data, headers=headers)
print(response.text)

是否是很簡單,也是加個data關鍵字參數,把要提交的登錄參數進行post上去。

那除了上面的兩個請求,還能進行別的請求嗎?我能夠很是開心地告訴你,能夠的。好比,你要發個put請求,如這樣

requests.put()
requests.delete()

這個就是發送put請求和delete請求的,其餘的請求也是這樣發送,就不一 一說了。

2

進行復雜點的請求

在登錄的時候咱們有時候須要輸入驗證碼,那怎樣輸呢?爬蟲的看不了網頁,最簡單的作法就是把這個驗證碼的圖片下載下來而後手動輸入,那麼咱們怎樣下載呢?咱們能夠向這個圖片的url發送請求,而後把返回內容以二進制方法存入文件裏面就能夠了。

代碼以下:

#
 從網上讀取二進制數據,好比圖片
response = requests.get('https://www.baidu.com/img/bd_logo1.png', headers=headers)
# 這個是直接獲取字節碼,這個是要保存的文件
print(response.content)
# 這個是獲取解碼後的返回內容,這個是亂碼
print(response.text)
# 用文件來把圖片下載下來
with open('baidu.png', 'wb') as f: # 注意寫的方式是以二進制方式寫入
 f.write(response.content)
 print('下載完畢')

仍是很簡單,不得不說,這個庫太好用了。

當咱們須要上傳文件的時候,好比圖片,咱們還能夠用post方法把他發送出去

# 上傳文件
files = {'picture': open('baidu.png', 'rb')}
response = requests.post('http://httpbin.org/post', files=files)
print(response.text)

獲取cookie並簡單處理一下
# 獲取cookie
response = requests.get('https://www.baidu.com')
for k, v in response.cookies.items():
 print(k, '=', v)

當網頁返回內容是json格式是,咱們不須要用json庫來解析,咱們能夠直接利用requests的方法進行解析,二者的效果是同樣的

# 解析json
j = response.json() # 能夠用json庫來解析,結果同樣

在urllib庫時保存登錄信息須要把cookie保存下來,可是在requests庫裏面,咱們只須要用requests.session()來保存信息就能夠了。

# 用會話來保持登錄信息
session = requests.session()
response = session.get('http://httpbin.org/cookies/set/number/123456')
print(response.text)

這樣就能夠保存登錄了,不須要爲cookie操心了,可是每次獲取一個session就能夠了,而後用來請求或者其餘操做。不須要每次請求或者操做都建立一個sesion出來,這樣是保存不了登錄信息的

當一個網站不安全,須要你用證書驗證的,好比這個網站

https://www.12306.cn

python爬蟲經常使用庫之requests詳解
這時要訪問裏面的網站內容,咱們就須要進行驗證,代碼以下

# 證書驗證
response = requests.get('https://www.12306.cn', verify=False) #
不加這個關鍵字參數的話會出現驗證錯誤問題,由於這個網站的協議不被信任

這樣就能夠進行訪問了,可是會有一條警告

E:\anaconda\lib\site-packages\urllib3\connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
 InsecureRequestWarning)

以爲不美觀的,咱們還能夠在請求時加個cert關鍵字參數,值爲可信任的證書,爲一個元組,寫上帳號和密碼之類的,這裏就不演示了

遇到須要認證的網站,咱們也能夠這樣

from requests.auth import HTTPBasicAuth
# 設置認證
# requests.get('須要認證的網址', auth=HTTPBasicAuth('user', 'passwd')) # 因爲找不到須要認證的網址,因此先寫個主體
# 還能夠這樣認證
# requests.get('須要認證的網址', auth=('user', 'passwd')) # 這樣就簡單點

因爲我找不到須要認證的網站,因此就不演示了。

requests還能夠用代理ip來進行請求網站來防止ip被封以致於本身爬不了的尷尬。使用代理ip也比urllib庫簡單得多,代碼以下:

### 
### 設置代理
### proxies = {'http': 'http://122.114.31.177:808',
###  'https': 'https://119.28.223.103:8088'}
### 在請求時添加上列代理
### response = requests.get('http://httpbin.org/get', proxies=proxies)
### print(response.text)
### ```
上面的字典格式須要一 一對應,而後在請求時加上個關鍵字參數proxies就能夠了。

3
請求異常處理

在程序運行時,遇到錯誤時程序就會被強行中止,若是想要繼續運行,就須要進行捕捉異常來讓程序繼續運行。

在requests庫中有個處理異常的庫requests.exceptions

這裏簡單地處理下請求超時的處理狀況

import requests
from requests.exceptions import ReadTimeout, ConnectTimeout, HTTPError, ConnectionError, RequestException

捕捉異常

try:
response = requests.get('http://httpbin.org/get', timeout=0.1) # 規定時間內未響應就拋出異常
print(response.text)
except ReadTimeout as e:
print('請求超時')
except ConnectionError as e:
print('鏈接失敗')
except RequestException as e:
print('請求失敗')

這裏捕捉了三個異常,由於ReadTimeout是ConnectionError的子類,因此先捕捉ReadTimeout,再捕捉父類的。而ConnectionError 和 RequestException 同理

更多的異常處理能夠查看文檔哈。

### 4
### 最後
以上均是我在學習時的筆記和我的在運用時遇到的一些坑都簡單地記載了上去,但願對你有用哈,若是想看更多的用法能夠去官方文檔查看。還有代碼我放在了github上,要的話能夠上去查看。

GitHub:https://github.com/SergioJune/gongzhonghao_code/tree/master/python3_spider
官方文檔:http://docs.python-requests.org/zh_CN/latest/index.html
學習參考資料:https://edu.hellobi.com/course/157
相關文章
相關標籤/搜索