爬蟲系列(四) 用urllib實現英語翻譯

這篇文章咱們將以 百度翻譯 爲例,分析網絡請求的過程,而後使用 urllib 編寫一個英語翻譯的小模塊html

一、準備工做

首先使用 Chrome 瀏覽器打開 百度翻譯,這裏,咱們選擇 Chrome 瀏覽器自帶的開發者工具對網站進行抓包分析python

二、抓包分析

打開 Network 選項卡進行監控,並選擇 XHR 做爲 Filter 進行過濾json

而後,咱們在輸入框中輸入待翻譯的文字進行測試,能夠看到列表中出現三個數據包api

分別是 sug、v2transapi 和 langdetect,下面咱們一個一個進行分析瀏覽器

(1)分析 sug 數據包

① 打開 sug 數據包的 Preview 選項卡查看響應結果,太棒了,裏面有咱們須要的翻譯結果網絡

② 而後,咱們能夠打開 sug 數據包的 Headers 選項卡分析請求數據,使用程序模擬發送請求,基本信息以下:工具

  • General:基本參數
    • Request URL : https://fanyi.baidu.com/sug —— 請求網址
    • Request Method : POST —— 請求方法,POST 請求方法的請求參數放在 Form Data 中
  • Request Headers:請求頭部
    • User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36 —— 用戶代理
  • Form Data:表單數據
    • kw : 你好 —— 翻譯的內容

③ 下面祭上完整的代碼測試

import urllib.request
import urllib.parse
import json

def translate(text):
    # 參數檢驗
    if not text:
        return 'None'
    # 請求網址
    url = "https://fanyi.baidu.com/sug"
    # 表單數據
    params = {
        'kw':text
    }
    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['errno'] == 0: # 一切正常
        result = content['data'][0]['v']
    else: # 發生錯誤
        result = 'Error'
    # 返回結果
    return result

if __name__ == "__main__":
    while True :
        text = input('翻譯內容:')
        result = translate(text)
        print("翻譯結果:%s" % result)

OK,一切完美解決!網站

等等,真的就這樣結束了嗎?加密

能夠看到,上面的代碼雖然能夠完美翻譯中文和英文,可是卻不能翻譯句子!

這可怎麼辦呀?別急,不是還有兩個數據包沒有分析嘛,再看看還有沒有其它辦法吧

(2)分析 v2transapi 數據包

① 打開 v2transapi 數據包的 Preview 選項卡查看響應結果,這裏面居然也有咱們須要的翻譯結果

② 接下來,咱們仍是打開 v2transapi 數據包的 Headers 選項卡查看請求數據,其基本信息以下:

  • General:基本參數
    • Request URL : https://fanyi.baidu.com/v2transapi —— 請求網址
    • Request Method : POST —— 請求方法,POST 請求方法的請求參數放在 Form Data 中
  • Request Headers:請求頭部
    • User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36 —— 用戶代理
  • Form Data:表單數據
    • query : 你好 —— 翻譯的內容
    • from : zh —— 翻譯內容的語言類型,zh 表明中文,設置爲 auto 可自動檢測
    • to : en —— 翻譯結果的語言類型,en 表明英文,設置爲 auto 可自動檢測
    • signtoken:加密參數

唉,只想簡簡單單爬個翻譯,居然還要涉及密碼破解,沒辦法,只好請教百度了

一查才知道,原來百度翻譯有一個公開的 API,根本就不須要涉及加密解密

只須要把上面的請求地址改爲 https://fanyi.baidu.com/transapi 就能夠了

③ 下面一樣祭上完整的代碼,其實和上面的十分相似

import urllib.request
import urllib.parse
import json

def translate(text):
    # 參數檢驗
    if not text:
        return 'None'
    # 請求網址
    url = "https://fanyi.baidu.com/transapi"
    # 表單數據
    params = {
        'query':text,
        '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'))
    result = content['data'][0]['dst']
    # 返回結果
    return result

if __name__ == "__main__":
    while True :
        text = input('翻譯內容:')
        result = translate(text)
        print("翻譯結果:%s" % result)

下面咱們來看看效果如何?

嗯,效果還能夠,終於也可以翻譯句子了!

三、相關拓展

有道翻譯的爬取和百度翻譯的十分相似,這裏也順便說起一下

咱們仍是先來打開數據包的 Headers 選項卡查看請求數據,其基本信息以下:

  • General:基本參數
    • Request URL : http://fanyi.youdao.com/translate_o —— 請求網址
    • Request Method : POST —— 請求方法,POST 請求方法的請求參數放在 Form Data 中
  • Request Headers:請求頭部
    • User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36 —— 用戶代理
  • Form Data:表單數據
    • i: 你好 —— 翻譯的內容
    • doctype : json —— 數據類型,指定爲 JSON
    • from : AUTO —— 翻譯內容的語言類型,自動檢測
    • to : AUTO —— 翻譯結果的語言類型,自動檢測
    • signsalt:加密參數

和百度翻譯的很相似,都設置了加密參數,怎麼辦?也和百度翻譯相似,修改一下請求地址就好

話很少說,直接放代碼:

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',
        '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)

效果演示:

【爬蟲系列相關文章】

相關文章
相關標籤/搜索