requests模組

ssrheart發表於2024-03-31

requests模組

(1)GET請求

(1)傳送get請求

import requests

url = "https://www.baidu.com/"

# 傳送請求獲取響應資料
response = requests.get(url)
  • 其中,一些常用的屬性和方法包括:
    • status_code: 響應的狀態碼,200表示請求成功,404表示頁面不存在等。
    • text: 響應的內容,通常是伺服器返回的HTML文字。
    • json(): 將響應的內容解析為JSON格式。
import requests
from fake_useragent import UserAgent

url = 'https://www.bqgbb.cc/'

headers = {
    'User-Agent': UserAgent().random
}

res = requests.get(url=url, headers=headers)
response = res.text
print(response)
print(res.status_code) # 200

(2)get請求攜帶引數

  • 傳送GET請求時,可以透過URL傳遞引數

    • https://www.baidu.com/s?wd=周杰倫
  • 如果需要傳遞引數,可以使用params引數來指定

  • params會自動幫我們在地址後面加一個問號,然後解析完加上我們定義的params引數,非常的方便

import requests
from fake_useragent import UserAgent

url = 'https://www.baidu.com/s'

headers = {
    'User-Agent': UserAgent().random
}

params = {
    'wd': '周杰倫'
}

res = requests.get(url=url, headers=headers, params=params)
print(res.text)
print(res.request.url)
# https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6

(3)get請求攜帶cookie

import requests
from fake_useragent import UserAgent

url = 'https://search.jd.com/Search'

headers = {
    'User-Agent': UserAgent().random,
    'Cookie': ''
}
params = {
    'keyword': '手機'
}

res = requests.get(url=url, headers=headers, params=params)
print(res.text)
print(res.request.url)
# https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA

(2)POST請求

  • POST請求的場景 一般都是用來登入的介面

(1)傳送POST請求

import requests

url = 'http://www.aa7a.cn/user.php'

data = {
    'username': 'heart',
    'password': '123',
    'captcha': '3aeh',
    'remember': '1',
    'ref': 'http://www.aa7a.cn',
    'act': 'act_login'
}
res = requests.post(url=url,json=data)
print(res.text)

(3)自動攜帶cookie的session物件

import requests
from fake_useragent import UserAgent

headers = {
    'User-Agent': UserAgent().random,
}
url = "https://xueqiu.com/"

session = requests.Session()
response1 = session.get(url=url, headers=headers)

tag_url = "https://stock.xueqiu.com/v5/stock/batch/quote.json?symbol=SH000001,SZ399001,SZ399006,SH000688,SH000016,SH000300,BJ899050,HKHSI,HKHSCEI,HKHSTECH,.DJI,.IXIC,.INX"
response = session.get(url=tag_url, headers=headers)
print(response.text)

(4)響應的相關引數

(1)字串格式

  • response.text 將響應體轉換為字串形式。
import requests

response = requests.get('https://www.baidu.com')

data = response.text
print(data, type(data)) #  <class 'str'>

(2)二進位制格式

  • response.content: 獲取響應體的二進位制內容,適用於處理影像、影片等非文字型別的響應。(預設是16進位制)
import requests

response = requests.get('https://pic.netbian.com/uploads/allimg/240322/232300-171112098057a5.jpg')

data = response.content
print(data, type(data)) # <class 'bytes'>

(3)json格式

  • response.json():獲取json格式資料
import requests
from fake_useragent import UserAgent

headers = {
    'User-Agent': UserAgent().random,
}
url = "https://xueqiu.com/"

session = requests.Session()
response1 = session.get(url=url, headers=headers)

tag_url = "https://stock.xueqiu.com/v5/stock/batch/quote.json?symbol=SH000001,SZ399001,SZ399006,SH000688,SH000016,SH000300,BJ899050,HKHSI,HKHSCEI,HKHSTECH,.DJI,.IXIC,.INX"
response = session.get(url=tag_url, headers=headers)
print(response.json(), type(response.json()))
# <class 'dict'>

