1. 程式人生 > 其它 >爬蟲之Reuqests模組使用

爬蟲之Reuqests模組使用

技術標籤:爬蟲python

一、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)