這篇文章咱們將以 百度翻譯 爲例,分析網絡請求的過程,而後使用 urllib 編寫一個英語翻譯的小模塊html
首先使用 Chrome 瀏覽器打開 百度翻譯,這裏,咱們選擇 Chrome 瀏覽器自帶的開發者工具對網站進行抓包分析python
打開 Network 選項卡進行監控,並選擇 XHR 做爲 Filter 進行過濾json
而後,咱們在輸入框中輸入待翻譯的文字進行測試,能夠看到列表中出現三個數據包api
分別是 sug、v2transapi 和 langdetect,下面咱們一個一個進行分析瀏覽器
① 打開 sug 數據包的 Preview 選項卡查看響應結果,太棒了,裏面有咱們須要的翻譯結果網絡
② 而後,咱們能夠打開 sug 數據包的 Headers 選項卡分析請求數據,使用程序模擬發送請求,基本信息以下:工具
Request URL : https://fanyi.baidu.com/sug
—— 請求網址Request Method : POST
—— 請求方法,POST 請求方法的請求參數放在 Form Data 中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
—— 用戶代理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,一切完美解決!網站
等等,真的就這樣結束了嗎?加密
能夠看到,上面的代碼雖然能夠完美翻譯中文和英文,可是卻不能翻譯句子!
這可怎麼辦呀?別急,不是還有兩個數據包沒有分析嘛,再看看還有沒有其它辦法吧
① 打開 v2transapi 數據包的 Preview 選項卡查看響應結果,這裏面居然也有咱們須要的翻譯結果
② 接下來,咱們仍是打開 v2transapi 數據包的 Headers 選項卡查看請求數據,其基本信息以下:
Request URL : https://fanyi.baidu.com/v2transapi
—— 請求網址Request Method : POST
—— 請求方法,POST 請求方法的請求參數放在 Form Data 中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
—— 用戶代理query : 你好
—— 翻譯的內容from : zh
—— 翻譯內容的語言類型,zh 表明中文,設置爲 auto 可自動檢測to : en
—— 翻譯結果的語言類型,en 表明英文,設置爲 auto 可自動檢測sign
和 token
:加密參數唉,只想簡簡單單爬個翻譯,居然還要涉及密碼破解,沒辦法,只好請教百度了
一查才知道,原來百度翻譯有一個公開的 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 選項卡查看請求數據,其基本信息以下:
Request URL : http://fanyi.youdao.com/translate_o
—— 請求網址Request Method : POST
—— 請求方法,POST 請求方法的請求參數放在 Form Data 中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
—— 用戶代理i: 你好
—— 翻譯的內容doctype : json
—— 數據類型,指定爲 JSONfrom : AUTO
—— 翻譯內容的語言類型,自動檢測to : AUTO
—— 翻譯結果的語言類型,自動檢測sign
和 salt
:加密參數和百度翻譯的很相似,都設置了加密參數,怎麼辦?也和百度翻譯相似,修改一下請求地址就好
話很少說,直接放代碼:
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)
效果演示:
【爬蟲系列相關文章】