吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5273|回复: 23
上一主题 下一主题
收起左侧

[Python 转载] 通过python爬虫完成百度翻译

[复制链接]
跳转到指定楼层
楼主
牵手丶若相惜 发表于 2019-11-22 13:19 回帖奖励
本帖最后由 牵手丶若相惜 于 2020-11-12 17:04 编辑

仅限学习 !仅限学习 !!仅限学习!!!
本人写了两种 一种是给小白学习 另一种是给有点基础的来学习
第一种:只能实现中英互译
第二种:理论所有翻译都能实现 但是我只写了中译英 有兴趣可以自己来补全 通过修改 from 和 to来完成
               例如 "from":"en","to":"zh" 就是英译中,"from":"zh","to":"en"就是
————————————————————————————
第一种 (小白版):百度翻译没有对这个叫做sug的url做任何的反爬虫机制
[Python] 纯文本查看 复制代码
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也改成你自己的 代码如下(不会改的 还是玩第一种去吧)
[Python] 纯文本查看 复制代码
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, 下载次数: 2)

第二种方法爬取的位置

第二种方法爬取的位置

捕获3.PNG (79.5 KB, 下载次数: 1)

第一种方法爬取的地址

第一种方法爬取的地址

捕获4.PNG (66.7 KB, 下载次数: 0)

第二种方法加密的两个东西

第二种方法加密的两个东西

免费评分

参与人数 3吾爱币 +3 热心值 +3 收起 理由
Futuresing + 1 + 1 用心讨论,共获提升!
韬. + 1 + 1 我很赞同!
王星星 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
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, 2024-11-16 17:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表