1. 程式人生 > >python一行程式碼實現百度翻譯和有道翻譯結果獲取-----py學習爬蟲歷程(一)

python一行程式碼實現百度翻譯和有道翻譯結果獲取-----py學習爬蟲歷程(一)

更新(18-6-2):利用requests庫只需一行程式碼就可以獲取結果,程式碼在最後

前言:本文參考於https://blog.csdn.net/c406495762/article/details/59095864一.本節主要用到的知識

1-1

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

1-2 :

urllib.request.Request(url, data=None, headers={}, origin_req_host=None

, unverifiable=False, method=None)

1-3:

二.正文

2-1:用微軟edge瀏覽器的審查元素提取出有道翻譯介面地址

1.    找到post型別的方法(簡單來說,get是伺服器向你傳送資料,post是你向伺服器提交資訊)



2-2:建立提交的資料格式

在響應正文裡可以看到伺服器向我們返回的結果,是一個json格式的資訊。要想知道我們剛才在點選翻譯時向伺服器提交的資料,我們需要開啟請求正文,那些就是我們向伺服器提交的資料,但是這些資料不能直接向伺服器提交,需要轉化為伺服器可以處理的編碼方式,這裡就要用到urllib.parse.urlencode()方法。



3-3:實戰

大致思路如下:

1.    建立連線介面

2.    建立要提交的資料

3.    將資料轉化為伺服器可以處理的資訊並提交

4.    返回翻譯結果

程式碼實現如下:

    # 有道翻譯結果獲取
from urllib import request, parse
import json

if __name__ == '__main__':
    req_url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'  # 建立連線介面
    # 建立要提交的資料
    Form_Date = {}
    Form_Date['i'] = 'i love you'
    Form_Date['doctype'] = 'json'
    Form_Date['form'] = 'AUTO'
    Form_Date['to'] = 'AUTO'
    Form_Date['smartresult'] = 'dict'
    Form_Date['client'] = 'fanyideskweb'
    Form_Date['salt'] = '1526995097962'
    Form_Date['sign'] = '8e4c4765b52229e1f3ad2e633af89c76'
    Form_Date['version'] = '2.1'
    Form_Date['keyform'] = 'fanyi.web'
    Form_Date['action'] = 'FY_BY_REALTIME'
    Form_Date['typoResult'] = 'false'
    data = parse.urlencode(Form_Date).encode('utf-8')  # 資料轉換
    response = request.urlopen(req_url, data)  # 提交資料並解析
    html = response.read().decode('utf-8')  # 伺服器返回結果讀取
    print(html)
    # 可以看出html是一個json格式
    translate_results = json.loads(html)  # 以json格式載入
    translate_results = translate_results['translateResult'][0][0]['tgt']  # json格式調取
    print(translate_results)  # 輸出結果

 執行之後發現出現“errorCode:50”(或者是“error:997”),百度了一波發現是連線介面有問題(凡事多百度),於是將連線改為:http://fanyi.youdao.com/translate,這才是有道翻譯的真正介面,再次執行,出結果。

 # 有道翻譯結果獲取

from urllib import request, parse
import json

if __name__ == '__main__':
    req_url = 'http://fanyi.youdao.com/translate'  # 建立連線介面
    # 建立要提交的資料
    Form_Date = {}
    Form_Date['i'] = 'i love you'  
    Form_Date['doctype'] = 'json'
    Form_Date['form'] = 'AUTO'
    Form_Date['to'] = 'AUTO'
    Form_Date['smartresult'] = 'dict'
    Form_Date['client'] = 'fanyideskweb'
    Form_Date['salt'] = '1526995097962'
    Form_Date['sign'] = '8e4c4765b52229e1f3ad2e633af89c76'
    Form_Date['version'] = '2.1'
    Form_Date['keyform'] = 'fanyi.web'
    Form_Date['action'] = 'FY_BY_REALTIME'
    Form_Date['typoResult'] = 'false'

    data = parse.urlencode(Form_Date).encode('utf-8') #資料轉換
    response = request.urlopen(req_url, data) #提交資料並解析
    html = response.read().decode('utf-8')  #伺服器返回結果讀取
    print(html)
    # 可以看出html是一個json格式
    translate_results = json.loads(html)  #以json格式載入
    translate_results = translate_results['translateResult'][0][0]['tgt']  # json格式調取
    print(translate_results) #輸出結果


