兩個主要的函數:
get
post
import requests kwd = "吳秀波出軌門" # URL編碼 from urllib.parse import urlencode res = urlencode({"wd":kwd}) print(res) headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"} url = "https://www.baidu.com/s" #直接將參數放在 params中 會自動進行url編碼 response = requests.get(url,headers=headers,params={"wd":kwd}) print(response.status_code) print(response.text)
添加數據到請求頭中
response = requests.get(url,headers={ # 把你的數據加在這里 },params={"wd":kwd}) print(response.status_code) print(response.text)
post請求參數
其他參數與get一致,請求體放在data中
requests.post(data={})
返回值的處理
response = requests.get(url,headers=headers,params={"wd":kwd}) print(response.status_code) # 狀態碼 print(response.text) # 將結果以文本的形式返回 res1=response.content # 將結果以二進制的方式返回 res2=response.json() # 將數據直接反序列化得到字典或是列表
requests模塊的其它用法
session可以幫助我們自定完成cookie的存儲和發送
import requests # 創建一個session對象 session = requests.session()
1.請求登錄頁面
res = session.get("https://github.com/login",headers={ "Referer": "https://github.com/", "User-Agent": user_agent }) print(res.status_code) token = re.search('name="authenticity_token" value="(.*?)"',res.text).group(1) print(token)
2.發送登錄請求,帶上cookie,帶上請求體
res2 = session.post("https://github.com/session", headers = { "Referer": "https://github.com/login", "User-Agent": user_agent}, data={ "commit": "Sign in", "utf8": "✓", "authenticity_token": token, "login": "oldboyedujerry", "password": "123654asdAsd"}, allow_redirects = False ) print(res2.status_code)
訪問個人主頁
res3 = session.get("https://github.com/settings/profile", headers={ "User-Agent": user_agent, "Referer": "https://github.com/login" }) print(res3.status_code) with open("tt.html","wt") as f: f.write(res3.text) # 判斷是否登錄成功 print("oldboyedujerry" in res3.text)
"" session可以幫助我們自定完成cookie的存儲和發送 """ import requests # 創建一個session對象 session = requests.session() """ 1.請求登陸頁面 獲取token cookie 2.發生登陸的post請求,將用戶名密碼 和token 放在請求體中,cookie放在請求頭中 """ import requests import re login_url = "https://github.com/login" headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"} res1 = session.get(login_url,headers=headers) print(res1.status_code) # 從響應體中獲取token token = re.search('name="authenticity_token" value="(.*?)"',res1.text).group(1) print(token) # 保存cookie # login_cookie = res1.cookies.get_dict() # print(login_cookie) # 發送登陸請求 res2 = session.post("https://github.com/session", headers={ "user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}, data={ "commit": "Sign in", "utf8": "✓", "authenticity_token": token, "login": "yangyuanhu", "password": "123654asd"}, # 是否允許自動重定向 allow_redirects = False) print(res2.status_code) # 用戶登錄成功后的cookie # user_cookie = res2.cookies.get_dict() # 訪問主頁 res3 = session.get("https://github.com/settings/profile",headers = headers) print(res3.status_code) print(res3.text) # "https://github.com/settings/profile"
response屬性
import requests respone=requests.get('http://www.jianshu.com') # respone屬性 print(respone.text) # 獲取解碼后的內容 html print(respone.content) # 獲取二進制字節數據 print(respone.json()) # 對響應進行json反序列化,僅在返回的數據為json格式時可使用 print(respone.status_code) print(respone.headers) print(respone.cookies) print(respone.cookies.get_dict()) print(respone.url) print(respone.history) # 獲取重定向歷史 print(respone.encoding) # 響應體編碼方式
關閉:上下文管理
# 可以以生成器的方式來獲取 在數據較大時 可以避免內存溢出 print(res.iter_content()) from contextlib import closing with closing(requests.get('http://www.autohome.com/news',stream=True)) as response: for line in response.iter_content(chunk_size=10): print(line) print(len(line))
指定響應體編碼
import requests response=requests.get('http://www.autohome.com/news') response.encoding = "GBK" 指定響應體編碼 print(response.text) print(response.encoding)
分段獲取數據
# 當響應體數據太大的時候一次性獲取所有可能造成內存溢出
# 可以使用iter_content 分段獲取數據,
# chunk_size 指定每次獲取的長度,
# decode_unicode 是否進行解碼 通常為false
import requests
respone = requests.get("https://www.qq.com")
with open("tt.html","wb") as f:
for i in respone.iter_content(chunk_size=1024,decode_unicode=False):
print(len(i))
f.write(i)
獲取原始套接字響應數據
r = requests.get('https://api.github.com/events', stream=True) # <requests.packages.urllib3.response.HTTPResponse object at 0x101194810> print(r.raw.read(10))
SSL Cert Verification——證書驗證(大部分網站都是https)
#證書驗證(大部分網站都是https) import requests respone=requests.get('https://www.12306.cn') #如果是ssl請求,首先檢查證書是否合法,不合法則報錯,程序終端 #改進1:去掉報錯,但是會報警告 import requests respone=requests.get('https://www.12306.cn',verify=False) #不驗證證書,報警告,返回200 print(respone.status_code) #改進2:去掉報錯,並且去掉警報信息 import requests from requests.packages import urllib3 urllib3.disable_warnings() #關閉警告 respone=requests.get('https://www.12306.cn',verify=False) print(respone.status_code) #改進3:加上證書 #很多網站都是https,但是不用證書也可以訪問,大多數情況都是可以攜帶也可以不攜帶證書 #知乎\百度等都是可帶可不帶 #有硬性要求的,則必須帶,比如對於定向的用戶,拿到證書后才有權限訪問某個特定網站 import requests respone=requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key')) print(respone.status_code)
使用代理
官網鏈接: http://docs.python-requests.org/en/master/user/advanced/#proxies
代理設置:先發送請求給代理,然后由代理幫忙發送(封ip是常見的事情)
import requests ips = ["http://180.118.73.147:9000","http://180.118.73.147:9000"] proxies={ # 'http':'http://180.118.73.147:9000',#帶用戶名密碼的代理,@符號前是用戶名與密碼 'http':'http://180.118.73.147:9000', } respone=requests.get('https://www.baidu.com',roxies=proxies) print(respone.status_code)

支持socks代理,安裝:pip install requests[socks] import requests proxies = { 'http': 'socks5://user:pass@host:port', 'https': 'socks5://user:pass@host:port' } respone=requests.get('https://www.12306.cn', proxies=proxies) print(respone.status_code)
超時設置
#超時設置 #兩種超時:float or tuple #timeout=0.1 #代表接收數據的超時時間 #timeout=(0.1,0.2)#0.1代表鏈接超時 0.2代表接收數據的超時時間 import requests respone=requests.get('https://www.baidu.com', timeout=0.0001)
捕獲異常
#異常處理 import requests from requests.exceptions import * #可以查看requests.exceptions獲取異常類型 try: r=requests.get('http://www.baidu.com',timeout=0.00001) except ReadTimeout: print('===:') # except ConnectionError: # 鏈接失敗 # print('-----') # except Timeout: # 超時 # print('aaaaa') except RequestException as e: # 其他異常 print(e)
上傳文件
import requests files={'file':open('a.jpg','rb')} # value為文件對象 respone=requests.post('http://httpbin.org/post',files=files) print(respone.status_code)