Python 爬蟲基礎(chǔ)入門篇——Requests模塊


前幾次文章介紹了頁面爬取的三種用法丹墨,并且也使用到Requests模塊,但是沒有詳細的講解璃谨,本次推文專門帶大家了解一下Requests模塊匠璧。

一桐款、模塊簡介

Requests是使用Apache2 licensed 許可證的HTTP庫;

是一個基于Python開的Http庫夷恍,其在Python內(nèi)置模塊的基礎(chǔ)上進行了高度的封裝魔眨,從而我們在使用Http請求的時候變得非常的簡單;

比urllib2模塊更簡潔好用裁厅;

二冰沙、安裝

安裝很簡單

pip install requests

三、請求類型

HTTP的請求類型分別為:GET(獲取數(shù)據(jù))执虹、POST(提交表單)拓挥、PUT(更新)、DETELE(刪除)袋励、HEAD(獲取相應頭信息)侥啤、OPTIONS(獲取指定資源所支持HTTP請求方法)以及PATCH(新引入的,是對PUT方法的補充茬故,用來對已知資源進行局部更新)

常用到的是GET與POST.

基本用法都很簡單:

r = requests.get('https://api.github.com/events')

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')

具體使用哪種方式盖灸,是取決于服務端的限制,我們也可以通過options的方式獲取所支持的HTTP請求方式磺芭;

四赁炎、請求參數(shù)

HTTP請求的方式有哪些參數(shù)呢?

4.1 url 請求地址

r = requests.get('http://github.com') #括號中的地址就是url

4.2 params 接口參數(shù)

params= {'key1': 'value1', 'key2': 'value2'}

r = requests.get("http://httpbin.org/get", params=params)

Get還可以使用 ”?Key=value” 拼接的方式

r = requests.get("http://httpbin.org/get?key=value")

4.3 headers 頭部信息

headers是一個字典的形式钾腺,可以隨便找一個網(wǎng)站徙垫,

按下F12——>選擇Network——>選擇一個Http請求讥裤,

就可以查看到Request Headers的信息了;

content-type:顯示此HTTP請求提交的內(nèi)容類型姻报;一般在開發(fā)過程己英,會約定好使用什么字符編碼格式來提交數(shù)據(jù),然后會按照固定的字符編碼來解析提交的數(shù)據(jù)吴旋;

我們也可以從瀏覽器上直接獲取到接口的傳遞參數(shù)時的編碼類型:

User-Agent:HTTP客戶端運行的瀏覽器類型的詳細信息损肛。通過該頭部信息web服務器可以判斷到當前HTTP請求的客戶端瀏覽器類別;

我們在爬蟲的時候荣瑟,有些網(wǎng)站限制了

User-agent(查看網(wǎng)站的robots.txt文檔)治拿,所以需要在爬蟲的時候偽裝成瀏覽器去訪問;

如果大家不知道寫啥可以去打開瀏覽器隨便找一個網(wǎng)站F12查看網(wǎng)絡(luò)請求的User-agent值就可以了褂傀;

referer:包含一個URL忍啤,用戶從該URL代表的頁面出發(fā)訪問當前請求的頁面加勤;

某些網(wǎng)頁可能設(shè)置限制了必須要從某個頁面才能點擊進入下一個頁面仙辟,如果直接進入后一個鏈接,將會識別為機器所為鳄梅,不是真實的人在操作叠国;

headers的設(shè)置還有很多,每一種配置都有自己的含義戴尸;

設(shè)置headers中的User-Agent + Referer也是反爬蟲的一種手段粟焊;

4.4 cookie

Cookie 的返回對象為 RequestsCookieJar,與字典類似孙蒙;我們常遇到的跨域的問題與之相關(guān)项棠;

cookies= requests.cookies.RequestsCookieJar()

cookies.set('tasty_cookie', 'yum', domain=’pythonzhishixuetang.com’, path='/cookies')

