[PythonのWebクローラーの文書化D:01] - JSが暗号化を混同

簡単な紹介

後に、データのクロール静的なページに次の学習コースを学びます動的なページをクロールデータ。

  • 動的ページとは何ですか?

    あなたは通常、ブラウザに表示されたページのデータを見ることができますが、要求を使用して得られた結果ではありませんでした:時々 、私たちは、結果がブラウザで見られるとは異なる場合があり、ページをクロールしてからの時間を要求します。これは、すべての取得を要求するためにされ、生のHTMLドキュメント、およびブラウザのページがあり、生成されたデータを処理した後、結果はJavaScript、これらのデータの多くの源がある、それはHTMLに含まれていてもよい、Ajaxを介してロードすることができます具体的なアルゴリズムとJavaScriptが発生した後の文書は、それであってもよいです。

これを通してBenpian文書化クロールJavaScriptを混同は暗号化されたレンダリングするページを

ストーリーサイト適切な方法翻訳:http://fanyi.youdao.com/

問題を発見

  • この方法は、一般的に爬虫類を構築します
  1. オープンChromeデベロッパーツール、ページを更新し、ページ解析
    ここに画像を挿入説明

    「孟新しい」クリック・翻訳、XHR右列を入力し、要求XHR後にデータを入力し、ビューが表示されますクリックしてください。
    POSTリクエストのアドレスは次のとおりです。http://fanyi.youdao.com/translate_o smartresult = dictの& ?smartresult =ルール
    過去のリクエストパラメータで再び見て何ですか?

    ここに画像を挿入説明

    OK!どこでこのパラメータは、我々はコンテンツを翻訳するために必要なものです。その後直接リクエストを構築するために必要なリクエストヘッダリクエストとパラメータをコピーします。

  2. リクエストリクエストの構築

    headers = {
        "Accept": "application/json, text/javascript, */*; q=0.01",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Cookie": "[email protected]; JSESSIONID="
                  "aaaBxpJhsD9bZgfYbsJax; OUTFOX_SEARCH_USER_ID_NCOO=2138649720.2208343;"
                  " ___rl__test__cookies=1581141334922",
        "Referer": "http://fanyi.youdao.com/",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                      "(KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
    }
    url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
    form_data = {
        "i": '萌新',
        "from": "AUTO",
        "to": "AUTO",
        "smartresult": "dict",
        "client": "fanyideskweb",
        "salt": '15811630953552',
        "sign": '95f6b7ff43ba04c257097dabd115645e',
        "ts": '1581163095355',
        "bv": 'd6c3cd962e29b66abe48fcb8f4dd7f7d',
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "action": "FY_BY_CLICKBUTTION"
    }
    
    response = requests.post(url=url, headers=headers, data=form_data)
    print(response.text)
    

    実行結果:

    ここに画像を挿入説明

    エラーコードを返されました!

問題を分析

  • 我々は異なる翻訳をしようとすると、私たちは、BVが変わる、TS、パラメータは、塩という看板を見つけました。そして、思考の点でのパラメータは、それを変更する方法ですか?

    ここに画像を挿入説明
    ここに画像を挿入説明

  • JSファイルが見つかりました。

    此时发现这个数据请求它指向 fanyi.min.js:1 这个js文件,我们点击这个js文件

    ここに画像を挿入説明

    出现这个界面,一堆的JavaScript代码,看也看不懂,我们点击左下角的{}让它展开。

    ここに画像を挿入説明

  • 使用chrome的打断点功能

    方框处添加之前数据请求的POST地址:http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
    然后,重新点击翻译按钮,断点成功屏幕会变为一半为灰色。 发现,行号重新定位在了7570行,展开右边 Call Stack,点击其中的
    t.translate发现有我们需要的参数。

    ここに画像を挿入説明
    ここに画像を挿入説明
    ここに画像を挿入説明

  • 继续深入

    将鼠标放入generateSaltSign上面,出现了如图所示的链接,点击跳转至8363行。

    ここに画像を挿入説明

  • 此时我们就找到了需要的参数salt、sign、ts、bv的源头。

    鼠标点击8363行,出现蓝色的标记即为打上一个断点。然后点击上方图中所示按钮再点击一下翻译按钮

    ここに画像を挿入説明
    ここに画像を挿入説明

    通过上面的操作,我们找出了4个参数的源头,正是通过上图中的JavaScript代码来计算出来的。下面就用python来构造这4个参数

