三、抓包工具Fiddler
Fiddler是一款強大Web調試工具,它能記錄所有用戶端和伺服器的HTTP請求。 Fiddler啟動的時候,預設IE的代理設為了127.0.0.1:8888,而其他浏覽器是需要手動設定。
工作原理
Fiddler 是以代理web伺服器的形式工作的,它使用代理位址:127.0.0.1,端口:8888
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-cxtdABad-1572593770696)(assets/fidder_pro.jpg)]
Fiddler抓取HTTPS設定
-
啟動Fiddler,打開菜單欄中的 Tools > Telerik Fiddler Options,打開“Fiddler Options”對話框。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-N66kDaWl-1572593770696)(assets/01-fidder.png)]
- 對Fiddler進行設定:
- 打開工具欄->Tools->Fiddler Options->HTTPS,
- 選中Capture HTTPS CONNECTs (捕捉HTTPS連接配接),
- 選中Decrypt HTTPS traffic(解密HTTPS通信)
- 另外我們要用Fiddler擷取本機所有程序的HTTPS請求,是以中間的下拉菜單中選中…from all processes (從所有程序)
-
選中下方Ignore server certificate errors(忽略伺服器證書錯誤)
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-okMv8ppB-1572593770697)(assets/01-fidder_01-1559532796189.png)]
-
為 Fiddler 配置Windows信任這個根證書解決安全警告:Trust Root Certificate(受信任的根證書)。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-FcQpOsmV-1572593770697)(assets/01-fidder_03.png)]
- Fiddler 主菜單 Tools -> Fiddler Options…-> Connections
- 選中Allow remote computers to connect(允許遠端連接配接)
-
Act as system proxy on startup(作為系統啟動代理)
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-FwZ9290k-1572593770697)(assets/01-fidder_02.png)]
- 重新開機Fiddler,使配置生效(這一步很重要,必須做)。
Fiddler 如何捕獲Chrome的會話
-
安裝SwitchyOmega 代理管理 Chrome 浏覽器插件
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-OdSZsjYu-1572593770697)(assets/switchyomega.png)]
-
如圖所示,設定代理伺服器為127.0.0.1:8888
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-ODGyk3ik-1572593770698)(assets/switchyomega_setting.png)]
-
通過浏覽器插件切換為設定好的代理。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-Z9PakEi7-1572593770698)(assets/SwitchyOmega_switch.png)]
Fiddler界面
設定好後,本機HTTP通信都會經過127.0.0.1:8888代理,也就會被Fiddler攔截到。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-HNqFjloS-1572593770698)(assets/fiddler_show.png)]
請求 (Request) 部分詳解
- Headers —— 顯示用戶端發送到伺服器的 HTTP 請求的 header,顯示為一個分級視圖,包含了 Web 用戶端資訊、Cookie、傳輸狀态等。
- Textview —— 顯示 POST 請求的 body 部分為文本。
- WebForms —— 顯示請求的 GET 參數 和 POST body 内容。
- HexView —— 用十六進制資料顯示請求。
- Auth —— 顯示響應 header 中的 Proxy-Authorization(代理身份驗證) 和 Authorization(授權) 資訊.
- Raw —— 将整個請求顯示為純文字。
- JSON - 顯示JSON格式檔案。
- XML —— 如果請求的 body 是 XML 格式,就是用分級的 XML 樹來顯示它。
響應 (Response) 部分詳解
- Transformer —— 顯示響應的編碼資訊。
- Headers —— 用分級視圖顯示響應的 header。
- TextView —— 使用文本顯示相應的 body。
- ImageVies —— 如果請求是圖檔資源,顯示響應的圖檔。
- HexView —— 用十六進制資料顯示響應。
- WebView —— 響應在 Web 浏覽器中的預覽效果。
- Auth —— 顯示響應 header 中的 Proxy-Authorization(代理身份驗證) 和 Authorization(授權) 資訊。
- Caching —— 顯示此請求的緩存資訊。
- Privacy —— 顯示此請求的私密 (P3P) 資訊。
- Raw —— 将整個響應顯示為純文字。
- JSON - 顯示JSON格式檔案。
- XML —— 如果響應的 body 是 XML 格式,就是用分級的 XML 樹來顯示它 。
—————————————————————————————————————————————————
四、urllib和urllib2庫的基本使用
所謂網頁抓取,就是把URL位址中指定的網絡資源從網絡流中抓取出來。在Python中有很多庫可以用來抓取網頁,我們先學習
urllib2
。
urllib2 是 Python2.7 自帶的子產品(不需要下載下傳,導入即可使用)
urllib2 官方文檔:https://docs.python.org/2/library/urllib2.html
urllib2 源碼:https://hg.python.org/cpython/file/2.7/Lib/urllib2.py
在 python3 中,urllib2 被改為urllib.request
urlopen
我們先來段代碼:
# 建立一個py檔案:urllib2_urlopen.py
# 導入urllib2 庫
import urllib2
# 向指定的url發送請求,并傳回伺服器響應的類檔案對象
response = urllib2.urlopen("http://www.baidu.com")
# 類檔案對象支援 檔案對象的操作方法,如read()方法讀取檔案全部内容,傳回字元串
html = response.read()
# 列印字元串
print(html)
執行寫的python代碼,将列印結果
[email protected]:~/Desktop/demo$ python urllib2_urlopen.py
實際上,如果我們在浏覽器上打開百度首頁, 右鍵選擇“檢視源代碼”,你會發現,跟我們剛才列印出來的是一模一樣。也就是說,上面的4行代碼就已經幫我們把百度的首頁的全部代碼爬了下來。
一個基本的url請求對應的python代碼真的非常簡單。
Request
在我們第一個例子裡,urlopen()的參數就是一個url位址;
但是如果需要執行更複雜的操作,比如增加HTTP報頭,必須建立一個 Request 執行個體來作為urlopen()的參數;而需要通路的url位址則作為 Request 執行個體的參數。
我們編輯urllib2_request.py
# urllib2_request.py
import urllib2
# url 作為Request()方法的參數,構造并傳回一個Request對象
request = urllib2.Request("http://www.baidu.com")
# Request對象作為urlopen()方法的參數,發送給伺服器并接收響應
response = urllib2.urlopen(request)
html = response.read()
print(html)
運作結果是完全一樣的:
建立Request執行個體,除了必須要有 url 參數之外,還可以設定另外兩個參數:
- data(預設空):送出的Form表單資料,同時 HTTP 請求方法将從預設的 "GET"方式 改為 "POST"方式。
- headers(預設空):參數為字典類型,包含了需要發送的HTTP報頭的鍵值對。
User-Agent
但是這樣直接用urllib2給一個網站發送請求的話,确實略有些唐突了,就好比,人家每家都有門,你以一個路人的身份直接闖進去顯然不是很禮貌。而且有一些站點不喜歡被程式(非人為通路)通路,有可能會拒絕你的通路請求。
但是如果我們用一個合法的身份去請求别人網站,顯然人家就是歡迎的,是以我們就應該給我們的這個代碼加上一個身份,就是所謂的
User-Agent
頭。
- 浏覽器 就是網際網路世界上公認被允許的身份,如果我們希望我們的爬蟲程式更像一個真實使用者,那我們第一步就是需要僞裝成一個被浏覽器。用不同的浏覽器在發送請求的時候,會有不同的 User-Agent 報頭。
- urllib2預設的User-Agent頭為:
(x和y 是Python 主.次 版本号,例如 Python-urllib/2.7)
Python-urllib/x.y
# coding:utf-8
#urllib2_useragent.py
import urllib2
url = "http://www.baidu.com"
# IE 9.0 的 User-Agent,包含在 user_agent裡
user_agent = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"}
# url 連同 headers,一起構造Request請求,這個請求将附帶 IE9.0 浏覽器的User-Agent
request = urllib2.Request(url, headers = user_agent)
# 向伺服器發送這個請求
response = urllib2.urlopen(request)
html = response.read()
print(html)
添加更多的Header資訊
在 HTTP Request 中加入特定的 Header,來構造一個完整的HTTP請求消息。
可以通過調用添加/修改一個特定的header 也可以通過調用
Request.add_header()
來檢視已有的header。
Request.get_header()
- 添加一個特定的header
# coding:utf-8
# urllib2_headers.py
import urllib2
url = "http://www.baidu.com"
#IE 9.0 的 User-Agent
user_agent = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"}
request = urllib2.Request(url, headers = user_agent)
#也可以通過調用Request.add_header() 添加/修改一個特定的header
request.add_header("Connection", "keep-alive")
# 也可以通過調用Request.get_header()來檢視header資訊
# request.get_header(header_name="Connection")
response = urllib2.urlopen(request)
print(response.code #可以檢視響應狀态碼)
html = response.read()
print(html)
- 随機添加/修改User-Agent
# urllib2_add_headers.py
import urllib2
import random
url = "http://www.baidu.com"
ua_list = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6"
]
user_agent = random.choice(ua_list)
request = urllib2.Request(url)
#也可以通過調用Request.add_header() 添加/修改一個特定的header
request.add_header("User-Agent", user_agent)
# get_header()的字元串參數,第一個字母大寫,後面的全部小寫
request.get_header("User-agent")
response = urllib2.urlopen(request)
html = response.read()
print(html)
—————————————————————————————————————————————————
(一)URL編碼轉換
一般HTTP請求送出資料,需要将資料編碼成 URL編碼格式,然後做為查詢字元串或者表單參數,建構Request對象中再發送。
urllib 和 urllib2 都是接受URL請求的相關子產品,但是提供了不同的功能。兩個最顯著的不同如下:
- urllib 子產品僅可以接受URL,不能建立 設定了headers 的Request 類執行個體;
- 但是 urllib 提供
方法用來産生GET查詢字元串,而 urllib2 則沒有。(這是 urllib 和 urllib2 經常一起使用的主要原因)
urlencode
- 編碼工作使用urllib的
函數,幫我們将
urlencode()
這樣的鍵值對,轉換成
key:value
這樣的字元串,解碼工作可以使用urllib的
"key=value"
函數。( 注意,不是urllib2.urlencode())
unquote()
# IPython2 中的測試結果
In [6]: import urllib
# 通過urllib.urlencode()方法,将字典鍵值對按URL編碼轉換,進而能被web伺服器接受。
In [7]: a = {"wd":"杭州很美"}
In [8]: urllib.urlencode(a)
Out[8]: 'wd=%E6%9D%AD%E5%B7%9E%E5%BE%88%E7%BE%8E'
# 通過urllib.unquote()方法,把 URL編碼字元串,轉換回原先字元串。
In [9]: print(urllib.unquote('wd=%E6%9D%AD%E5%B7%9E%E5%BE%88%E7%BE%8E'))
wd=杭州很美
——————————————————————————————————————————————————
六、Get請求
GET請求一般用于我們向伺服器擷取資料,比如說,我們用百度搜尋
杭州好美
:
https://www.baidu.com/s?wd=“杭州好美”
浏覽器的url會跳轉成如圖所示:
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-LVcYFFce-1572593770699)(assets/01-shousuo.png)]
https://www.baidu.com/s?wd=%22%E6%9D%AD%E5%B7%9E%E5%A5%BD%E7%BE%8E%E2%80%9C
在其中我們可以看到在請求部分裡,
http://www.baidu.com/s?
之後出現一個長長的字元串,其中就包含我們要查詢的關鍵詞–杭州很美,于是我們可以嘗試用預設的Get方式來發送請求。
# urllib2_get.py
import urllib #負責url編碼處理
url = "http://www.baidu.com/s?"
keyword = {"wd":"杭州好美"}
word = urllib.urlencode(keyword) #轉換成url編碼格式(查詢字元串)
newurl = url + word # 拼接url
headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
request = urllib2.Request(newurl, headers=headers)
response = urllib2.urlopen(request)
print response.read()
批量爬取貼吧頁面資料
首先我們建立一個python檔案, tiebaSpider.py,我們要完成的是,輸入一個百度貼吧的位址,以及起始頁和結束頁,就能将所有的網頁源碼下載下傳并儲存到本地。
比如百度貼吧LOL吧:
第一頁:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0
第二頁: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50
第三頁: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100
1.發現規律了吧,貼吧中每個頁面不同之處,就是url最後的pn的值,其餘的都是一樣的,我們可以抓住這個規律來寫代碼。
def test():
"""測試檔案,通過擷取輸入起始頁,結束頁,擷取pn值"""
begin_page = int(input("請輸入起始頁:"))
end_page = int(input("請輸入結束頁:"))
# 循環擷取每個頁碼值
for page in range(begin_page, end_page + 1):
# 計算得出目前頁碼的 pn 值
pn = (page - 1) * 50
# 檢測pn值是否正确
print(pn)
if __name__ == '__main__':
test()
簡單寫一個小爬蟲程式,來爬取百度LOL吧的所有網頁。
- 提示使用者輸入要爬取的貼吧名,起始頁,結束頁
- 寫一個main函數
- main函數裡組合的拼接後的url位址,以及起始頁碼和終止頁碼,表示要爬取頁碼的範圍。
- 并用urllib.urlencode()進行轉碼
- 然後組合url,假設使用者輸入的貼吧名是lol,起始頁是1, 結束頁是大于1的值(例如3)
- 組合後的起始url就是:
http://tieba.baidu.com/f?kw=lol&pn=0
from urllib import parse
tieba_name = input("請輸入貼吧名:")
begin_page = int(input("請輸入起始頁:"))
end_page = int(input("請輸入結束頁:"))
base_url = "http://tieba.baidu.com/f?"
def main():
# 循環擷取每個頁碼值
for page in range(begin_page, end_page + 1):
# 計算得出目前頁碼的 pn 值
pn = (page - 1) * 50
query_dict = {"kw": tieba_name, "pn": pn}
# 從urllib包擷取parse子產品, 裡面的urlencode方法
# 将字典轉換為查詢字元串
query_str = parse.urlencode(query_dict)
# 拼接base_url 和查詢字元串,建構完整的url位址
full_url = base_url + query_str
print(full_url)
if __name__ == '__main__':
main()
- 接下來,我們寫一個百度貼吧爬蟲接口,url傳入send_request函數,函數裡用urlopen方法實作爬取網頁的功能,并傳回一個響應對象。通過response.read()擷取響應内容
def send_request(url):
"""
接收url位址,發送請求,傳回響應
"""
request = urllib.request.Request(url, headers = headers)
print("[INFO]: 正在發送請求 {}..".format(url))
response = urllib.request.urlopen(request)
print(response.read())
return response
- 最後如果我們希望将爬取到了每頁的資訊存儲在本地磁盤上,我們可以簡單寫一個存儲檔案的接口。
def save_page(response, file_name):
"""
儲存響應内容到指定檔案中
"""
print("[INFO]: 正在儲存資料 {}..".format(file_name))
with open(file_name, "w") as f:
f.write(response.read().decode())
其實很多網站都是這樣的,同類網站下的html頁面編号,分别對應網址後的網頁序号,隻要發現規律就可以批量爬取頁面了。
#最終的代碼
#coding:utf-8
import urllib
from urllib import request, parse
base_url = "http://tieba.baidu.com/f?"
headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"}
tieba_name = input("請輸入貼吧名:")
begin_page = int(input("請輸入起始頁:"))
end_page = int(input("請輸入結束頁:"))
def send_request(url):
"""
接收url位址,發送請求,傳回響應
"""
request = urllib.request.Request(url, headers = headers)
print("[INFO]: 正在發送請求 {}..".format(url))
response = urllib.request.urlopen(request)
return response
def save_page(response, file_name):
"""
儲存響應内容到指定檔案中
"""
print("[INFO]: 正在儲存資料 {}..".format(file_name))
with open(file_name, "w") as f:
f.write(response.read().decode())
def main():
"""
爬蟲排程中心
"""
# 循環擷取每個頁碼值
for page in range(begin_page, end_page + 1):
# 計算得出目前頁碼的 pn 值
pn = (page - 1) * 50
# 建構查詢字元串
query_dict = {"kw" : tieba_name, "pn" : pn}
query_str = urllib.parse.urlencode(query_dict)
# 拼接base_url 和查詢字元串,建構完整的url位址
full_url = base_url + query_str
file_name = tieba_name + str(page) + ".html"
try:
# 将url位址傳給send_request() 發送請求,傳回響應
response = send_request(full_url)
# 儲存響應資料到檔案中
save_page(response, file_name)
except Exception as e:
print("[ERROR] : {} 抓取失敗.".format(full_url))
print(e)
if __name__ == '__main__':
main()
七、POST請求:
擷取AJAX加載的内容
有些網頁内容使用AJAX請求加載,這種資料無法直接對網頁url進行擷取。但是隻要記住,AJAX請求一般傳回給網頁的是JSON檔案,隻要對AJAX請求位址進行POST或GET,就能傳回JSON資料了。
如果非要從HTML頁面裡擷取展現出來的資料,也不是不可以。但是要記住,作為一名爬蟲工程師,你更需要關注的是資料的來源。
發送POST請求時,需要了解的headers一些屬性:
: 是指發送的表單資料長度為100,也就是url編碼字元串的字元個數是100個。
Content-Length: 100
: 表示浏覽器送出 Web 表單時使用,表單資料會按照 name1=value1&name2=value2 鍵值對形式進行編碼。
Content-Type: application/x-www-form-urlencoded
:表示AJAX異步請求
X-Requested-With: XMLHttpRequest
騰訊翻譯君案例:
1.解析頁面
輸入要翻譯的文本,顯示出翻譯内容,html發生了變化,其url沒有發生改變,這是一個動态頁面。
通過浏覽器自帶的抓包工具,抓取動态頁面。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-c18sd9Q7-1572593770699)(assets/騰訊翻譯01.png)]
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-TtFjhw4x-1572593770699)(assets/騰訊翻譯02.png)]
2.分析資料
輸入不同的文本内容,分析post攜帶的表單資料有何異同
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-rksbG7pa-1572593770700)(assets/騰訊翻譯03.png)]
根據文本内容不同(例如,翻譯框輸入“你好” 和“中國”後對比表單資訊),發現表單的所有字段都相同,唯有要翻譯的文本資訊和時間戳不一樣,其他都相同,那我們可以針對這兩個字段,替換成符合要求的内容。
"sourceText": input("請輸入要翻譯的内容")
# 時間戳
# 根據經驗,15或16開頭的10-15位數字,一般優先考慮是時間戳
"sessionUuid": "translate_uuid" + str(int(time.time() * 1000))
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-LARKNNKG-1572593770700)(assets/時間戳.png)]
嘗試用POST方式發送請求
import json
import requests
import time
# post請求的url位址, 通過浏覽器抓包擷取
base_url = "https://fanyi.qq.com/api/translate"
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Connection": "keep-alive",
"Content-Length": "294",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": "fy_guid=94af8e98-08f4-49a2-9562-1c93b5299969; qtv=c03f8898e63faaf1; qtk=c0VhySUiXAQjye4yzCLCCnS2VJiX3nO+PguX/CLuhKsDkPu2+aN5vr0fr0/6hfpi+jVIS4Z0Ys7bm4xK1jsYymyeF3qbhP1xI3kbKmqf1UBe/TnrdmhbwkYPdmjP61aqIZfIN89ZyLDagGo2fjNESg==; openCount=1; gr_user_id=6edf2548-7b4e-4c34-9c05-6831c2ebb552; 8507d3409e6fad23_gr_session_id=8577a037-6ae8-4d6e-b898-3eb27a84dc16; grwng_uid=d7ac9b1f-70f3-48b1-8e56-a1d004132d66; 8c66aca9f0d1ff2e_gr_session_id=c74395eb-6342-4057-8224-077764c5a5eb; 8507d3409e6fad23_gr_session_id_8577a037-6ae8-4d6e-b898-3eb27a84dc16=false",
"Host": "fanyi.qq.com",
"Origin": "https://fanyi.qq.com",
"Referer": "https://fanyi.qq.com/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"X-Requested-With": "XMLHttpRequest"
}
# 需要傳遞的表單資料
form_data = {
"source": "auto",
"target": "auto",
# 翻譯的内容
"sourceText": input("請輸入要翻譯的内容"),
"qtv": "c03f8898e63faaf1",
"qtk": "c0VhySUiXAQjye4yzCLCCnS2VJiX3nO+PguX/CLuhKsDkPu2+aN5vr0fr0/6hfpi+jVIS4Z0Ys7bm4xK1jsYymyeF3qbhP1xI3kbKmqf1UBe/,TnrdmhbwkYPdmjP61aqIZfIN89ZyLDagGo2fjNESg==",
# 時間戳
"sessionUuid": "translate_uuid" + str(int(time.time() * 1000))
}
def send_request():
# requests是urllib的封裝
response2 = requests.post(base_url, data=form_data, headers=headers)
return response2
def parse_response(response):
# 擷取響應字元串
str_content = response.content.decode("utf-8")
# 将響應字元串轉為Python資料類型
dict_json = json.loads(str_content)
print("翻譯結果", dict_json["translate"]["records"][0]["targetText"])
def main():
response2 = send_request()
parse_response(response2)
if __name__ == '__main__':
main()
問題:GET和POST的差別?
GET方式是直接以連結形式通路,連結中包含了所有的參數,伺服器端用Request.QueryString擷取變量的值。如果包含了密碼的話是一種不安全的選擇,不過你可以直覺地看到自己送出了什麼内容。
requests是urllib的封裝
response2 = requests.post(base_url, data=form_data, headers=headers)
return response2
def parse_response(response):
# 擷取響應字元串
str_content = response.content.decode(“utf-8”)
# 将響應字元串轉為Python資料類型
dict_json = json.loads(str_content)
print(“翻譯結果”, dict_json[“translate”][“records”][0][“targetText”])
def main():
response2 = send_request()
parse_response(response2)
if name == ‘main’:
main()
------
### 問題:GET和POST的差別?
> - GET方式是直接以連結形式通路,連結中包含了所有的參數,伺服器端用Request.QueryString擷取變量的值。如果包含了密碼的話是一種不安全的選擇,不過你可以直覺地看到自己送出了什麼内容。
> - POST則不會在網址上顯示所有的參數,伺服器端用Request.Form擷取送出的資料,在Form送出的時候。但是HTML代碼裡如果不指定 method 屬性,則預設為GET請求,Form中送出的資料将會附加在url之後,以`?`分開與url分開。