- 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}
# 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