Python requests模塊詳解


  • requests的底層實現urllib
  • requests在python2 和python3中通用,方法完全一樣

1. requests模塊發送GET請求、獲取響應

#發送請求
response = requests.get(url)

#response的常用屬性:
response.text    # 根據HTTP 頭部對響應的編碼作出有根據的推測,推測的文本編碼
response.encoding=”gbk”   # 修改編碼方式

respones.content   # bytes類型
response.content.deocde(“utf8”)   # 解碼

response.status_code   # 獲取狀態碼
response.request.headers   # 獲取請求頭
response.headers     # 獲取響應頭

# 攜帶header的請求
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
requests.get(url,headers=headers)

# 攜帶帶參數的請求
dic = {'name':'python'}
requests.get(url,params=dic)

2.requests模塊發送POST請求、獲取響應

# 發送請求 
response = requests.post("http://www.baidu.com/", data = data,headers=headers)

data 的形式:字典


# 代理的使用
requests.get("http://www.baidu.com", proxies = proxies)
proxies的形式:字典
proxies = { 
    "http": "http://192.11.11.22:2222", 
    "https": "https://12.34.56.79:2222", 
    }

 

正向代理和反向代理

 

 代理IP的分類

根據代理服務器端的配置,向目標地址發送請求時,REMOTE_ADDR, HTTP_VIA,HTTP_X_FORWARDED_FOR三個變量不同而可以分為下面四類:

  • 透明代理(Transparent Proxy)

      REMOTE_ADDR = Proxy IP
      HTTP_VIA = Proxy IP
      HTTP_X_FORWARDED_FOR = Your IP
    

    透明代理雖然可以直接“隱藏”你的IP地址,但是還是可以從HTTP_X_FORWARDED_FOR來查到你是誰。

  • 匿名代理(Anonymous Proxy)

      REMOTE_ADDR = proxy IP
      HTTP_VIA = proxy IP
      HTTP_X_FORWARDED_FOR = proxy IP
    

    匿名代理比透明代理進步了一點:別人只能知道你用了代理,無法知道你是誰。

  • 混淆代理(Distorting Proxies)

      REMOTE_ADDR = Proxy IP
      HTTP_VIA = Proxy IP
      HTTP_X_FORWARDED_FOR = Random IP address
    

    如上,與匿名代理相同,如果使用了混淆代理,別人還是能知道你在用代理,但是會得到一個假的IP地址,偽裝的更逼真

  • 高匿代理(Elite proxy或High Anonymity Proxy)

      REMOTE_ADDR = Proxy IP
      HTTP_VIA = not determined
      HTTP_X_FORWARDED_FOR = not determined
    

    可以看出來,高匿代理讓別人根本無法發現你是在用代理,所以是最好的選擇。

從使用的協議:代理ip可以分為http代理,https代理,socket代理等,使用的時候需要根據抓取網站的協議來選擇

 3.使用requests處理cookie相關的請求

3.1  requests處理cookie相關的請求之使用cookies

# cookies的形式:字典
cookies = {"cookie的name":"cookie的value"}
# 使用方法:
resp = requests.get(url,headers=headers,cookies=cookies}

獲取cookie

# requests.utils.dict_from_cookiejar:把cookiejar對象轉化為字典
import
requests url = "http://www.baidu.com" response = requests.get(url) print(type(response.cookies)) cookies = requests.utils.dict_from_cookiejar(response.cookies) print(cookies)

3.2  requests處理cookie相關的請求之session

# requests 提供了一個叫做session類,來實現客戶端和服務端的會話保持

# 會話保持有兩個內涵:

# 保存cookie
# 實現和服務端的長連接
# 使用方法

session = requests.session()
response = session.get(url,headers)
# session實例在請求了一個網站后,對方服務器設置在本地的cookie會保存在session中,下一次再使用session請求對方服務器的時候,會帶上前一次的cookie
class Login():
    def __init__(self, loginName, password):
        # 用戶名和密碼
        self.loginName = loginName
        self.password = password
        # 接口地址
        self.login_url = ''

        self.headers = {
            "Origin": "*",
            "Referer": "*
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
        }

        # spider session
        self.session = requests.session()

    def parse_get(self, url, params):
        '''
        發送get請求
        :param url:
        :param params:
        :return:
        '''
        resp = self.session.get(url=url, params=params, headers=self.headers)
        return resp.content.decode()

3.3 requests處理證書錯誤

# ssl的證書不安全導致,添加verify=False參數


import requests

url = "https://www.12306.cn/mormhweb/"
response = requests.get(url,verify=False)

3.4 超時參數添加

# 添加timeout參數,能夠保證在3秒鍾內返回響應,否則會報錯

response = requests.get(url,timeout=3)

3.5 retrying模塊的使用

# parse.py
import requests
from retrying import retry

headers = {}


@retry(stop_max_attempt_number=3) #最大重試3次,3次全部報錯,才會報錯
def _parse_url(url)
    response = requests.get(url, headers=headers, timeout=3) #超時的時候回報錯並重試
    assert response.status_code == 200 #狀態碼不是200,也會報錯
    return response


def parse_url(url)
    try: #進行異常捕獲
        response = _parse_url(url)
    except Exception as e:
        print(e)
        response = None
    return response

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM