requests庫使用

1、requests簡介

1.requests概念

Requests 惟一的一個非轉基因的 Python HTTP 庫,人類能夠安全享用。html

requests模塊是python中原生的基於網絡請求的模塊,其主要做用是用來模擬瀏覽器發起請求。功能強大,用法簡潔高效。python

2.爲何使用requests

與urllib的區別,urllib的缺點git

  • 手動處理url編碼github

  • 手動處理post請求參數web

  • 處理cookie和代理操做繁瑣json

requests模塊有點:瀏覽器

  • 自動處理url編碼安全

  • 自動處理post請求參數服務器

  • 簡化cookie和代理操做cookie

3.requests安裝

pip install requests

requests最簡單實例:

import requests
r = requests.get("http://www.baidu.com")
r.status_code
r.encoding = 'utf-8'
r.text

使用基本流程:

  • 指定url

  • 基於requests模塊發起請求

  • 獲取響應對象中的數據值

  • 持久化存儲

2、requests的方法

User-Agent

請求載體身份標識的假裝:

  • User-Agent:請求載體身份標識,經過瀏覽器發起的請求,請求載體爲瀏覽器,則該請求的User-Agent爲瀏覽器的身份標識,使用爬蟲程序發起的請求,則該請求的載體爲爬蟲程序,則該請求的User-Agent爲爬蟲程序的身份標識。能夠經過判斷該值來獲知該請求的載體到底是基於哪款瀏覽器仍是基於爬蟲程序。

  • 反爬機制:某些門戶網站會對訪問該網站的請求中的User-Agent進行捕獲和判斷,若是該請求的UA爲爬蟲程序,則拒絕向該請求提供數據。

  • 反反爬策略:將爬蟲程序的UA假裝成某一款瀏覽器的身份標識。

1.requests庫的7個方法

Requests庫的7個主要方法:

  • requests.request():構造一個請求,支撐一下各方法的基礎方法
  • requests.get():獲取HTML網頁的主要方法,對應於HTTP的GET
  • requests.head():獲取HTML網頁頭信息的方法,對應HTTP的HEAD
  • requests.post():向HTML網頁提交POST請求的方法,對應於HTTP的POST
  • requests.put():向HTML網頁提交PUT請求的方法,對應於HTTP的PUT
  • requests.patch():向HTML網頁提交局部修改請求,對應於HTTP的PATCH
  • requests.delete():向HTML網頁提交刪除請求,對應於HTTP的DELETE

Requests的主要方法

1.requests.request(method, url, **kwargs)

  • method:請求方式,對應get/put.post等7種
  • url:擬獲取頁面的url連接
  • **kwargs:控制訪問的參數,共13個
r = requests.request('GET', url, **kwargs)
r = requests.request('HEAD', url, **kwargs)
r = requests.request('POST', url, **kwargs)
r = requests.request('PUT', url, **kwargs)
r = requests.request('PATCH', url, **kwargs)
r = requests.request('delete', url, **kwargs)
r = requests.request('OPPTIONS', url, **kwargs)

**kwargs:控制訪問的參數,均爲可選項

  • params:字典或字節序列,做爲參數增長到url中