cookies.set('gross_cookie', 'blech', domain=’pythonzhishixuetang.com’, path='/elsewhere')

url = 'http://pythonzhishixuetang.org/getlist'

r = requests.get(url, cookies=cookies)

我們怎么看網(wǎng)站的cookies信息呢?

F12——>點擊 Application——>選擇左邊的 Cookies挎峦,

就可以查看網(wǎng)站的所有cookies信息了

各種參數(shù)的含義:

4.5 timeout 響應超時

響應超時處理香追,理論上所有的請求都應該加上超時時間,防止程序可能永遠失去相應坦胶;

4.6 SSL證書驗證

Requests 可以為 HTTPS 請求驗證 SSL 證書透典,SSL 驗證默認是開啟的,如果證書驗證失敗顿苇,Requests 會拋出 SSLError:

import requests

r = requests.get('https://12306.cn/')
print(r.text)

結(jié)果如下:

我們可以設(shè)置不校驗SSL證書峭咒,添加參數(shù)verify=False,如下

import requests

r = requests.get('https://12306.cn/',verify=False)
r.encoding='utf-8'
print(r.text)

結(jié)果

對于私有證書纪岁,你也可以傳遞一個 CA_BUNDLE 文件的路徑給 verify凑队;如果 verify 設(shè)為文件夾路徑,文件夾必須通過 OpenSSL 提供的 c_rehash 工具處理幔翰。

requests.get('https://github.com', verify='/path/to/certfile')

你也可以指定一個本地證書用作客戶端證書漩氨,可以是單個文件(包含密鑰和證書)或一個包含兩個文件路徑的元組:

requests.get('https://kennethreitz.org', cert=('/path/client.cert', '/path/client.key'))

#或

requests.get('https://kennethreitz.org', cert='/wrong_path/client.pem')

不過本地證書的私有 key 必須是解密狀態(tài)短条。目前,Requests 不支持使用加密的 key才菠。

4.7 auth 身份驗證

許多要求身份認證的web服務都接受 HTTP Basic Auth茸时。這是最簡單的一種身份認證,并且 Requests 對這種認證方式的支持是直接開箱即可用赋访;

requests.get('https://api.github.com/user', auth=('user', 'pass'))

如下:

import requests

r=requests.get('https://api.github.com/user')
print(r.text) #提示需要登錄身份信息

r=requests.get('https://api.github.com/user',auth=('xxx@qq.com', 'xxx'))#可以把這里的賬號換成自己的github的賬號與密碼
print(r.text) #獲取到個人賬號信息

結(jié)果

[圖片上傳失敗...(image-cb2feb-1618584887859)]

當然auth 也是可以存在會話session(在下面會介紹)中可都,不需要每次請求都去設(shè)置一次;

當然我們可以自定義認證方式蚓耽,要想自己實現(xiàn)渠牲,就從 AuthBase 繼承一個子類,并實現(xiàn) call() 方法:

class MyAuth(requests.auth.AuthBase):

    def __call__(self, r):
        #Implement my authentication
        return r

url = 'http://httpbin.org/get'

r= requests.get(url, auth=MyAuth())

print(r)

4.8 proxies 代理

需要使用代理步悠,你可以通過為任意請求方法提供 proxies 參數(shù)來配置單個請求:

proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}

requests.get("http://example.org", proxies=proxies)

如果你的代理需要auth驗證签杈,

也可以使用 http://user:password@host/ 語法:

proxies = {
"http": "http://user:pass@10.10.1.10:3128/",
}

五、 會話

什么是會話鼎兽?

即session會話對象可以跨請求保持某些參數(shù)

import requests

r=requests.get("http://httpbin.org/cookies/set/sessioncookie/python") #設(shè)置一個name為sessioncookie 值為python的cookie值

r=requests.get('http://httpbin.org/cookies') #獲取cookie值

print(r.text)                                #返回結(jié)果為空

s = requests.Session()

s.cookies.set("sessioncookie","python zhi shi xue tang") #在會話中設(shè)置一個name為sessioncookie 值為python zhi shi xue tang的cookie值

