1. 程式人生 > >python爬蟲學習筆記-requests用法

python爬蟲學習筆記-requests用法

python內建的urllib在某些高階應用時存在很多不方便的地方且功能似乎也沒有想象的那麼強大,於是更為強大第三方庫requests庫應運而生,有了它,cookies,代理,登陸操作都是簡化很多。
首先確認安裝requests庫:

pip install requests

1.類比於urllib的urlopen()方法傳送請求,requests對應的方法是get(),例項如下:

r=requests.get('http://httpbin.org/get')
print(r.status_code)#輸出狀態碼
print(r.text)#輸出文字
print(type(
r))#輸出返回型別 print(r.cookies)#輸出cookies

結果如下:

200
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Connection": "close",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.20.1"
  },
  "origin": "180.117.236.124",
  "url": "http://httpbin.org/get"
}

<class 'requests.models.Response'>
<RequestsCookieJar[]>

如果要給url附加額外資訊,只要在get()方法中傳入params引數即可,此引數為字典型別,例項如下:

data={'name':'germey','age':22}
r1=requests.get('http://httpbin.org/get',params=data)
if (r.status_code==200)&(r1.status_code==200):
	print(r.status_code)
	print(r.json)#返回字典
	print(type(r))
	print(r.cookies)#型別RequestsCookieJar
	print(r1.text)

對於返回內容,可以通過呼叫json()方法得到字典格式結果;
新增headers以及Post請求的用法均和urllib庫中的用法類似,這裡就不多贅述了,下面主要是requests的高階用法介紹。

2.檔案的上傳:
假設有的網站請求資料需要通過上傳檔案來實現,這個時候就可以用requests來實現,例項如下:

files={'file':open('mei.jpg','rb')}
r3=requests.post('http://jandan.net/ooxx',files=files)
print(r3.text)

3.cookies:
之氣那用urllib設定cookies寫法很複雜,需要使用Handler以及Opener,而使用requests可以直接設定cookies,例項如下:

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

返回結果為:<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
BDORZ=27315
當然也可以使用cookies來維持登陸狀態,只要新增自己的cookies鍵名與鍵值到headers引數中即可,例項如下,以CSDN網站為例:

headers={
		'Cookie': 'dc_session_id=10_1542115241432.364538; uuid_tt_dd=6658982548662906625_20181113; ADHOC_MEMBERSHIP_CLIENT_ID1.0=6cfa3e25-f923-fa2b-abd6-b11133353fea; _ga=GA1.2.667144044.1542115248; _gid=GA1.2.325796028.1542208355; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1542208355,1542208878,1542281934,1542285273; TY_SESSION_ID=13e78550-de79-470b-aa24-9daabf6553a0; _gat_gtag_UA_127895514_1=1; SESSION=c712c4e2-c5f9-4a00-8c29-5492c3f0d276; CSDNToken=3a4409cdba704d8783da28cbc62798ae; UserName=weixin_42672765; UserInfo=FaqBbhadnTE44s3wXmAm4sMqRwceUmC62WR6FZTpSwr6J9VLAjvoOoFzPEeXZbXBAZmTVhcoagxmId7CgrwQNg%3D%3D; UserToken=FaqBbhadnTE44s3wXmAm4sMqRwceUmC62WR6FZTpSwr6J9VLAjvoOoFzPEeXZbXBqL2%2F62GvudapCrGwn0fPcptUjJQBnF3L3vtguP6LgM%2FkGPiLcnBrslye%2FUzHow2v; UserNick=%E6%87%92%E6%87%92%E7%9A%84%E4%B9%A6%E8%99%AB; AU=995; UN=weixin_42672765; BT=1542286541648; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1542286543; dc_tos=pi8jwv; tipShow=true'
				'Host':'www.csdn.net',
				'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
	}
r5=requests.get('https://www.csdn.net/',headers=headers)
print(r5.text)

cookies設定正確執行後即可看到網頁的原始碼
3.但是使用cookies維持會話有一個問題,每一訪問都必須設定成一樣的cookies,否則相當於每一次重新訪問都又開啟一次瀏覽器,而使用session物件就不會出現那這樣的問題。做過網站開發的同學肯定對這個傢伙很熟悉,我們用它來記錄使用者會話所需的資訊,requests用法如下:

s=requests.Session()
s.get('https://httpbin.org/cookies/set/number/123456789')
r6=s.get('https://httpbin.org/cookies')
print(r6.text)

返回結果如下:
{
“cookies”: {
“number”: “123456789”
}
}
我們第一請求時設定了cookies並用session物件來儲存(number:12345789),隨後再次請求,我們依然可以得到cookies,說明兩次的請求其實是同一個會話。
4.SSL證書驗證:
requests還提供了驗證SSL證書的功能,當傳送HTTP請求時,他會預設檢查SSL證書,可以通過設定verify引數為False來忽略檢查SSL證書,但是一般會發出警告,建議我們指定證書,指定證書的例項如下:

r7=requests.get('https://www.12306.cn',cert=('/path/server.crt','/path/key'))#本地的證書名稱和路徑
print(r7.status_code)

可以指定單個檔案,也可以指定檔案與其路徑的元組。
5.一般網站為了保證頻寬不過多被爬蟲佔據,會採用一些反爬蟲策略,包括驗證碼,登陸,或者直接封掉爬蟲的IP,導致一段時間無法訪問,這是我們就需要使用代理,通過設定requests的proxies引數即可實現,例項如下:

proxies={'http':'http://10.10.1.10:3128'
		'https':'https://10.10.1.10:1080'
	}
r=requests.get('url',proxies=proxies)

以上時http協議的代理,當然如果你能找到的話也可以使用socks代理,前提需要安裝‘requests[socks]這個庫檔案。
6.超時:timeout,用法與urllib相同
7.身份驗證:
對於需要登陸認證的頁面,requests提供了身份認證的功能,通過在get()方法中設定auth引數,將使用者名稱和密碼組成的元組傳入,即可實現,例項如下:

shenfen=('********','************')
r8=requests.get('http://www.youku.com',auth=shenfen)#引數使用元組,預設使用HTTPBasicAuth來驗證
print(r8.status_code)

當然也有比較繁瑣的辦法(額,不是都有簡單的方法了嗎?)給每一個引數都傳遞一個HTTPBasicAuth類來實現,即

r8=requests.get('http://www.youku.com',auth=HTTPBasicAuth('username','password'))

requests庫的用法還有很多,更多的還是要參考官方文件。