eg:
kv = {'key1':'value1', 'key2':value2'}
r = requests.request('get', 'http://python123.io/ws', params=kv)
print(r.rul)
=> http://python123.io/ws?key1=value1&key2=value2
  • data:字典、字節序列或文件對象,做爲Request的內容
eg:
kv = {'key1':'value1', 'key2':value2'}
r = requests.request('POST', 'http://python123.io/ws', data=kv)
body = '主題內容'
r = requests.request('POST', 'http://python123.io/ws', data=body)
  • json:JSON格式的數據,做爲Request的內容
eg:
kv = {'key1:value1'}
r = requests.request('post', 'http://python123.io/ws', json=kv)
  • headers:字典,HTTP定製頭
hd = {'user-agent': 'Chrome/10'}
r = requests.request('POST', 'http://python123.io/ws', headers=hd)
  • cookies:字典或CookieJar,Request中的cookie
  • auth:元組,支持HTTP認證功能
  • files:字典類型,傳輸文件
fs = {"file':open('data.xls', 'rb')}
r = requests.request('POST', 'http://python123.io/ws', files=fs)
timeout:設定超時時間,秒爲單位
r = requests.request('GET', 'http://www.baidu.com', timeout=10)
  • proxies:字典類型,設定訪問代理服務器,能夠增長登陸認證
pxs = {'http': 'http://user:pass@10.10.10.1:1234'
'https': 'https://10.10.10.1:4321'}
r = requests.request('GET', 'http://www.baidu.com', proxies=pxs)
  • allow_redirects:True/False,默認爲True,重定向開關
  • stream:True/False,默認爲True,獲取內容當即下載開關
  • verify:True/False,默認爲True,認證SSL證書開關
  • cert:本地SSL證書路徑

2.requests.get(url, params=None, **kwargs)

  • url:擬獲取頁面的url連接
  • params:url中的額外參數,字典或字節流格式,可選
  • **kwargs:12個控制訪問的參數

3.requests.head(url, **kwargs)

  • url:擬獲取頁面的url連接
  • **kwargs:13個控制訪問的參數

4.requests.post(url, dats=None, json=None, **kwargs)

  • url:擬更新頁面的url連接
  • data:字典、字節序列或文件,Request的內容
  • json:JSON格式的數據,Request的內容
  • **kwargs:11個控制訪問的參數

5.requests.put(url, data=None, **kwargs)

  • url:擬更新頁面的url連接
  • data:字典、字節序列或文件,Request的內容
  • **kwargs:12個控制訪問的參數

6.requests.patch(url, data=None, **kwargs)

  • url:擬更新頁面的url連接
  • data:字典、字節序列或文件,Request的內容
  • **kwargs:12個控制訪問的參數

7.requests.delete(url, **kwargs)

  • url:擬刪除頁面的url
  • **kwargs:13個控制訪問的參數

2.requests基於get請求

r = requests.get(url)

  • 構造一個向服務器請求資源的Requests對象
  • 返回一個包含服務器資源的Response對象

r = requests.get(url, params=None, **kwargs)

  • url:擬獲取網頁的url連接
  • params:url中的額外參數,字典或字節流合適,可選
  • **kwargs:12各控制訪問的參數

1.簡單的get請求

import requests
response=requests.get('http:/www.baidu.com/')
print(response.text)

2.帶參數的GET請求-->headers

一般咱們在發送請求時都須要帶上請求頭,請求頭是將自身假裝成瀏覽器的關鍵,常見的有用的請求頭以下:

  • Host

  • Referer:大型網站一般都會根據該參數判斷請求的來源

  • User-Agent:客戶端

  • Cookie:Cookie信息雖然包含在請求頭裏,但requests模塊有單獨的參數來處理他,headers={}內就不要放它了

url = "https://www.sogou.com/web"# 設定動態的請求參數
wd = input("enter a key word:")
params = {
    "query":wd
}
# UA假裝
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}
​
# 參數2:params是一個字典,用來處理動態請求參數
response = requests.get(url=url,params=params,headers=headers)
# 修改原始的編碼格式
response.encoding = "utf-8"
page_text = response.text
fileName = wd + ".html"
with open(fileName,"w",encoding="utf-8") as fp:
    fp.write(page_text)
print(fileName,"下載成功!")

3.帶參數的GET請求-->params

1.本身拼接GET參數

# 在請求頭內將本身假裝成瀏覽器,不然百度不會正常返回頁面內容
import requests
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',
}
    
response=requests.get('https://www.baidu.com/s?wd=python&pn=1',headers=headers)
print(response.text)
​
# 若是查詢關鍵詞是中文或者有其餘特殊符號,則不得不進行url編碼
from urllib.parse import urlencode
wb = "熊大"
encode_res = urlencode({"k":wb},encoding="utf-8")
print(encode_res)  #k=haiyan%E6%B5%B7%E7%87%95
​
keywords = encode_res.split("=")[1]  #haiyan%E6%B5%B7%E7%87%95
url = "https://www.baidu.com/s?wd=%s&pn=1"%(keywords)
​
# url = "https://www.baidu.com/s?"+encode_res
print(url)
# 而後拼接成url
response = requests.get(
    url,
    headers =headers
)

2.url中傳遞params參數

url = "https://www.sogou.com/web"# 設定動態的請求參數
wd = input("enter a key word:")
params = {
    "query":wd
}
# UA假裝
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}
​
# 參數2:params是一個字典,用來處理動態請求參數
response = requests.get(url=url,params=params,headers=headers)
# 修改原始的編碼格式
response.encoding = "utf-8"
page_text = response.text
fileName = wd + ".html"# 保存到本地文件
with open(fileName,"w",encoding="utf-8") as fp:
    fp.write(page_text)
