爬蟲之Reuqests模組使用
阿新 • • 發佈:2020-12-18
一、GET請求
'''
GET請求:
沒有請求體
資料不能超過1k
請求的資料會暴露在瀏覽器的位址列中
'''
1、基本的get請求:
import requests
# 1、基本請求
res=requests.get('http://127.0.0.1:8000/index')
print(res.text)
2、帶引數的GET請求:
(1) params
# 請求地址中攜帶資料(兩種方式) # 第一種,用urlencode進行編碼 from urllib.parse import urlencode,unquote #urlencode是進行url編碼,unquote是解碼 res=requests.get('https://www.baidu.com/s?wd=斗羅大陸') print(res.url) # 第二種: 用params(推薦用這種,因為它會自動對請求引數進行url編碼 res=requests.get('https://www.baidu.com/s',params={'wd':'斗羅大陸'}) print(res.url)
(2)headers
''' header請求頭中,通常放有Host,Referer,User-Agent,Cookie等 Host:主機 Referer:主要用來解決防盜鏈問題(一些網站會根據這個引數來判斷請求源是不是來自自身網站) User_Agent: 瀏覽器標識,主要用來解決檢測是否是瀏覽器發起的問題 Cookie:用來存放使用者記錄,比如賬號登陸後產生cookie,這樣瀏覽器其他頁面就可以根據cookie來判斷該使用者是否登陸了。request模組有單獨的引數來處理該欄位。 ''' header = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36', 'referer':'https://www.baidu.com' } res=requests.get('https://www.baidu.com/s',headers=header)
(3) cookies
# 請求代cookie的兩種方式 # 1、放在headers中 header = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36', 'cookie':'cookie值' } res=requests.get('https://www.baidu.com/s',headers=header) # 2、用request模組中的cookies引數 # cookies可以是一個字典或者cookiesjar物件 from http.cookiejar import CookieJar # 建立一個cookie物件 cookiejar = CookieJar() res=requests.get('https://www.baidu.com/s',cookies={'key':'value'}) res=requests.get('https://www.baidu.com/s',cookies=cookiejar)
二、POST請求
'''
POST請求:
資料不會出現在位址列中
資料大小沒有限制
有請求體
請求體如果有中文或者特殊符號,要使用url編碼
'''
#自動攜帶cookie
session=requests.session()
res =session.post('https://kao.acmcoder.com/enterprise/loginc',data={'phone': '13927037099','pwd': '12345678'},headers=headers)
#這時,再請求該網站的其他頁面,不需要帶cookies
res1=session.get('https://kao.acmcoder.com/index')
# 傳送post請求,攜帶資料(urlencoded和json)
# res=requests.post('http://127.0.0.1:8000/index/',data={'name':'hello'})
# print(res.text)
# res=requests.post('http://127.0.0.1:8000/index/',json={'age':1,},)
# print(res.text)
注意:post請求預設請求頭是:application/x-www-form-urlencoed,如果請求頭設定成application/json,則可以用json傳值給後臺,不能用data傳值(因為data是urlencode)
三、Response響應
1、response響應物件屬性
res=requests.get('https://www.baidu.com/')
res.text #響應的文字
res.content #響應體的二進位制資料,一般是用來獲取響應物件中的檔案、圖片,視訊二進位制資料
res.status_code #響應狀態碼
res.headers #響應頭
res.cookies # 獲取cookie
res.cookies.get_dict() #將cookie轉成字店
res.cookies.items() #將cookie資料轉化成key,value形式
res.url #獲取請求的url
res.history #放重定向之前的地址
res.encoding #響應的編碼方式
res.iter_content() # 獲取圖片,視訊,大檔案資料,迴圈取出
for line in res.iter_content():
f.write(line)
'''
注意:如果遇到打印出來出現亂碼,可以用一下兩個方法解決:
方法1:
res.encoding='gb2312'
方法2:
res.encoding=res.apparent_encoding
'''
json資料解析
import json
res.json()
#等價於
json.loads(res.text)
四、requests的高階用法
1、證書驗證問題
# SLL證書的驗證問題
# 方法1:verify設定為false,忽略對SLL證書的驗證
respone=requests.get('https://www.12306.cn',verify=False) #不驗證證書,但是會有警告
#方法2:
from requests.packages import urllib3
urllib3.disable_warnings() #關閉警告
respone=requests.get('https://www.12306.cn',verify=False) #不驗證證書,也沒有警告
# 方法3:新增證書
respone=requests.get('https://www.12306.cn',
cert=('/path/server.crt',
'/path/key'))
2、設定代理
response=requests.get('http://127.0.0.1:8000/index',proxies={'http':'代理ip:port','https':})
'''
高匿和透明代理::高匿代理,後端無論如何拿不到你的ip,透明代理,後端能夠拿到你的ip
還可以用代理池,每次請求都隨機從代理池中取一個
後端拿到透明代理的ip方法, 後端取引數:X-Forwarded-For
'''
3、超時設定:
timeout=0.1 #代表接收資料超時時間 ,float型別超時
timeout=(0.1,0.2) # 第一個引數0.1代表連線超時,第二個引數代表資料接收超時,tuple型別超時
res=requests.get('http://www.baidu.com',timeout=timeout)
4、上傳檔案
res=requests.post('http:127.0.0.1:8000/index',files={'myfile':open('xx.jpg','rb')})
5、其他設定
# 認證設定(你見不到了)
import requests
r=requests.get('xxx',auth=('user','password'))
print(r.status_code)
# 異常處理
import requests
from requests.exceptions import * #可以檢視requests.exceptions獲取異常型別
try:
r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
print('===:')
except Exception as e:
print(e)