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
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) #輸出結果
# 有道翻譯結果獲取
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'])