翻譯效果圖:
源代碼:
import urllib.request #導入模塊
import urllib.parse
import json
def translate(text):
# 參數檢驗
if not text: #無內容輸入
return 'None'
# 請求網址
url = "https://fanyi.youdao.com/translate"
# 表單數據
params = {
'i':text,
'doctype':'json', #數據類型,指定爲 JSON
'from':'AUTO',
'to':'AUTO'
}
data = urllib.parse.urlencode(params).encode('utf-8')
# 請求頭部
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
# 構造請求對象
req = urllib.request.Request(url=url,data=data,headers=headers)
# 發送請求,獲得響應
response = urllib.request.urlopen(req)
# 解析數據
content = json.loads(response.read().decode('utf-8'))
if content['errorCode'] == 0: # 一切正常
result_tup = (item['tgt'] for item in content['translateResult'][0])
result = ''.join(result_tup)
else: # 發生錯誤
result = 'Error'
# 返回結果
return result
if __name__ == "__main__":
while True :
text = input('翻譯內容:')
result = translate(text)
print("翻譯結果:%s" % result)
講解:
一、urllib 的 request 模塊 和 parse 模塊
1、 request 模塊(請求處理模塊)
① urlopen 方法(發送請求,獲得響應)
urllib.request.urlopen(req)
req 參數在下一個方法會講到的
函數整體的返回值
response = urllib.request.urlopen(req)
② Request 方法(構造請求對象)
urllib.request.Request((url=url,data=data,headers=headers)
url 參數(str):請求網址
url = https://fanyi.youdao.com/translate
data 參數(bytes):表單數據,默認爲 None(後面會講到)
data = urllib.parse.urlencode(params).encode('utf-8')
headers 參數(dict):請求頭部(一定要用大括號)
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
在 Network 中第一個文件的 Headers 的最下面顯示
函數整體的返回值
req = urllib.request.Request((url=url,data=data,headers=headers)
2、 parse 模塊(URL 處理模塊)
就如上面的 data 參數用到的就是此模塊的 urlencode 方法
data = urllib.parse.urlencode(params).encode('utf-8')
作用是將 dict 類型數據轉化爲 str 類型數據(並將 str 類型數據轉化成 bytes 類型數據)
二、JSON 對象
先說明一下,JSON 是一種輕量級的數據格式(或者說像XML一樣是一種標準)
代碼開頭導入了 josn 庫,目的是爲了用它的 loads 函數
json.loads(response.read().decode('utf-8'))
作用是將已編碼的 JSON 字符串解碼爲 Python 對象
read()
:返回響應體(bytes 類型),通常需要使用 decode('utf-8')
將其轉化爲 str 類型
函數整體的返回值
content = json.loads(response.read().decode('utf-8'))
三、解析數據
if content['errorCode'] == 0: # 一切正常
result_tup = (item['tgt'] for item in content['translateResult'][0])
result = ''.join(result_tup)
else: # 發生錯誤
result = 'Error'
上面所述內容是基於有道翻譯反爬蟲機制而編寫的
具體詳解我也不是很清楚
四、關於 main 函數
if __name__ == '__main__'
的意思是:當 .py文件被 直接運行 時,if __name__ == '__main__'
之下的代碼塊將被運行;當 .py文件以模塊形式被 導入 時,if __name__ == '__main__'
之下的代碼塊不被運行
但由於本源代碼沒有發揮出它的作用,所以寫這個函數只是爲了規範(好看 )
參考博客:
爬蟲系列(三) urllib的基本使用
爬蟲系列(四) 用urllib實現英語翻譯
Python中if _ name _ == “_ main _” ,init 和self 的解析