Python之requests高級用法詳解
設(shè)置請求頭(headers)
在爬蟲操作中,經(jīng)常需要攜帶請求頭信息(比如User-Agent、Referer、Host、Origin、Cookie)才能正常訪問。
User-Agent : 瀏覽器名稱,服務器可以知道該請求是從哪個瀏覽器過來的,在爬蟲中經(jīng)常需要設(shè)置這個參數(shù)來偽裝我們的請求是從瀏覽器中過來的,這個值也是我們最經(jīng)常應用的;Referer : 表示當前請求是從哪個url過來的,在有些反爬蟲請求中,如果不是從指定頁面訪問該請求,就不會有相關(guān)響應;
Host : 標識請求將要達到那臺主機,并會在服務端被驗證,如果不符合,就不能正確處理客戶端的請求;
Origin : 說明最初請求是從哪里發(fā)起的。Referer顯示來源頁面的完整地址,而Origin顯示來源頁面的Origin: protocal+host,不包含路徑等信息,也就不會包含含有用戶信息的敏感內(nèi)容,跟Referer相似,但是Origin只能用于post請求。Referer適用于所有請求;因此Origin較Referer更安全,多用于防范CSRF攻擊;
Cookie : http協(xié)議是無狀態(tài)的, 服務器無法區(qū)分多個請求是否來自同一個人,因此需要用cookie來進行標識,一般如果需要登錄才能訪問的網(wǎng)站就需要發(fā)送cookie信息。
GET請求代碼示例
# 引入requests庫 import requests # 聲明定義請求頭 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36', } # 向指定的url發(fā)送請求,并返回 url = 'https://www.baidu.com/s' # 傳入?yún)?shù) data = { 'wd': '中國' } r = requests.get(url=url, params=data, headers=headers) print(r.text)
POST請求代碼示例
# 引入requests庫 import requests # 聲明定義請求頭 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36', } # 請求地址 post_url = 'https://fanyi.baidu.com/sug' # 參數(shù) form_data = { 'kw': 'baby' } # 進行post請求 req = requests.post(url=post_url, data=form_data, headers=headers) print('json:', req.json())
設(shè)置代理服務器IP(proxy)
使用requests添加代理也是非常簡單,只要在請求方法中(例如requests.get()或者requests.post())傳遞proxies參數(shù)就可以了,示例代碼如下:
GET請求代碼示例
# 引入requests庫 import random import requests # 聲明定義代理服務器列表 proxy_list = [ {"http": "58.21.202.124:8080"}, {"http": "58.21.202.39:8080"}, {"http": "39.107.232.194:8080"} ] # 隨機選擇一個代理 proxy = random.choice(proxy_list) # 聲明定義請求頭 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36', } # 請求地址 url = 'http://www.baidu.com/s?ie=UTF-8&wd=ip' # 進行GET請求,打印響應結(jié)果 try: req = requests.get(url=url, headers=headers, proxies=proxy) print(req.text) except requests.exceptions.ConnectionError as e: print(e)
POST請求代碼示例
# 引入requests庫 import random import requests # 聲明定義代理服務器列表 proxy_list = [ {"http": "58.21.202.124:8080"}, {"http": "58.21.202.39:8080"}, {"http": "39.107.232.194:8080"} ] # 隨機選擇一個代理 proxy = random.choice(proxy_list) # 聲明定義請求頭 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36', } # 請求地址 url = 'http://www.baidu.com/s?ie=UTF-8&wd=ip' # 進行POST請求,打印響應結(jié)果 try: req = requests.post(url=url, headers=headers, proxies=proxy) print(req.text) except requests.exceptions.ConnectionError as e: print(e)
Cookies(Session)
如果在一個相應中包含了cookie,那么可以利用cookies屬性拿到這個返返回的cookie值,例如:
# 引入requests庫 import requests # GET訪問 # 向指定的url發(fā)送請求,并返回 url = 'https://www.baidu.com/' # 發(fā)送get請求 req = requests.get(url=url) # 響應內(nèi)容 print('Cookies信息:', req.cookies) print(req.cookies.get_dict())
requests.Session()
上面那個不是重點,重點的是requests.Session() ;之前使用urllib庫的時候是可以使用opener發(fā)送多個請求,多個請求之間是可以共享cookie的。那么如果使用requests,也要達到共享cookie的目的,那么可以使用requests庫給我們提供的session對象。注意,這里的session不是web開發(fā)中的那個session,這個地方只是一個會話的對象而已。還是以人人網(wǎng)登陸為例,使用requests來實現(xiàn),示例代碼如下:
# 引入requests庫 import requests # 聲明定義header headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36' } # 創(chuàng)建session對象 session = requests.Session() # 人人網(wǎng)登陸地址 post_uel = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2019621044248' # 參數(shù) form_data = { 'email': '188****7357', # 這是手機號,我隱藏掉中間四位 'icode': '', 'origURL': 'http://www.renren.com/home', 'domain': 'renren.com', 'key_id': '1', 'captcha_type': 'web_login', 'password': '01cb55635986f56265d3b55aaddaa79337d094cb56d6cf7724343a93ad586fe7', 'rkey': 'd5ff51375d8eb17a011cad5622d835fd', 'f': 'http%3A%2F%2Fwww.renren.com%2F971686685%2Fprofile' } ret1 = session.post(url=post_uel, headers=headers, data=form_data) print('登陸結(jié)果:', ret1.json()) print('*' * 50) # 人人網(wǎng)個人中心地址 get_url = 'http://www.renren.com/971686685/profile' ret2 = session.get(url=get_url) print(ret2.content.decode())
處理不信任的SSL證書
對于那些已經(jīng)被信任的SSL證書的網(wǎng)站,例如//www.baidu.com/,那么使用requests庫直接就可以正常的返回響應。請求可以為HTTPS請求驗證SSL證書,就像web瀏覽器一樣,SSL驗證默認是開啟的,如果證書驗證失敗,請求會拋出SSLError遇到請求的SSL驗證,可以直接跳過不驗證,將verify=False設(shè)置一下即可示例代碼:
# 引入requests庫 import requests # 向指定的url發(fā)送請求,并返回 url = 'https://www.12306.cn/' # 發(fā)送get請求 req = requests.get(url=url, verify=False) print(req.content)
到此這篇關(guān)于Python之requests高級用法詳解的文章就介紹到這了,更多相關(guān)requests高級用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Numpy中扁平化函數(shù)ravel()和flatten()的區(qū)別詳解
本文主要介紹了Numpy中扁平化函數(shù)ravel()和flatten()的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02Python使用signal定時結(jié)束AsyncIOScheduler任務的問題
這篇文章主要介紹了Python使用signal定時結(jié)束AsyncIOScheduler任務,在使用aiohttp結(jié)合apscheduler的AsyncIOScheduler模擬定點并發(fā)的時候遇到兩個問題,針對每個問題給大家詳細介紹,需要的朋友可以參考下2021-07-07Python讀取Excel表格,并同時畫折線圖和柱狀圖的方法
今天小編就為大家分享一篇Python讀取Excel表格,并同時畫折線圖和柱狀圖的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10解決Python下imread,imwrite不支持中文的問題
今天小編就為大家分享一篇解決Python下imread,imwrite不支持中文的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12