print(fileName,"下載成功!")

4.帶參數的GET請求-->cookies

登陸github,而後從瀏覽器中獲取cookies,之後就能夠直接拿着cookie登陸了,無需輸入用戶名密碼。

# 用戶名:egonlin 郵箱378533872@qq.com 密碼lhf@123
import requests
​
Cookies={
'user_session':'wGMHFJKgDcmRIVvcA14_Wrt_3xaUyJNsBnPbYzEL6L0bHcfc',
}
​
response=requests.get('https://github.com/settings/emails',
             cookies=Cookies) #github對請求頭沒有什麼限制,咱們無需定製user-agent,對於其餘網站可能還須要定製
print('378533872@qq.com' in response.text)  # True

3.requests基於post請求

與get請求的區別:

get請求:

  • 沒有請求體

  • 數據必須在1K以內!

  • GET請求數據會暴露在瀏覽器的地址欄中

post請求:

  • 數據不會出如今地址欄中

  • 數據的大小沒有上限

  • 有請求體

  • 請求體中若是存在中文,會使用URL編碼!

1.簡單的post請求

import requests
response=requests.get('http:/www.baidu.com/')
print(response.text)

2.帶參數的post請求-->data

post請求的數據在form-data中,能夠獲取請求中的form-data數據,根據咱們的需求改動數據,發起請求。

url = "https://movie.douban.com/j/chart/top_list"
num = 200for i in range(0,num,20):
    start = i
    data = {
        "type": "24",
        "interval_id": "100:90",
        "action": "",
        "start": i,
        "limit": "20"
    }
​
    response = requests.post(url=url,data=data,headers=headers)
    for movie in response.json():
        print(movie["rank"],movie["title"],movie["score"])

4.post請求模擬登錄

post請求登陸:

  1. 對於登陸來講,應該輸錯用戶名或密碼而後分析抓包流程,用腦子想想,輸對了瀏覽器就跳轉了,還分析個毛線,累死你也找不到包

  2. 要作登陸的時候必定記得要把cookie先清除;

  3. requests.session():中間的cookie都不用本身分析了,有用的沒用的都給放進來了、

  4. response.cookie.get_dict() #獲取cookie

自動登陸github代碼

1.目標站點分析

commit:Sign in

utf8:✓

authenticity_token:lbI8IJCwGslZS8qJPnof5e7ZkCoSoMn6jmDTsL1r/m06NLyIbw7vCrpwrFAPzHMep3Tmf/TSJVoXWrvDZaVwxQ==

login:egonlin

password:123

2.流程分析:

ps:若是密碼時密文形式,則能夠先輸錯帳號,輸對密碼,而後到瀏覽器中拿到加密後的密碼,github的密碼是明文

import requests
import re
​
#第一次請求
r1=requests.get('https://github.com/login')
r1_cookie=r1.cookies.get_dict() #拿到初始cookie(未被受權)
authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text)[0] #從頁面中拿到CSRF TOKEN
#第二次請求:帶着初始cookie和TOKEN發送POST請求給登陸頁面,帶上帳號密碼
data={
    'commit':'Sign in',
    'utf8':'',
    'authenticity_token':authenticity_token,
    'login':'317828332@qq.com',
    'password':'alex3714'
}
r2=requests.post('https://github.com/session',
             data=data,
             cookies=r1_cookie
             )
​
​
login_cookie=r2.cookies.get_dict()
​
​
#第三次請求:之後的登陸,拿着login_cookie就能夠,好比訪問一些我的配置
r3=requests.get('https://github.com/settings/emails',cookies=login_cookie)
​
print('317828332@qq.com' in r3.text) #True

3、響應對象Response

1.response對象的屬性

import requests
respone=requests.get('http://www.jianshu.com')

response屬性:

  • text:字符串的文本內容

  • content:二進制byte格式的內容

  • status_code:響應的狀態碼

  • cookies:請求的cookie數據

  • encoding:響應體的編碼格式

  • cookies.get_dict():請求cookies的字典

  • url:請求的的url

  • json():請求數據爲json時,返回json字典

相關文章
相關標籤/搜索