pythonrequests編碼
㈠ python requests 常用方法
requests 繼承了urllib2的所有特性,比urllib簡潔高效
requests所有功能都能通過"requests/api.py"中的方法訪問
1、安裝:
pip install requests
2、get請求:
封裝鏈接中的參數,請求時用params參數進行傳遞
url = " http://www..com "
resp = requests.get(url,params=,headers=)
3、post請求:
發送的數據必須放在字典中,通過data參數進行傳遞
url = " http://www..com "
resp = requests.post(url,data=,headers=)
4、查看響應內容:
print (resp.text ) # resp.text 返回的是Unicode格式的數據
print(resp.json()) # res.json() 返回的是json格式的數據
print(resp.content) # resp.content返回的位元組類型數據
print (resp.url) # 查看完整url地址
print (resp.encoding) # 查看響應頭部字元編碼
print(resp.status_code) # 查看響應碼
print(resp.cookies) # 查看返回的cookies
print(resp.r.elapsed) #響應速度,從發送請求到響應到達所需要的時間
5、Cookies
import requests
url = " http://www..com "
resp = requests.get(url)
cookiejar = resp.cookies # 返回cookies對象
cookiedic = requests.utils.dict_from_cookiejar(cookiejar) # 將cookies轉為字典
6、Sission
說明
1、發送請求前先創建一個session會話,將請求到的cookies存入session中
2、程序的請求要一直使用session.get/post,以保證cookies在程序中的傳遞
3、程序的請求如果使用requests.get/post需要在參數中增加headers{"cookie:":"****"},否則請求會報錯,因為requests.get/post每次執行都會重新開啟一個新的請求,丟失已獲取的cookies
例子:登錄17小說網拿到書架數據
import requests
session = requests.session() # 創建會話(session),將cookie存入session中
data = {
"loginName": "1 7",
"password": "1 5"
}
url = " https://passport.17k.com/ck/user/login "
resp1 = session.post(url,data=data) # 登錄,獲取cookies
resp2 = session.get(" https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919 ")
print(resp2.json())
7、防盜鏈處理
防盜鏈,本質上是溯源,即本次請求的上一次請求,請求時將referer地址加上即可
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36",
"Referer":" https://www.pearvideo.com/video_1734919 " # 防盜鏈:溯源,確認當前請求的上一級
}
㈡ 請教python 采 集 requests post請求一個第三方介面中文亂碼的問題
你需要寫這行代碼,有可能是你編碼格式設置錯了;
在請求的下面加這行代碼
rsp = requests.get(url,headers = headers)
rsp.encoding = rsp.apparent_encoding
它會自動匹配文檔中的編碼格式,如果還不行你再追問。
㈢ Python爬蟲筆記(二)requests模塊get,post,代理
import requests
base_url = 'https://www..com'
response = requests.get(base_url)
url=請求url,
headers =請求頭字典,
params = 請求參數字典。
timeout = 超時時長,
)---->response對象
伺服器響應包含:狀態行(協議,狀態碼)、響應頭,空行,響應正文
字元串格式:response.text
bytes類型:response.content
response.headers['cookie']
response.text獲取到的字元串類型的響應正文,
其實是通過下面的步驟獲取的:
response.text = response.content.decode(response.encoding)
產生的原因:編碼和解碼的編碼格式不一致造成的。
str.encode('編碼')---將字元串按指定編碼解碼成bytes類型
bytes.decode('編碼')---將bytes類型按指定編碼編碼成字元串。
a、response.content.decode('頁面正確的編碼格式')
<meta http-equiv="content-type" content="text/html;charset=utf-8">
b、找到正確的編碼,設置到response.encoding中
response.encoding = 正確的編碼
response.text--->正確的頁面內容。
a、沒有請求參數的情況下,只需要確定url和headers字典。
b、get請求是有請求參數。
在chrome瀏覽器中,下面找query_string_params,
將裡面的參數封裝到params字典中。
c、分頁主要是查看每頁中,請求參數頁碼欄位的變化,
找到變化規律,用for循環就可以做到分頁。
requests.post(
url=請求url,
headers = 請求頭字典,
data=請求數據字典
timeout=超時時長
)---response對象
post請求一般返回數據都是json數據。
(1)response.json()--->json字元串所對應的python的list或者dict
(2)用 json 模塊。
json.loads(json_str)---->json_data(python的list或者dict)
json.mps(json_data)--->json_str
post請求能否成功,關鍵看**請求參數**。
如何查找是哪個請求參數在影響數據獲取?
--->通過對比,找到變化的參數。
變化參數如何找到參數的生成方式,就是解決這個ajax請求數據獲取的途徑。
**尋找的辦法**有以下幾種:
(1)寫死在頁面。
(2)寫在js中。
(3)請求參數是在之前的一條ajax請求的數據裡面提前獲取好的。
代理形象的說,他是網路信息中轉站。
實際上就是在本機和伺服器之間架了一座橋。
a、突破自身ip訪問現實,可以訪問一些平時訪問不到網站。
b、訪問一些單位或者團體的資源。
c、提高訪問速度。代理的伺服器主要作用就是中轉,
所以一般代理服務裡面都是用內存來進行數據存儲的。
d、隱藏ip。
ftp代理伺服器---21,2121
HTTP代理伺服器---80,8080
SSL/TLS代理:主要用訪問加密網站。埠:443
telnet代理 :主要用telnet遠程式控制制,埠一般為23
高度匿名代理:數據包會原封不動轉化,在服務段看來,就好像一個普通用戶在訪問,做到完全隱藏ip。
普通匿名代理:數據包會做一些改動,伺服器有可能找到原ip。
透明代理:不但改動數據,還會告訴服務,是誰訪問的。
間諜代理:指組織或者個人用於記錄用戶傳輸數據,然後進行研究,監控等目的的代理。
proxies = {
'代理伺服器的類型':'代理ip'
}
response = requests.get(proxies = proxies)
代理伺服器的類型:http,https,ftp
代理ip:http://ip:port
㈣ 如何用python requests post一段字元串
一個http請求包括三個部分,為別為請求行,請求報頭,消息主體,類似以下這樣:
請求行
請求報頭
消息主體
HTTP協議規定post提交的數據必須放在消息主體中,但是協議並沒有規定必須使用什麼編碼方式。服務端通過是根據請求頭中的Content-Type欄位來獲知請求中的消息主體是用何種方式進行編碼,再對消息主體進行解析。具體的編碼方式包括:
application/x-www-form-urlencoded
最常見post提交數據的方式,以form表單形式提交數據。application/json
以json串提交數據。multipart/form-data
一般使用來上傳文件。- url = 'htt.org/post'd = {'key1': 'value1', 'key2': 'value2'}
- r = requests.post(url, data=d)
- print r.text12341234
- url = 'httin.org/post's = json.mps({'key1': 'value1', 'key2': 'value2'})
- r = requests.post(url, data=s)
- print r.text12341234
- url = 'htt.org/post'files = {'file': open('report.txt', 'rb')}
- r = requests.post(url, files=files)
- print r.text12341234
2.7.1 以form形式發送post請求
Reqeusts支持以form表單形式發送post請求,只需要將請求的參數構造成一個字典,然後傳給requests.post()的data參數即可。
輸出:
{
「args」: {},
「data」: 「」,
「files」: {},
「form」: {
「key1」: 「value1」,
「key2」: 「value2」
},
「headers」: {
……
「Content-Type」: 「application/x-www-form-urlencoded」,
……
},
「json」: null,
……
}
可以看到,請求頭中的Content-Type欄位已設置為application/x-www-form-urlencoded,且d = {'key1': 'value1', 'key2': 'value2'}以form表單的形式提交到服務端,服務端返回的form欄位即是提交的數據。
2.7.2 以json形式發送post請求
可以將一json串傳給requests.post()的data參數,
輸出:
{
「args」: {},
「data」: 「{」key2」: 」value2」, 」key1」: 」value1」}」,
「files」: {},
「form」: {},
「headers」: {
……
「Content-Type」: 「application/json」,
……
},
「json」: {
「key1」: 「value1」,
「key2」: 「value2」
},
……
}
可以看到,請求頭的Content-Type設置為application/json,並將s這個json串提交到服務端中。
2.7.3 以multipart形式發送post請求
Requests也支持以multipart形式發送post請求,只需將一文件傳給requests.post()的files參數即可。
輸出:
{
「args」: {},
「data」: 「」,
「files」: {
「file」: 「Hello world!」
},
「form」: {},
「headers」: {……
「Content-Type」: 「multipart/form-data; boundary=」,
……
},
「json」: null,
……
}
文本文件report.txt的內容只有一行:Hello world!,從請求的響應結果可以看到數據已上傳到服務端中。
㈤ python3 requests的post請求參數包含中文報錯
問題指明:post請求中文,無法進行編碼,需要對參數進行「utf-8」的編碼
嘗試:按報錯進行解決:
出現問題: 返回的response的中文數據為亂碼 :
相當亂碼的話,應該是編碼不匹配的問題,嘗試解決:
結果這亂碼更加摸不著頭腦了:
這個問題,一直弄了我一個晚上,太困睡覺,起床後,直到這篇解決我的問題: python 設置requests 編碼,完美解決中文亂碼問題 :
這個請求頭直接印象下面亂碼:
解決分析參考: 從python爬蟲引發出的gzip,deflate,sdch,br壓縮演算法分析
就因為這個,讓我弄了一晚,得到的經驗是: 在測試bug的時候,盡量減少變數,能不要的,就不要 。
㈥ python裡面request怎麼讀取html代碼
使用Python 3的requests模塊抓取網頁源碼並保存到文件示例:
import requests
ff = open('testt.txt','w',encoding='utf-8')
with open('test.txt',encoding="utf-8") as f:
for line in f:
ff.write(line)
ff.close()
這是演示讀取一個txt文件,每次讀取一行,並保存到另一個txt文件中的示例。
因為在命令行中列印每次讀取一行的數據,中文會出現編碼錯誤,所以每次讀取一行並保存到另一個文件,這樣來測試讀取是否正常。(注意open的時候制定encoding編碼方式)
㈦ Python的requests包在抓取頁面的時候頁面源代碼抓取不完全,頁面數據不是動態載入的。
您好,首先,sys.setdefaultencoding is evil。
其次,不會用 Requests 就去看文檔,不要亂來。
如果 Requests 檢測不到正確的編碼,那麼你告訴它正確的是什麼:
response.encoding = 'gbk'
print response.text
原始內容在 response.content 里,bytes,自己想怎麼處理就怎麼處理。
單個請求完全沒必要用 Session。直接 requests.get(xxx) 就可以了。
最後,弄不明白怎麼處理編碼錯誤的字元串就仔細想想,或者用 Python 3.x,不要散彈槍編程。
以下是 Python 3。Python 2 在那個字元串前加個 u 告訴它是 unicode 也一樣。