1. 程式人生 > >【python54--爬蟲2】

【python54--爬蟲2】

1、有道翻譯

 
 
'''
|-- 程式碼思路解析:
|-- 1、拿到網址首先檢視network內Headers的:Request URL;User-Agent;From Data,這幾個就是程式碼所需要的url地址和介面所需要傳入的引數
|-- 2、編寫程式碼:url,引數data放到一個字典內:data={},把From Data內的資料都拷貝到程式碼中並變成引數陣列格式:data['smartresult']= 'dict'
|-- 3、由於有道有反爬蟲的機制,所以需要做進一步的處理:
|--     1)、未反爬蟲處理前,報:{"errorcode":50}
|--     2)、開啟network,傳送兩次請求,檢視From Data,發現只有三個地方資料有變化:i,salt,sign(i:需要進行翻譯的字串如:塵封最帥;salt:加密
|--         用到的鹽,這個是破解反爬蟲的關鍵點;sign:簽名字串,也是破解反爬蟲的關鍵點)
|--     3)、檢視網頁原始碼,查詢所有js檔案,我們找到fanyi.js,然後點選這個檔案,跳轉到原始檔中,全部複製此程式碼到http://tool.chinaz.com/Tools/jsformat.aspx中,點選格式化
|--         然後把格式化的程式碼複製出來,黏貼到subline內,然後搜尋salt,找到相關程式碼:function(e, t) {
    var n = e("./jquery-1.7");
    e("./utils");
    e("./md5");
    var r = function(e) {
        var t = n.md5(navigator.appVersion),
        r = "" + (new Date).getTime(),
        i = r + parseInt(10 * Math.random(), 10);
        return {
            ts: r,
            bv: t,
            salt: i,
            sign: n.md5("fanyideskweb" + e + i + "
[email protected]
{h02_BIEe]$P^nG") } }; |-- 4)、分析這段程式碼發現:sign由四個字串拼接而成:fanyideskweb e i [email protected]{h02_BIEe]$P^nG; e :代表需要翻譯的字串 r :代表獲取系統的時間戳 i :代表r的時間戳加上0-10的隨機字串 |-- 5)、通過以上4步,就知道了salt和sign的生成原理,這樣就可以寫python打程式碼來對接他的介面了 |-- 4、對資料進行編碼處理 |-- 5、建立一個request物件,把url和data傳進去,並且使用POST請求 |-- 6、開啟這個請求 |-- 7、讀取返回來的資料 |-- 8、把返回的json字串解析成字典 |-- 9、不採用['translateResult'][0][0]['tgt']這種格式來翻譯結果:{'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 0, 'translateResult': [[{'src': '塵封最帥', 'tgt': 'Dusty the most handsome'}]]} [0] :代表去掉[[{'src': '塵封最帥', 'tgt': 'Dusty the most handsome'}]]}中第一個[]和第二個[0] ['tgt'] :代表直接列印輸出:tgt的結果 |-- 10、採用['translateResult'][0][0]['tgt']這種格式翻譯的結果:翻譯的結果:Dusty the most handsome '''


import
urllib.request import urllib.parse import json import random import time import hashlib #使用者輸入翻譯的內容 content = input('請輸入需要翻譯的內容:') #連線url地址 url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' #傳送給伺服器請求的資料 data = {} #破解反爬蟲的引數 u = 'fanyideskweb' c = '[email protected]
{h02_BIEe]$P^nG
' e =content i =str(int(time.time()*1000)+random.randint(1,10)) sign = hashlib.md5((u+e+i+c).encode('utf-8')).hexdigest() #此部分資料來源於:FromData data['i']= content data['from']= 'AUTO' data['to']= 'AUTO' data['smartresult']= 'dict' data['client']= 'fanyideskweb' data['salt']= '15439012305959' data['sign']= 'ba81b8cb1c6dc64c253bf6d250cbc09b' data['ts']= '1543901230595' data['bv']= '6d37ec4625573a83fa9ca0cb1e144ce5' data['doctype']= 'json' data['version']= '2.1' data['keyfrom']= 'fanyi.web' data['action']= 'FY_BY_CLICKBUTTION' data['typoResult']= 'false' #對資料進行編碼處理 data = urllib.parse.urlencode(data).encode('utf-8') #建立一個request物件,把url和data傳進去,並且使用POS請求 request = urllib.request.Request(url = url,data=data,method='POST') #開啟請求 reponsend =urllib.request.urlopen(request) #讀取返回來的資料 html = reponsend.read().decode('utf-8') #把返回來的json字串解析成字典 line = json.loads(html) #print(line) #獲取翻譯結果 print('翻譯的結果:%s'%(line['translateResult'][0][0]['tgt']))
參考文件:https://blog.csdn.net/ISxiancai/article/details/79349184
     https://blog.csdn.net/nunchakushuang/article/details/75294947