吾愛破解 - LCG - LSG |安卓破解|病毒分析|破解軟件|www.2dw61quu.icu

 找回密碼
 注冊[Register]

QQ登錄

只需一步,快速開始

搜索
查看: 1188|回復: 23
上一主題 下一主題

[Python] 通過python爬蟲完成百度翻譯

[復制鏈接]
跳轉到指定樓層
樓主
牽手丶若相惜 發表于 2019-11-22 13:19 回帖獎勵
本帖最后由 牽手丶若相惜 于 2019-11-22 17:45 編輯

僅限學習 !僅限學習 !!僅限學習!!!
本人寫了兩種 一種是給小白學習 另一種是給有點基礎的來學習
第一種:只能實現中英互譯
第二種:理論所有翻譯都能實現 但是我只寫了中譯英 有興趣可以自己來補全 通過修改 from 和 to來完成
               例如 "from":"en","to":"zh" 就是英譯中,"from":"zh","to":"en"就是
————————————————————————————
第一種 (小白版):百度翻譯沒有對這個叫做sug的url做任何的反爬蟲機制
import requests

# 瀏覽器代{過}{濾}理
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36"
}

Unknown = input("請輸入你要翻譯的內容:")
url = "https://fanyi.baidu.com/sug"
data = { "kw":Unknown }
values = requests.post(url,data=data,headers=headers).json()
x = 1
# 判斷字符串是否包含中文
for i in Unknown:
    # 中文在正則里的范圍是\u4e00-\u9fff
    if u'\u4e00' <= i <= u'\u9fff':
        x = 0
        break

# 英譯中 和 中譯英 輸出的不一樣 所有兩種輸出方法
if x!=0:
    print(values["data"][0]["v"])
else:
    # 因為中文的翻譯輸出的英文會包含中文的拼音 所以這里處理掉了
    value = values["data"][0]["v"].split("]")[1:]
    print(value[0].replace(" ",""))


——————————————————


第二種(有點基礎版):這個地址做了兩個反爬蟲機制
               一個是通過sign(動態的):可以通過js斷點找到這個算法 然后把算法復制下來加載到python中,也可以分析算法在你的                  代碼中實現,反正我復制的,然后用execjs加載的 下載execjs庫 在cmd里用 pip install PyExecjs
               一個是token(一個電腦一個):初步估計是通過ip和一些什么東西加密而成 ,有興趣的可以自己研究一下
代碼里的cookie改為你自己的 ,token也改成你自己的 代碼如下(不會改的 還是玩第一種去吧)
import requests
import execjs

# 瀏覽器代{過}{濾}理
header = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36",
    "referer": "https://fanyi.baidu.com/?aldtype=16047",   

# cookie的值為你自己的 我在此沒進行賦值
    "cookie": ""
}

# 全局變量 用來存放data 和 parament
data = {}
parament = {}

# 用來判斷輸入的字符串 是否包含中文
def Judgement_language(Unknown):
    x = 1
    for i in Unknown:
        # 中文在正則里的范圍是\u4e00-\u9fff
        if u'\u4e00' <= i <= u'\u9fff':
            x = 0
            break
    # 包含中文就是中譯英
    if x!=0:
        form = "en"
        to = "zh"
    # 不包含中文則是英譯中
    else:
        form = "zh"
        to = "en"
    return form,to

# 用來獲取sign
def judge_sign(Unknown):
    # 加載js里的算法 計算出sign
    JsData = execjs.compile("""
      function e(r) {
        var i = "320305.131321201"
        var o = r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
        if (null === o) {
            var t = r.length;
            t > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(t / 2) - 5, 10) + r.substr(-10, 10))
        } else {
            for (var e = r.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), C = 0, h = e.length, f = []; h > C; C++)
                "" !== e[C] && f.push.apply(f, a(e[C].split(""))),
                C !== h - 1 && f.push(o[C]);
            var g = f.length;
            g > 30 && (r = f.slice(0, 10).join("") + f.slice(Math.floor(g / 2) - 5, Math.floor(g / 2) + 5).join("") + f.slice(-10).join(""))
        }
        var u = void 0
          , l = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);
        u = null !== i ? i : (i = window[l] || "") || "";
        for (var d = u.split("."), m = Number(d[0]) || 0, s = Number(d[1]) || 0, S = [], c = 0, v = 0; v < r.length; v++) {
            var A = r.charCodeAt(v);
            128 > A ? S[c++] = A : (2048 > A ? S[c++] = A >> 6 | 192 : (55296 === (64512 & A) && v + 1 < r.length && 56320 === (64512 & r.charCodeAt(v + 1)) ? (A = 65536 + ((1023 & A) << 10) + (1023 & r.charCodeAt(++v)),
            S[c++] = A >> 18 | 240,
            S[c++] = A >> 12 & 63 | 128) : S[c++] = A >> 12 | 224,
            S[c++] = A >> 6 & 63 | 128),
            S[c++] = 63 & A | 128)
        }
        for (var p = m, F = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(97) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(54)), D = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(51) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(98)) + ("" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(102)), b = 0; b < S.length; b++)
            p += S,
            p = n(p, F);
        return p = n(p, D),
        p ^= s,
        0 > p && (p = (2147483647 & p) + 2147483648),
        p %= 1e6,
        p.toString() + "." + (p ^ m)
   }
  function n(r, o) {
        for (var t = 0; t < o.length - 2; t += 3) {
            var a = o.charAt(t + 2);
            a = a >= "a" ? a.charCodeAt(0) - 87 : Number(a),
            a = "+" === o.charAt(t + 1) ? r >>> a : r << a,
            r = "+" === o.charAt(t) ? r + a & 4294967295 : r ^ a
        }
        return r
   }
    """).call("e", Unknown)# 給e傳遞參數
    return JsData