(4)響應體的編碼格式

  • response.encoding:獲取響應的編碼格式
import requests

url = 'https://www.baidu.com'

res = requests.get(url=url)
print(res.encoding) # ISO-8859-1
  • 轉碼
import requests

url = 'https://www.baidu.com'

res = requests.get(url=url)
# 亂碼
print(res.text)
print(res.encoding) # ISO-8859-1

# 進行轉碼操作
res.encoding='utf-8'
print(res.text)
print(res.encoding) # utf-8

(5)響應體的狀態碼

  • status_code:獲取響應的狀態碼
import requests

url = 'https://www.baidu.com'

res = requests.get(url=url)
print(res.status_code) # 200

(6)響應頭

  • response.headers:獲取響應頭資訊,返回一個字典物件
import requests

url = 'https://www.baidu.com'

res = requests.get(url=url)
print(res.headers)
# {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Sat, 30 Mar 2024 08:02:34 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:23:55 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}

(7)響應Cookie

  • response.cookies: 獲取伺服器返回的cookie資訊。
  • response.cookies.get_dict(): 將cookie資訊轉換為字典形式。
  • response.cookies.items(): 獲取cookie資訊並以列表形式返回。
import requests

url = 'https://www.baidu.com'

res = requests.get(url=url)
print(res.cookies) # <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
print(res.cookies.get_dict()) # {'BDORZ': '27315'}
print(res.cookies.items()) # [('BDORZ', '27315')]

(8)當前請求/響應物件的URL

  • response.url: 獲取當前響應的URL。
    • 這是在完成HTTP請求並接收到伺服器響應後,實際返回的資源URL。
    • 在重定向發生時,這個屬性會反映最終頁面的實際URL。
    • 例如,如果你發起一個請求到某個網站A,但該網站隨後重定向到了網站B,那麼response.url將顯示網站B的URL。
  • response.request.url: 獲取當前請求的URL。
    • 這是傳送HTTP請求時使用的原始URL,即你在發出請求時指定的URL。
    • 無論是否發生重定向,這個屬性始終保持不變。
    • 也就是說,它反映了你最初嘗試訪問的地址。
import requests

url = 'https://www.baidu.com'

response = requests.get(url=url)
print(response.url)
print(response.request.url)

(9)當前請求的重定向ULR

  • response.history: 如果有重定向,返回一個列表,包含所有經過的重定向URL。
import requests

url = 'https://www.baidu.com'

response = requests.get(url=url)
print(response.history)

(10)迭代獲取二進位制資料

  • response.iter_content() :迭代獲取響應內容(適用於處理影片、圖片等二進位制資料)
import requests

tag_url = "https://pic.netbian.com/uploads/allimg/240322/232300-171112098057a5.jpg"

response = requests.get(tag_url)

# 開啟本地的檔案路徑,寫入二進位制資料必須用 wb 模式
file_path = "./a.jpg"
with open(file_path, 'wb') as f:
    # 迴圈獲取響應資料中的二進位制資料,每次只獲取 1024 個位元組
    for chunk in response.iter_content(chunk_size=1024):
        # 如果存在資料,則進行檔案資料的寫入
        if chunk:
            f.write(chunk)

(5)SSL認證

  • 會報錯,因為沒有證書
import requests
url = 'https://ssr2.scrape.center/'
response = requests.get(url)
print(response.status_code)
  • 不認證證書
  • verify=False
import requests
url = 'https://ssr2.scrape.center/'
response = requests.get(url,verify=False)
print(response.status_code)# 200

(6)使用代理

  • 格式
proxies = {'協議':'協議://IP:埠號'}
import requests
from fake_useragent import UserAgent

proxies = {
    'http': 'http://221.6.139.190:9002'
}

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

headers = {
    'User-Agent': UserAgent().random
}
response = requests.get(url=url,headers=headers,proxies=proxies,timeout=3)
print(response.text)

# 沒有代理
# "origin": "103.151.172.28",

# 新增了代理
# "origin": "221.6.139.190"

相關文章