天天看點

Python網絡爬蟲(2)- 爬蟲翻譯程式-含有道、金山、百度翻譯

1.0 版本

#首先貼上結果,自動檢測語言

Python網絡爬蟲(2)- 爬蟲翻譯程式-含有道、金山、百度翻譯

對于這種需要送出資料的爬蟲,最主要的就是擷取form data了,具體的擷取方式請參考

如何通過Chrome擷取post表單資料

這裡需要注意的是,同一個網站的表單的屬性名可能會有變化,自己使用的時候需要注意,否則可能會導緻結果不對,或者亂碼什麼的。

下面是基于python3.6.1版本的程式

# -*- coding: UTF-8 -*-
from urllib import request
from urllib import parse
import json

if __name__ == "__main__":
    #Request URL
    Request_URL = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
    #建立Form_Data字典,存儲得到的Form Data
    Form_Data = {}
    Form_Data['type'] = 'AUTO'
    Form_Data['from'] = 'AUTO' #自動檢測語言
    Form_Data['to'] = 'AUTO'
    Form_Data['smartresult'] = 'dict'
    Form_Data['doctype'] = 'json'
    Form_Data['version'] = '2.1'
    Form_Data['keyfrom'] = 'fanyi.web'
    Form_Data['action'] = 'FY_BY_REALTIME'
    #使用urlencode方法轉換标準格式
    while 1:
        Form_Data['i'] = input("請輸入要翻譯的内容:")
        if Form_Data['i'].lower()=='exit':
            print('已退出')
            exit(0)
        data = parse.urlencode(Form_Data).encode('utf-8')
        #傳遞Request對象和轉換完格式的資料
        response = request.urlopen(Request_URL,data)
        #讀取資訊并解碼
        html = response.read().decode('utf-8')
        #使用JSON
        translate_results = json.loads(html)
        #找到翻譯結果
        translate_results = translate_results['translateResult'][0][0]['tgt']
        #列印翻譯資訊
        print("翻譯的結果是:%s" % translate_results)
           

2.0 版本 2018-3-29更新

在昨天的基礎上,加入了金山和百度的翻譯,以及對三者的結果進行比較的程式

先貼上結果

Python網絡爬蟲(2)- 爬蟲翻譯程式-含有道、金山、百度翻譯

然後貼上代碼(注意,現在這個2.0版本中,金山和有道的正常使用,可以輸入任何語言。百度的目前隻能支援英譯中,百度的是真的難搞,有興趣的童鞋可以給你幾個參考連結:百度翻譯最新接口破解    百度翻譯通用API(第二個連結是百度官方的,但是版本比較舊,和現在的API差別比較大,而且從爬取的難度上來說,百度要比其他兩個更難許多),在百度的官方參考代碼中,使用的是python2版本的,我這裡自己寫了python3版本的)

# -*- coding: UTF-8 -*-
from urllib import request
from urllib import parse
import json
import random
import _md5
import hashlib


def process(Request_URL,Form_Data):
    # 使用urlencode方法轉換标準格式
    data = parse.urlencode(Form_Data).encode('utf-8')
    # 傳遞Request對象和轉換完格式的資料
    response = request.urlopen(Request_URL, data)
    # 讀取資訊并解碼
    html = response.read().decode('utf-8')
    # 使用JSON
    translate_results = json.loads(html)
    return  translate_results

def Jinshan(onlyone=1,word=None):
    Request_URL = 'http://fy.iciba.com/ajax.php?a=fy'
    #建立Form_Data字典,存儲Form Data
    Form_Data = {'f' : 'auto',
                 't' : 'auto'}
    if onlyone==0:
        Form_Data['w']=word
        translate_results = process(Request_URL, Form_Data)
        # 找到翻譯結果
        if 'out' in translate_results['content']:
            translate_results = translate_results['content']['out']
        else:
            translate_results = translate_results['content']['word_mean']
        # 列印翻譯資訊
        print("金山翻譯結果是:%s" % translate_results)
        return
    print('正在使用金山詞霸\n')
    while 1:
        Form_Data['w'] = input("請輸入要翻譯的内容:")
        if Form_Data['w'].lower()=='exit':
            print('已退出金山詞霸')
            return
        translate_results=process(Request_URL,Form_Data)
        #找到翻譯結果
        if 'out' in translate_results['content']:
            translate_results = translate_results['content']['out']
        else:
            translate_results = translate_results['content']['word_mean']
        #列印翻譯資訊
        print("金山翻譯結果:%s" % translate_results)

