天天看點

爬蟲第二課三、抓包工具Fiddler四、urllib和urllib2庫的基本使用

三、抓包工具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設定

  1. 啟動Fiddler,打開菜單欄中的 Tools > Telerik Fiddler Options,打開“Fiddler Options”對話框。

    [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-N66kDaWl-1572593770696)(assets/01-fidder.png)]

  2. 對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)]

  3. 為 Fiddler 配置Windows信任這個根證書解決安全警告:Trust Root Certificate(受信任的根證書)。

    [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-FcQpOsmV-1572593770697)(assets/01-fidder_03.png)]

  4. Fiddler 主菜單 Tools -> Fiddler Options…-> Connections
    • 選中Allow remote computers to connect(允許遠端連接配接)
    • Act as system proxy on startup(作為系統啟動代理)

      [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-FwZ9290k-1572593770697)(assets/01-fidder_02.png)]

  5. 重新開機Fiddler,使配置生效(這一步很重要,必須做)。

Fiddler 如何捕獲Chrome的會話

  1. 安裝SwitchyOmega 代理管理 Chrome 浏覽器插件

    [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-OdSZsjYu-1572593770697)(assets/switchyomega.png)]

  2. 如圖所示,設定代理伺服器為127.0.0.1:8888

    [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-ODGyk3ik-1572593770698)(assets/switchyomega_setting.png)]

  3. 通過浏覽器插件切換為設定好的代理。

    [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-Z9PakEi7-1572593770698)(assets/SwitchyOmega_switch.png)]

Fiddler界面

設定好後,本機HTTP通信都會經過127.0.0.1:8888代理,也就會被Fiddler攔截到。

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-HNqFjloS-1572593770698)(assets/fiddler_show.png)]

請求 (Request) 部分詳解

  1. Headers —— 顯示用戶端發送到伺服器的 HTTP 請求的 header,顯示為一個分級視圖,包含了 Web 用戶端資訊、Cookie、傳輸狀态等。
  2. Textview —— 顯示 POST 請求的 body 部分為文本。
  3. WebForms —— 顯示請求的 GET 參數 和 POST body 内容。
  4. HexView —— 用十六進制資料顯示請求。
  5. Auth —— 顯示響應 header 中的 Proxy-Authorization(代理身份驗證) 和 Authorization(授權) 資訊.
  6. Raw —— 将整個請求顯示為純文字。
  7. JSON - 顯示JSON格式檔案。
  8. XML —— 如果請求的 body 是 XML 格式,就是用分級的 XML 樹來顯示它。

響應 (Response) 部分詳解

  1. Transformer —— 顯示響應的編碼資訊。
  2. Headers —— 用分級視圖顯示響應的 header。
  3. TextView —— 使用文本顯示相應的 body。
  4. ImageVies —— 如果請求是圖檔資源,顯示響應的圖檔。
  5. HexView —— 用十六進制資料顯示響應。
  6. WebView —— 響應在 Web 浏覽器中的預覽效果。
  7. Auth —— 顯示響應 header 中的 Proxy-Authorization(代理身份驗證) 和 Authorization(授權) 資訊。
  8. Caching —— 顯示此請求的緩存資訊。
  9. Privacy —— 顯示此請求的私密 (P3P) 資訊。
  10. Raw —— 将整個響應顯示為純文字。
  11. JSON - 顯示JSON格式檔案。
  12. 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 參數之外,還可以設定另外兩個參數:
  1. data(預設空):送出的Form表單資料,同時 HTTP 請求方法将從預設的 "GET"方式 改為 "POST"方式。
  2. headers(預設空):參數為字典類型,包含了需要發送的HTTP報頭的鍵值對。

User-Agent

但是這樣直接用urllib2給一個網站發送請求的話,确實略有些唐突了,就好比,人家每家都有門,你以一個路人的身份直接闖進去顯然不是很禮貌。而且有一些站點不喜歡被程式(非人為通路)通路,有可能會拒絕你的通路請求。

但是如果我們用一個合法的身份去請求别人網站,顯然人家就是歡迎的,是以我們就應該給我們的這個代碼加上一個身份,就是所謂的

User-Agent

頭。

  • 浏覽器 就是網際網路世界上公認被允許的身份,如果我們希望我們的爬蟲程式更像一個真實使用者,那我們第一步就是需要僞裝成一個被浏覽器。用不同的浏覽器在發送請求的時候,會有不同的 User-Agent 報頭。
  • urllib2預設的User-Agent頭為:

    Python-urllib/x.y

    (x和y 是Python 主.次 版本号,例如 Python-urllib/2.7)
# 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請求消息。

可以通過調用

Request.add_header()

添加/修改一個特定的header 也可以通過調用

Request.get_header()

來檢視已有的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 提供

    urlencode

    方法用來産生GET查詢字元串,而 urllib2 則沒有。(這是 urllib 和 urllib2 經常一起使用的主要原因)
  • 編碼工作使用urllib的

    urlencode()

    函數,幫我們将

    key:value

    這樣的鍵值對,轉換成

    "key=value"

    這樣的字元串,解碼工作可以使用urllib的

    unquote()

    函數。( 注意,不是urllib2.urlencode())
# 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一些屬性:

Content-Length: 100

: 是指發送的表單資料長度為100,也就是url編碼字元串的字元個數是100個。

Content-Type: application/x-www-form-urlencoded

: 表示浏覽器送出 Web 表單時使用,表單資料會按照 name1=value1&name2=value2 鍵值對形式進行編碼。

X-Requested-With: XMLHttpRequest

:表示AJAX異步請求

騰訊翻譯君案例:

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分開。