解决问题

  • 参数:ts(JavaScript代码中是这样的:r = “” + (new Date).getTime())
def get_ts():
    ts = str(time.time() * 1000)
    return ts
  • 参数:bv(JavaScript代码中是这样的:t = n.md5(navigator.appVersion))
def get_bv():
    appVersion = "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
    m = hashlib.md5()
    m.update(appVersion.encode("utf-8"))
    bv = m.hexdigest()
    return bv
  • パラメータ:塩(JavaScriptコードがあるようにI = R +のparseInt(10 * Math.random()、10))
def get_salt():
    salt = str(time.time() * 1000) + str(random.random() * 10)
    return salt
  • パラメータ:符号(;)n.md5( "fanyideskweb" + E + I + "@ TjのN5 N%A-rKaT5fb [グレイ?" JavaScriptコードは、そのようなものです)
def get_sign(myinput):
    a = "fanyideskweb"
    b = myinput
    c = get_salt()
    d = "n%A-rKaT5fb[Gy?;N5@Tj"
    str_data = a + b + c + d

    m = hashlib.md5()
    m.update(str_data.encode("utf-8"))
    sign = m.hexdigest()
    return sign
  • 完全なコード:
import requests
import time
import json
import hashlib
import random


def get_ts():
    ts = str(time.time() * 1000)
    return ts


def get_bv():
    appVersion = "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
    m = hashlib.md5()
    m.update(appVersion.encode("utf-8"))
    bv = m.hexdigest()
    return bv


def get_salt():
    salt = str(time.time() * 1000) + str(random.random() * 10)
    return salt


def get_sign():
    a = "fanyideskweb"
    b = "萌新"
    c = get_salt()
    d = "n%A-rKaT5fb[Gy?;N5@Tj"
    str_data = a + b + c + d

    m = hashlib.md5()
    m.update(str_data.encode("utf-8"))
    sign = m.hexdigest()
    return sign


def get_request():
    headers = {
        "Accept": "application/json, text/javascript, */*; q=0.01",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Cookie": "[email protected]; JSESSIONID="
                  "aaaBxpJhsD9bZgfYbsJax; OUTFOX_SEARCH_USER_ID_NCOO=2138649720.2208343;"
                  " ___rl__test__cookies=1581141334922",
        "Referer": "http://fanyi.youdao.com/",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                      "(KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
    }
    url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
    form_data = {
        "i": '萌新',
        "from": "AUTO",
        "to": "AUTO",
        "smartresult": "dict",
        "client": "fanyideskweb",
        "salt": get_salt(),
        "sign": get_sign(),
        "ts": get_ts(),
        "bv": get_bv(),
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "action": "FY_BY_CLICKBUTTION"
    }

    response = requests.post(url=url, headers=headers, data=form_data)
    print("翻译结果是:" + str(json.loads(response.text)['translateResult'][0][0]['tgt']))


if __name__ == '__main__':
    get_request()

スプレッド

今、私たちはこれらのパラメータの法則を見つけることができ、我々は実行可能な.exeファイルにパッケージ化することができ、翻訳ソフトウェア、使用周囲に株式学習交流に小さなパートナーを作ります!
参考:Pythonは実行可能ファイルに簡単な方法の.EXEファイルをの.pyます

リリース5元の記事 ウォンの賞賛1 ビュー180

おすすめ

転載: blog.csdn.net/Dchanong_/article/details/104227315