Python爬蟲(二)使用Requests

安裝好requests庫後,可以繼續後續的內容了。
在入手requests庫之前大致看了一下urllib庫的使用,發現使用過程非常複雜麻煩,有很多不方便的地方,比如處理網頁驗證和Cookies時,需要寫Opener和Handler來處理,索性跳過了urllib,直接使用更強大的requests庫,有了它,Cookies,登錄驗證,代理設置等操作都不是事兒。

首先大概給出需要用到的庫,直接import就行。

import requests
from requests.packages import urllib3
import logging

GET請求

在urllib中用urlopen()方法請求網頁,實際上就是以GET方式請求網頁,而requests庫中相應的方法就是get()方法,可以說表達更加明確了。給出一個請求網頁的栗子:

r=requests.get("https://www.baidu.com")
print(r.status_code)
print(r.cookies)
print(type(r))
print(type(r.text))
print(r.text)
s=requests.get("http://httpbin.org/get")
print(s.text)

這個實例非常簡單,基本上都能看得懂,調用get()方法請求百度的主頁,實現的是與urlopen()方法相同的操作,得到一個Response對象,分別輸出的是狀態碼,Cookies,Response的類型,響應體類型以及內容。
通過運行可以發現,返回類型是requests.models.Response,響應體類型是字符串str,Cookies的類型是RequestsCookieJar。
添加參數
對於GET請求,如果要附加額外的信息,可以直接在get()請求中添加:

r=requests.get("http://httpbin.org/get?name=germey&age=22")
exit() if not r.status_code==requests.codes.ok else print("Request Successfully")
print(r.text)
print(type(r.text))
print(type(r))
print(r.json())#返回得到將json格式的字符串轉換成字典

這樣做完全可以,但如果讓它更加人性化,可以利用params參數:

data={
    'name':'germey'
    'age':22
}
r=r=requests.get("http://httpbin.org/get",params=data)
print(r.text)

抓取二進制數據
其實,如果想抓取圖片、音頻、視頻等文件,也都是可以的。這些類型的文件本質上都是由二進制碼組成的,由於有特定的保存格式和對應的解析方式,纔有了這些形形色色的多媒體,所以想要抓取它們,就要拿到它們的二進制碼。
以GitHub的站點圖標爲例:

r=requests.get("https://github.com/favicon.ico")
with open('favicon.ico','wb')as f:
    f.write(r.content)

這裏用了open()方法,第一個參數是文件名稱,第二個參數是以二進制寫的形式打開,可以向文件裏寫入二進制數據。
運行結束後,可以在文件的根目錄裏找到名爲favicon.ico的圖標。

高級用法

文件上傳
requests可以模擬提交一些數據,如果有的網站需要上傳文件,可以用它來實現:

files={'file':open('favicon.ico','rb')}
r=requests.post("http://httpbin.org/post",files=files)
print(r.text)

運行結束後,這個網站會返回響應,裏面就包含了files這個字段,而form字段是空的。
部分運行截圖如下
在這裏插入圖片描述
Cookies
先來看一個非常簡單的獲取Cookies的過程:

r=requests.get("https://baidu.com")
print(r.cookies)
for key,value in r.cookies.items():
    print(key+'='+value)

首先調用cookies屬性成功得到Cookies,然後用item()方法將其轉化爲元組組成的列表,遍歷輸出每一個cookie的名稱和值。
當然,也可以用cookie來維持登錄狀態。
以知乎爲例來說明,首先登錄知乎,將Headers中的cookie的內容複製,然後有如下代碼:

headers={
    'Cookie':‘(這裏放自己的cookie就好)’
    'Host': 'www.zhihu.com',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36'
}
r=requests.get("https://www.zhihu.com",headers=headers)
print(r.text)

會話維持
在requests中,如果直接利用get()或post()等方法的確可以做到模擬網頁的請求,但是這樣實際上相當於不同的會話,也就是說相當於用兩個瀏覽器打開了不同的頁面。儘管可以在兩次請求時設置一樣的cookies,但這樣非常繁瑣。
因此可以使用Session對象維持同一會話。利用它,我們可以方便地維持一個會話,而且不用擔心cookies的問題。

s=requests.session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r=s.get('http://httpbin.org/cookies')
print(r.text)

這裏請求了一個測試網址http://httpbin.org/cookies/set/number/123456789,請求這個網址時,可以設置一個cookie,名字叫number,內容是123456789,隨後又請求了http://httpbin.org/cookies,此網址可以獲取當前的cookies。運行後依然可以成功獲取到設置的cookies。
SSL證書驗證
requests還提供了證書驗證功能。
當發送HTTP請求的時候,他會檢查SSL證書,可以使用verify參數控制是否檢查此證書,如果不加verify參數的話,默認是True,會自動驗證。
這裏使用測試網址https://www.12306.cn。
12306的證書沒有被CA機構信任,會出現證書驗證錯誤的結果。
正常爬取這個網頁會出現SSLError的錯誤,添加verify參數後:

urllib3.disable_warnings()
response=requests.get('https://www.12306.cn',verify=False)
print(response.status_code)
#2.捕捉警告到日誌
logging.captureWarnings(True)
response=requests.get('https://www.12306.cn',verify=False)
print(response.status_code)

將會打印出請求成功的狀態碼200.
如果僅僅添加參數,還會出現給它指定證書的警告,因此使用urllib3或logging庫可以將警告屏蔽。
代理設置
對於某些網站,在測試的時候請求幾次,能正常獲取內容,但一旦開始大規模爬取,對於大規模且頻繁的請求,網站可能會彈出驗證碼,或者跳轉到登錄認證頁面,更甚者可能會直接封禁客戶端IP。
爲了防止這種情況發生,需要設置代理來解決,這需要用到proxies參數。

proxies={
    'http':'這裏添加自己的有效代理',
    'https':'這裏添加自己的有效代理',
}
requests.get('https:www.taobao.com',proxies=proxies)

若代理需要使用HTTP Basic Auth 可使用類似http://user:password@host:port這樣的語法來設置代理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章