r = s.get("http://httpbin.org/cookies")                  #通過會話使用Get方式獲取所有的cookie

print(r.text)                                #獲取到cookie值

簡單的說就是創(chuàng)建一個會話答姥,并且在會話中保存cookie值,那所有通過該會話發(fā)出去的請求都含有會話中保存的cookie谚咬;

session 還可以設(shè)置headers鹦付、auth、proxies择卦、cert以及verify等等敲长,可以嘗試一下;

這種方式大大的提高了性能與效率秉继;

六祈噪、響應內(nèi)容

6.1 text

返回的是Unicode型的數(shù)據(jù)

import requests

r = requests.get('https://api.github.com/events')
print(r.text)

當你訪問 r.text 之時,Requests 會基于 HTTP 頭部對響應的編碼作出有根據(jù)的推測尚辑。能夠使用 r.encoding 屬性來改變它:

r.encoding = 'utf-8'

6.2 content

返回的是bytes型也就是二進制的數(shù)據(jù)

import requests

r = requests.get('https://api.github.com/events')
print(r.content)

以字節(jié)的方式訪問請求響應體辑鲤;

6.3 json

返回的是一個Json格式的數(shù)據(jù)

import requests

r = requests.get('https://api.github.com/events')
for item in r.json():
    print(item)

如果 JSON 解碼失敗,r.json() 就會拋出一個異常

如果是獲取文本腌巾,可以通過r.text遂填;如果是獲取圖片,文件澈蝙,則可以通過r.content吓坚;如果是獲取json對象,可以通過r.json()灯荧;

七礁击、總結(jié)

本篇文章講述了Requests模塊的一些內(nèi)容,在之前爬蟲的教程中,只是非常簡單的使用了Requests模塊哆窿,沒有使用過多的功能链烈。后面的教程中可能就會用到比較多的功能了,比如設(shè)置Requests的headers信息挚躯,使用auth强衡、會話session、代理等等方式码荔,希望大家能靈活運用漩勤。

對了,http://httpbin.org/ 網(wǎng)站是一個可以能測試 HTTP 請求和響應的各種信息的網(wǎng)站缩搅,蠻好用的越败,大家可以了解一下。

最后還是貼出Requests模塊官網(wǎng)鏈接:

https://requests.readthedocs.io

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硼瓣,一起剝皮案震驚了整個濱河市究飞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌堂鲤,老刑警劉巖亿傅,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異筑累,居然都是意外死亡袱蜡,警方通過查閱死者的電腦和手機丝蹭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門慢宗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奔穿,你說我怎么就攤上這事镜沽。” “怎么了贱田?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵缅茉,是天一觀的道長。 經(jīng)常有香客問我男摧,道長蔬墩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任耗拓,我火速辦了婚禮拇颅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乔询。我一直安慰自己樟插,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著黄锤,像睡著了一般搪缨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸵熟,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天副编,我揣著相機與錄音,去河邊找鬼流强。 笑死齿桃,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的煮盼。 我是一名探鬼主播短纵,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼廊营,長吁一口氣:“原來是場噩夢啊……” “哼畅涂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起序六,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤报破,失蹤者是張志新(化名)和其女友劉穎悠就,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體充易,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡梗脾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盹靴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炸茧。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖稿静,靈堂內(nèi)的尸體忽然破棺而出梭冠,到底是詐尸還是另有隱情,我是刑警寧澤改备,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布控漠,位于F島的核電站,受9級特大地震影響悬钳,放射性物質(zhì)發(fā)生泄漏盐捷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一默勾、第九天 我趴在偏房一處隱蔽的房頂上張望碉渡。 院中可真熱鬧,春花似錦灾测、人聲如沸爆价。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铭段。三九已至骤宣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間序愚,已是汗流浹背憔披。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留爸吮,地道東北人芬膝。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像形娇,于是被迫代替她去往敵國和親锰霜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容