# 傳入form,to 和 待翻譯的字符串 和 sign
def data_paraments(language,Unknown,sign):
    # 聲明使用全局變量
    global data,parament
    # post請求url需要的data數據
    data = {
        "from": language[0],
        "to": language[1],
        "query": Unknown,
        "simple_means_flag": "3",
        "sign": sign,        

# 把token修改為自己的 在此沒進行賦值
        "token": ""
    }
    # 地址后面的后綴
    parament = {
        "from": language[0],
        "to": language[1]
    }


if __name__ == '__main__':
    # 待翻譯的內容
    Unknown = input("請輸入你要翻譯的內容:")
    # 獲取form 和 to
    language = Judgement_language(Unknown)
    # 獲取 sign
    sign = judge_sign(Unknown)
    # 傳入參數構造data 和 paraments
    data_paraments(language,Unknown,sign)
    # 請求url
    translates = requests.post(url="https://fanyi.baidu.com/v2transapi", data=data, params=parament,headers=header).json()
    # 提取需要的內容
    translate = translates["trans_result"]["data"][0]["dst"]
    print(translate)

捕獲1.PNG (83.62 KB, 下載次數: 1)

第一種方法爬取的位置

第一種方法爬取的位置

捕獲2.PNG (94.48 KB, 下載次數: 0)

第二種方法爬取的位置

第二種方法爬取的位置

捕獲3.PNG (79.5 KB, 下載次數: 0)

第一種方法爬取的地址

第一種方法爬取的地址

捕獲4.PNG (66.7 KB, 下載次數: 0)

第二種方法加密的兩個東西

第二種方法加密的兩個東西

免費評分

參與人數 3吾愛幣 +3 熱心值 +3 收起 理由
Futuresing + 1 + 1 用心討論,共獲提升!
韜. + 1 + 1 我很贊同!
王星星 + 1 + 1 [email protected]

查看全部評分

發帖前要善用論壇搜索功能,那里可能會有你要找的答案或者已經有人發布過相同內容了,請勿重復發帖。

推薦
smldhz 發表于 2019-11-22 13:26
百度一下爬蟲的意思
推薦
 樓主| 牽手丶若相惜 發表于 2019-11-23 11:26 <
雷晨 發表于 2019-11-22 18:58
大佬你好,請問那種需要邀請碼注冊成會員的那種網站,python能模擬成會員嗎?

不能模擬會員 但是能把會員能看的東西 給爬取下來
3#
txq18363001227 發表于 2019-11-22 13:29
4#
951 發表于 2019-11-22 13:41
這……該怎么說好呢
5#
Hatsune_miku 發表于 2019-11-22 13:46
哪有這么復雜啊。。。而且你這也不是爬蟲
6#
孤獨的老大哥 發表于 2019-11-22 13:48
謝謝分享
7#
XiaoBaizzZ 發表于 2019-11-22 13:54
謝謝分享百度一下爬蟲
8#
王星星 發表于 2019-11-22 14:08
小白  前來學習!學習樓主!
9#
richens 發表于 2019-11-22 14:19
好貼,學習了!
10#
韜. 發表于 2019-11-22 14:20
學習了!!
您需要登錄后才可以回帖 登錄 | 注冊[Register]

本版積分規則 警告:禁止回復與主題無關內容,違者重罰!

快速回復 收藏帖子 返回列表 搜索

RSS訂閱|小黑屋|聯系我們|吾愛破解 - LCG - LSG ( 京ICP備16042023號 | 京公網安備 11010502030087號 )

GMT+8, 2019-12-17 13:32

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表
快手网红