def Youdao(onlyone=1,word=None):
    #對應上圖的Request URL
    Request_URL = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
    #建立Form_Data字典,存儲Form Data
    Form_Data = {'type' : 'AUTO',
                 'from' : 'AUTO',
                 'to'   : 'AUTO',
                 'smartresult':'dict',
                 'doctype': 'json',
                 'version': '2.1',
                 'keyfrom': 'fanyi.web',
                 'action' : 'FY_BY_REALTIME'
                 }

    if onlyone==0:
        Form_Data['i']=word
        translate_results = process(Request_URL, Form_Data)
        # 找到翻譯結果
        result = translate_results['translateResult'][0][0]['tgt']
        # 列印翻譯資訊
        print("有道翻譯結果:%s" % result)
        return
    print('正在使用有道翻譯\n')
    while 1:
        Form_Data['i'] = input("請輸入要翻譯的内容:")
        if Form_Data['i'].lower()=='exit':
            print('已退出有道翻譯')
            return
        translate_results = process(Request_URL, Form_Data)
        #找到翻譯結果
        result = translate_results['translateResult'][0][0]['tgt']
        # 列印翻譯資訊
        print("有道翻譯結果:%s" % result)

def Baidu(onlyone=1,word=None):
    Request_URL = 'https://fanyi-api.baidu.com/api/trans/vip/translate'
    # 建立Form_Data字典,存儲Form Data
    Form_Data = {'from' : 'auto',
                 'to'   : 'zh',
                 'appid':'20151113000005349',
                 'salt': random.randint(32768, 65536).__str__(),
                 }
    secretKey = 'osubCEzlGjzvw8qdQc41'

    if onlyone==0:
        Form_Data['q']=word
        sign = Form_Data['appid'] + Form_Data['q'] + Form_Data['salt'] + secretKey
        Form_Data['sign'] = hashlib.md5(sign.encode(encoding='gb2312')).hexdigest()
        translate_results = process(Request_URL, Form_Data)
        # 找到翻譯結果
        result = translate_results['trans_result'][0]['dst']
        # 列印翻譯資訊
        print("百度翻譯結果:%s" % result)
        return
    print('正在使用百度翻譯\n')
    while 1:
        Form_Data['q'] = input("請輸入要翻譯的内容:")
        if Form_Data['q'].lower()=='exit':
            print('已退出百度翻譯')
            return
        sign =Form_Data['appid'] + Form_Data['q'] + Form_Data['salt'] + secretKey
        Form_Data['sign'] = hashlib.md5(sign.encode(encoding='gb2312')).hexdigest()

        translate_results = process(Request_URL, Form_Data)
        #找到翻譯結果
        print(translate_results)
        result = translate_results['trans_result'][0]['dst']

        # 列印翻譯資訊
        print("百度翻譯結果:%s" % result)

def all():
    while 1:
        word=input("請輸入要翻譯的内容:")
        if word=='exit':
            print('已退出')
            return
        Youdao(0,word)
        Jinshan(0,word)
        Baidu(0,word)

if __name__ == '__main__':
    soft=input("請選擇要使用的翻譯軟體:1.有道翻譯 2.金山詞霸 3.百度翻譯 4.都看一下呗")
    if soft=='1':
        Youdao()
    elif soft=='2':
        Jinshan()
    elif soft == '3':
        Baidu()
    elif soft=='4':
        all()
    else:
        print('hhh,您這輸的小的沒設定的選項啊')

    print("白白,歡迎下次再來使用")