4-1:完善成功執行之後我就在想,這些Form_Data是不是每一項都起作用,去掉其中幾個還可不可以執行,試了一下之後,果真可以,哈哈。經過每一項的嘗試,最後發現只有“i”(要翻譯的內容必須有)和“doctype”(指定翻譯結果為json格式)起作用,於是果斷將別的刪除。
 # 有道翻譯結果獲取

from urllib import request, parse
import json

if __name__ == '__main__':
    req_url = 'http://fanyi.youdao.com/translate'  # 建立連線介面
    # 建立要提交的資料
    Form_Date = {}
    Form_Date['i'] = 'i love you'  # 要翻譯的內容可以更改
    Form_Date['doctype'] = 'json'
    

    data = parse.urlencode(Form_Date).encode('utf-8') #資料轉換
    response = request.urlopen(req_url, data) #提交資料並解析
    html = response.read().decode('utf-8')  #伺服器返回結果讀取
    print(html)
    # 可以看出html是一個json格式
    translate_results = json.loads(html)  #以json格式載入
    translate_results = translate_results['translateResult'][0][0]['tgt']  # json格式調取
    print(translate_results) #輸出結果


三:獲取百度翻譯結果

3-1:抓取介面地址



這時可能有的小夥伴會問,為什麼同是post型別的http://fanyi.baidu.com/langdetect不可以,我們檢視他的響應正文,發現沒有我們需要的返回結果,而檢視另外兩個的響應正文,發現都是以json編碼格式的返回結果。



經過上面的有道翻譯結果的獲取,我們有了一定的經驗。

檢視v2transapi的請求正文,發現多了個“from”:zh和“to“:en,我們都知道這時zh是中文的縮寫,en是英文的縮寫,由此我們可以判斷這兩個資料是我們必須的,而且可以更改取得不同語言的翻譯結果。

四:實戰:

4-1:

思路和獲取有道翻譯的一樣,程式碼實現如下(第一個介面):

from urllib import request,parse
import json

if __name__ == '__main__':
   
    #實時翻譯的介面,只能翻譯英語到漢語
    req_url = 'http://fanyi.baidu.com/sug'  
    Form_Data = {"kw": 'love'}

    data = parse.urlencode(Form_Data).encode('utf-8')
    response = request.urlopen(req_url,data)
    html = response.read().decode('utf-8')
    
    print(html)
    #可以看出html是一個json格式
    translate_results = json.loads(html)
    for item in translate_results['data']:
        for items in item:
            print(item[items])

執行結果(這個介面翻譯出的結果多):4-2:第二個介面(英語翻譯為德語):
from urllib import request,parse
import json

if __name__ == '__main__':
   
    #點選翻譯的介面
    req_url = 'http://fanyi.baidu.com/v2transapi'
    Form_Data = {"query": 'love','from':'en','to':'de'} #英語翻譯為德語

    data = parse.urlencode(Form_Data).encode('utf-8')
    response = request.urlopen(req_url,data)
    html = response.read().decode('utf-8')
    
    print(html)
    #可以看出html是一個json格式
    translate_results = json.loads(html)
    translate_results = translate_results['data'][0]['dst']
    print(translate_results)

執行結果:

出現error:997,和上面有道翻譯錯誤一樣,我們將介面地址改為:

http://fanyi.baidu.com/transapi
再次執行:

成功執行

更新(18-6-2):

requests庫官方文件:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

程式碼如下:

import requests

if __name__ == '__main__':
    # 實時翻譯的介面,只能翻譯英語到漢語
    # req_url = 'http://fanyi.baidu.com/sug'
    # Form_Data = {"kw": 'love'}

    req_url = 'http://fanyi.baidu.com/transapi'
    Form_Data = {"query": 'love', 'from': 'en', 'to': 'de'}  # 英語翻譯為德語
    
    translate_result = requests.post(req_url,Form_Data)
    result = translate_result.json() #轉化為json格式
    print(result['data'][0]['dst'])
    
    #簡化為一行程式碼就是
    print(requests.post('http://fanyi.baidu.com/transapi', data={"query": 'love', 'from': 'en', 'to': 'de'}).json()['data'][0]['dst'])