Requests 惟一的一個非轉基因的 Python HTTP 庫,人類能夠安全享用。html
python
與urllib的區別,urllib的缺點git
手動處理url編碼github
手動處理post請求參數web
處理cookie和代理操做繁瑣json
requests模塊有點:瀏覽器
自動處理url編碼安全
自動處理post請求參數服務器
簡化cookie和代理操做cookie
pip install requests
requests最簡單實例:
import requests r = requests.get("http://www.baidu.com") r.status_code r.encoding = 'utf-8' r.text
使用基本流程:
指定url
基於requests模塊發起請求
獲取響應對象中的數據值
持久化存儲
請求載體身份標識的假裝:
User-Agent:請求載體身份標識,經過瀏覽器發起的請求,請求載體爲瀏覽器,則該請求的User-Agent爲瀏覽器的身份標識,使用爬蟲程序發起的請求,則該請求的載體爲爬蟲程序,則該請求的User-Agent爲爬蟲程序的身份標識。能夠經過判斷該值來獲知該請求的載體到底是基於哪款瀏覽器仍是基於爬蟲程序。
反爬機制:某些門戶網站會對訪問該網站的請求中的User-Agent進行捕獲和判斷,若是該請求的UA爲爬蟲程序,則拒絕向該請求提供數據。
反反爬策略:將爬蟲程序的UA假裝成某一款瀏覽器的身份標識。
1.requests.request(method, url, **kwargs)
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:控制訪問的參數,均爲可選項
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
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)
eg: kv = {'key1:value1'} r = requests.request('post', 'http://python123.io/ws', json=kv)
hd = {'user-agent': 'Chrome/10'} r = requests.request('POST', 'http://python123.io/ws', headers=hd)
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)
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)
2.requests.get(url, params=None, **kwargs)
3.requests.head(url, **kwargs)
4.requests.post(url, dats=None, json=None, **kwargs)
5.requests.put(url, data=None, **kwargs)
6.requests.patch(url, data=None, **kwargs)
7.requests.delete(url, **kwargs)
r = requests.get(url)
r = requests.get(url, params=None, **kwargs)
import requests response=requests.get('http:/www.baidu.com/') print(response.text)
一般咱們在發送請求時都須要帶上請求頭,請求頭是將自身假裝成瀏覽器的關鍵,常見的有用的請求頭以下:
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,"下載成功!")
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,"下載成功!")
登陸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
與get請求的區別:
get請求:
沒有請求體
數據必須在1K以內!
GET請求數據會暴露在瀏覽器的地址欄中
post請求:
數據不會出如今地址欄中
數據的大小沒有上限
有請求體
請求體中若是存在中文,會使用URL編碼!
import requests response=requests.get('http:/www.baidu.com/') print(response.text)
post請求的數據在form-data中,能夠獲取請求中的form-data數據,根據咱們的需求改動數據,發起請求。
url = "https://movie.douban.com/j/chart/top_list" num = 200 for 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"])
post請求登陸:
對於登陸來講,應該輸錯用戶名或密碼而後分析抓包流程,用腦子想想,輸對了瀏覽器就跳轉了,還分析個毛線,累死你也找不到包
要作登陸的時候必定記得要把cookie先清除;
requests.session():中間的cookie都不用本身分析了,有用的沒用的都給放進來了、
response.cookie.get_dict() #獲取cookie
1.目標站點分析
而後輸入錯誤的帳號密碼,抓包
發現登陸行爲是post提交到:https://github.com/session
並且請求頭包含cookie
並且請求體包含:
commit:Sign in
utf8:✓
authenticity_token:lbI8IJCwGslZS8qJPnof5e7ZkCoSoMn6jmDTsL1r/m06NLyIbw7vCrpwrFAPzHMep3Tmf/TSJVoXWrvDZaVwxQ==
login:egonlin
password:123
2.流程分析:
先GET:https://github.com/login拿到初始cookie與authenticity_token
返回POST:https://github.com/session, 帶上初始cookie,帶上請求體(authenticity_token,用戶名,密碼等)
最後拿到登陸cookie
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
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字典