爬蟲---實現英語翻譯(有道翻譯)

翻譯效果圖:

在這裏插入圖片描述

源代碼:

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 的解析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章