python爬蟲-有道翻譯(js分析)

網絡爬蟲,是一個自動提取網頁的程序,它為搜索引擎從萬維網上下載網頁,是搜索引擎的重要組成。但是當網絡爬蟲被濫用后,互聯網上就出現太多同質的東西,原創得不到保護。于是,很多網站開始反網絡爬蟲,想方設法保護自己的內容。 ------摘自百度百科

本文以有道翻譯為例作為講解,使用的 python 3.5.2 版本 ,涉及到反爬蟲手段有 sign簽名、時間戳,逆向解析 js 來確定簽名算法。

有道翻譯分析

http://fanyi.youdao.com/ (感謝有道!)

1、抓包分析
  • 觀察后發現有道是在輸入關鍵字翻譯后通過發起ajax請求來獲得json數據,翻譯結果在json響應中。

  • 首先打開有道翻譯的網址和瀏覽器的開發者工具(這里使用chrome),把之前加載的包清空,然后有道網頁來獲取包。

  • 查看后可以看到剛開始 ajax 請求為空,同時加載了一堆js文件。


    開發者工具抓包
  • 輸入一個需要翻譯的詞,如:china ,點擊翻譯,再用開發者工具查看,出現一個ajax請求,從 response 分析就是得到了翻譯結果的json數據


    ajax請求
  • 這時需要分析ajax 請求包,查看請求的信息,發現這是一個post請求,可以看到post的表單數據和url,多查詢幾次可以發現表單數據中只有 salt 和 sign 兩個字段是變化的,所以我們要找到這兩個字段是構建的算法,從經驗來看 salt 字段很像一個時間戳的變換,這需要進一步驗證。


    分析請求
  • 接下來到所有的 js 文件中查找 ajax 請求的源碼以及構建 form data 的算法。最后查到 是在 fanyi.js 文件中進行的請求。


    查找發送ajax的js
  • 把 fanyi.js 文件源碼復制到編輯器中,使用格式化插件格式化一下,得到便于我們查看的格式源碼,這樣更便于分析。于是找到了以下的內容,有了這些源碼就可以分析了,salt 的確是時間戳,后面加了隨機數,sign 是幾個數相加后進行 md5 加密得到的:


    分析js源碼
2、構建數據,發起請求

有了以上的數據,我們就可以開始構建請求了,做一個使用有道翻譯這個 api 進行翻譯的小程序,這里有一個要注意的地方,請求中獲取的url 需要去除 “_o” :

http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&sessionFrom=

代碼如下:

import random
import requests
import time
import hashlib
import json
 
 
class YouDaoTrans(object):
 
    def __init__(self, keyword):
        self.url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&sessionFrom='
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36'
        }
        self.keyword = keyword
        self.form_data = {
            "i": keyword,
            "from": "AUTO",
            "to": "AUTO",
            "smartresult": "dict",
            "client": "fanyideskweb",
            "salt": self.get_salt(),
            "sign": "",
            "doctype": "json",
            "version": "2.1",
            "keyfrom": "fanyi.web",
            "action": "FY_BY_CLICKBUTTION",
            "typoResult": "false"
        }
 
    # js的代碼: f = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10)),
    # 通過13位的時間戳加上一個隨機的個位數
    # python 中的時間戳是 10位加小數點,可以乘以 1000 取整
    def get_salt(self):
        # 獲取時間戳
        timestamp = time.time()
        # 生成salt
        salt = int(timestamp*1000) + int(random.random()*10)
        return salt
 
    # var g = n.md5(u + d + f + c);
    # sign 通多幾個數相加然后進行 md5 加密
    def get_sign(self):
        u = self.form_data['client']
        d = self.form_data['i']
        f = self.form_data['salt']
        c = "rY0D^0'nM0}g5Mm1z%1G4"
 
        str_data = u + str(d) + str(f) + c
 
        # md5加密
        m = hashlib.md5()
        m.update(str_data.encode('utf-8'))
        sign = m.hexdigest()
 
        return sign
 
    # 翻譯過程
    def translate(self):
        response = requests.post(self.url, data=self.form_data, headers=self.headers)
        dict_result = json.loads(response.content)
        print(dict_result['translateResult'][0][0]['tgt'])
 
    # 開始運行
    def start(self):
        self.form_data['sign'] = self.get_sign()
        self.translate()
 
 
if __name__ == '__main__':
    while True:
        keyword = input('請輸入要翻譯的內容, 輸入 need-quit 退出:')
        if keyword == 'need-quit':
            break
        youdao = YouDaoTrans(keyword)
        youdao.start()

個人博客:python爬蟲-有道翻譯(js分析)

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容