【Python】【进阶篇】十七、Python爬虫实现实时翻译

news2024/9/29 3:30:28

目录

  • 十七、Python爬虫实现实时翻译
    • 17.1 JS代码slat与sign
    • 17.2 Python代码表示参数
    • 17.3 完整程序实现

十七、Python爬虫实现实时翻译

YD翻译是以异步方式实现数据加载的,要实现数据抓取,其过程极其繁琐。

上一节《Python爬虫的浏览器实现抓包》,通过浏览器上控制台抓包,我们得知了 POST 请求的参数以及相应的参数值,并发现以下了一定规律:salt、sign、lts 总是变化的,而 bv 等其他参数是不变化的。

如果想要实现实时地抓取,就需要将 salt 和 sign 转换为 用 Python 代码表示的固定形式。最后将所有参数放入到
requests.post() 中,如下所示:

    response = requests.post(url,data=data,headers=headers)

其中 data 是字典格式参数,它用来构建 POST 请求方法的参数和参数值。

17.1 JS代码slat与sign

salt、sign 加密有两种实现方式:一种是通过前端 JS实现,另一种是后台服务器生成加密串,并在返回响应信息时,将加密信息交给接浏览器客户端。但是,通过预览响应信息可知,并没有涉及 salt、sign的信息,因此可以排除这种方法。
在这里插入图片描述

预览响应信息

那么要如何找到关于salt、sign 的 JS 代码呢?此时就要用到另外一个调试工具选项卡—— JS。如下图所示:

在这里插入图片描述

js文件

点击上图所示的搜索按钮来检索 JS 代码,输入 “salt”,结果如图所示:

在这里插入图片描述

找到相关js文件

或者您也可以使用 Sources 选项卡将 fanyi.min.js 文件中的 JS 代码格式化输出,并使用 Ctrl+F 找到相应的 "salt"位置,如下图所示:

在这里插入图片描述

Sources选项卡应用

提示:将所有 JS 代码 copy
下来,通过站长工具也可以实现格式化输出。

通过上述方法就找到了 salt 与 sign(两个参数项是在一起的)JS 代码,如下所示:

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 + "Tbh5E8=q6U3EXe+&L[4c@")
    }
};

注意,找到上述代码是解决本节问题的关键,大家一定要要掌握方法。

17.2 Python代码表示参数

通过上述 JS 代码的简单分析可知: r 变量等同于 lts,salt 变量等同于 i,而 sign 是一个经过 md5 加密的字符串。接下来使用
Python 代码来表示上述参数,如下所示:


#lts毫秒时间戳
str(int(time.time()*1000))

#salt, lts+从0-9的随机数
lts+str(random.randint(0,9))

#sign加密字符串
from hashlib import md5
#word为要翻译的单词等同于js代码中的"e"
string = "fanyideskweb" + word + salt + "Tbh5E8=q6U3EXe+&L[4c@"
s = md5()
#md5的加密串必须为字节码
s.update(string.encode())
#16进制加密
sign = s.hexdigest()

17.3 完整程序实现

完整代码如下所示:

#coding:utf8
import random
import time
from hashlib import md5
import requests


class YoudaoSpider(object):
    def __init__(self):
        # url一定要写抓包时抓到的POST请求的提交地址,但是还需要去掉 url中的“_o”,
        # “_o”这是一种url反爬策略,做了页面跳转,若直接访问会返回{"errorCode":50}
        self.url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
        self.headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
        }
    # 获取lts时间戳,salt加密盐,sign加密签名
    def get_lts_salt_sign(self,word):
        lts=str(int(time.time()*1000))
        salt=lts+str(random.randint(0,9))
        string = "fanyideskweb" + word + salt + "Tbh5E8=q6U3EXe+&L[4c@"
        s=md5()
        s.update(string.encode())
        sign=s.hexdigest()
        print(lts,salt,sign)
        return lts,salt,sign

    def attack_yd(self,word):
        lts,salt,sign=self.get_lts_salt_sign(word)

        #构建form表单数据
        data={
            "i": word,
            "from": "AUTO",
            "to": "AUTO",
            "smartresult": "dict",
            "client": "fanyideskweb",
            "salt": salt,
            "sign": sign,
            "lts": lts,
            "bv": "cda1e53e0c0eb8dd4002cefc117fa588",
            "doctype": "json",
            "version": "2.1",
            "keyfrom": "fanyi.web",
            "action": "FY_BY_REALTlME"
        }
        #使用 reqeusts.post()方法提交请求
        res = requests.post(
            url=self.url,
            data=data,
            headers=self.headers,

        )
        # res.json() 将json格式的字符串转为python数据类型
        # 客户端与服务器数据交互以json字符串传递,因此需要将它转换为python数据类型
        html=res.json()
        print(html)
        # 查看响应结果response  html:{"translateResult":[[{"tgt":"hello","src":"你好"}]],"errorCode":0,"type":"zh-CHS2en"}
        result=html["translateResult"][0][0]["tgt"]
        print('翻译结果:', result)

    def run(self):
        try:
            word=input('请输入要翻译的单词:')
            self.attack_yd(word)
        except Exception as e:
            print(e)

if __name__ == '__main__':
    spider=YoudaoSpider()
    spider.run()

输出结果:

请输入要翻译的单词:大家好,这里是C语言中文网Python爬虫教程

lts,salt,sign 输出结果:
1616472092090 16164720920902 fcc592626aee42e1067c5195cf4c4576

html 响应内容:
{'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 25, 'translateResult': [[{'src': '大家好,这里是C语言中文网Python爬虫教程', 'tgt': 'Everybody is good, here is the Chinese Python crawler C language tutorial'}]]}

翻译结果: Everybody is good, here is the Chinese Python crawler C language tutorial

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429668.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用LeafLet叠加Geoserver wms图层到已有底图的方法

背景 随着现代城市交通建设的飞速发展,各个城市的地铁路线和地铁站点也是越来越多。地铁极大的方便了广大人民的交通出行。作为Giser,经常会遇到需要将一份shp数据在地图上展示,甚至需要在网页端进行浏览的需要。把shp这种空间矢量数据进行we…

数据库笔记Ch04----概念数据库的设计(1)

前三章我们学习了如何使用DBMS我们学会了增删改查,插入数据库,创建视图... 这一章是我们的数据库刚刚建立,只有一个需求,需要根据用户的需求来创建数据库,每个表有哪些属性,参照关系是什么,主键…

一.Jetpack全套

Jetpack全套一.Jetpack介绍1.特性:2.分类:二.应用架构三.LifeCycle:1.简介2.简单使用3.实战:Dialog内存泄漏四.VideModel1.介绍2.简单使用3.AndroidViewModel使用4.使用viewmodel实现fragment直接数据共享五.LiveData1.介绍2.常用方法3.使用场…

车载 OTA技术概念

1 OTA技术概念 随着高级辅助驾驶的发展和自动驾驶的引入,汽车变得越来越智能,这些智能汽车被软件控制,装有巨量的软件程序,当出现一个软件程序问题或者更新时,如果按照传统的解决方式,那都将是一项很繁重的…

【深度学习】基于Hough变化的答题卡识别(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳座右铭&#…

云开发--实现发送邮件+短信+链接跳转小程序功能

目录 1、小程序实现发送邮件 准备一个qq邮箱,并启动SMTP服务 确定小程序云开发环境,并新建云函数 2、小程序实现发送短信 确定应用 确定签名 确定模板 编写云函数-发送短信 3、链接跳转小程序 H5 配置 生成 URL Link 学习记录: …

【获奖案例巡展】科技向善之星——中航电梯5G+大数据管理平台

为表彰使用大数据、人工智能等基础软件为企业、行业或世界做出杰出贡献和巨大创新的标杆项目,星环科技自2021年推出了“新科技 星力量” 星环科技科技实践案例评选活动,旨在为各行业提供更多的优秀产品案例,彰显技术改变世界的力量&#xff0…

网络编程(python)

文章目录一、网络基础(IP,端口,TCP等)二、TCP网络应用可开发流程三、HTTP协议和静态Web服务器四、搭建Python自带静态Web服务器一、网络基础(IP,端口,TCP等) IP地址:标识…

企业的数据中台到底指的是什么?_光点科技

随着数据技术的不断发展和企业数据应用的广泛应用,越来越多的企业开始将数据中台作为数字化转型的核心战略之一。那么,企业的数据中台到底指的是什么呢? 数据中台是一种以数据为核心的企业数字化转型架构,旨在通过数据的汇聚、整合…

Lego- 美团接口自动化测试实战(详细解析)

目录:导读 一、概述 1.1 接口自动化概述 1.2 提高 ROI 1.3 Lego 的组成 二、脚本设计 2.1 Lego 的做法 2.2 测试脚本 2.3 配置文件 三、用例设计 3.1 一些思考 3.2 Lego 接口自动化测试用例 3.3 参数化 3.4 前后置动作 3.5 执行各部分 四、网站功能 …

软件测试员----面试,你准备好了么?

最近有机会做一些面试工作,主要负责面试软件测试人员招聘的技术面试。 之前一直是应聘者的角色,经历了不少次的面试之后,多少也积累一点面试的经验,现在发生了角色转变。初次的面试就碰到个工作年限比我长的,也没有时间…

c++11 标准模板(STL)(std::stack)(四)

定义于头文件 <stack> template< class T, class Container std::deque<T> > class stack;std::stack 类是容器适配器&#xff0c;它给予程序员栈的功能——特别是 FILO &#xff08;先进后出&#xff09;数据结构。 该类模板表现为底层容器的包装…

Spark学习——DataFrame清洗HDFS日志并存入Hive中

目录 1.开启Hadoop集群和Hive元数据、Hive远程连接 2.配置 3.读取日志文件并清洗 4.单独处理第四列的数据——方法一&#xff1a; 5.单独处理第四列的数据——方法二&#xff1a; 6.单独处理第四列的数据——方法三&#xff1a; 7.数据清洗结果展示 8.存入Hive中 9.…

The 2021 China Collegiate Programming Contest (Harbin) D. Math master

题目链接 题解 2632^{63}263大概是101910^{19}1019那么一共有19位需要讨论, 每一个位数各有保留和删除两种状态, 全部状态就是2182^{18}218种 因为每一位数都有两种状态, 使用二进制数表示每个状态, 正好能全部表示, 在二进制位数下1表示保留, 0表示删除(反过来也一样) 使用二…

分布式版本控制工具 —— Git

一、Git 基本介绍 1.1 相关概念 1️⃣ 首先&#xff0c;我们要知道什么是Git&#xff1f; Git 是一个免费、开源的版本控制系统&#xff0c;它可以有效地跟踪文件的更改&#xff0c;协调多人在同一个项目上的开发&#xff0c;以及管理不同版本的代码。 Git 最初是由 Linus …

微服务架构下认证和鉴权理解

认证和鉴权 从单体应用到微服务架构&#xff0c;优势很多&#xff0c;但是并不是代表着就没有一点缺点了。 微服务架构&#xff0c;意味着每个服务都是松散耦合的。因此&#xff0c;作为软件工程师和架构师&#xff0c;我们在分布式架构中面临着安全挑战。微服务对外开放的端…

PLE详解

具体的实践中&#xff0c;我们主要参考了腾讯的PLE(Progressive Layered Extraction)模型&#xff0c;PLE相对于前面的MMOE和ESMM&#xff0c;主要解决以下问题&#xff1a; 多任务学习中往往存在跷跷板现象&#xff0c;也就是说&#xff0c;多任务学习相对于多个单任务学习的…

Linux/Ubuntu服务自启动原理剖析及三种实现方式

面向Linux系统&#xff0c;并非只是Ubuntu&#xff1b;系统版本不同&#xff0c;配置上可能有所不同。 1、自启动的原理剖析 1.1、 运行等级 Linux分了7个运行等级&#xff0c;分别用数字0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6表示…

【Python】【进阶篇】十八、Python爬虫获取动态加载数据

目录十八、Python爬虫获取动态加载数据18.1 确定网站类型18.2 影片详情信息18.3 影片总数量18.4 影片类型与类型码18.5 编写完整程序十八、Python爬虫获取动态加载数据 如何获取电影“分类排行榜”中的电影数据&#xff08;电影&#xff09;&#xff0c;比如输入“剧情”则会输…

用EasyX图形库画一个哆啦A梦

继续说图形库&#xff0c;加一点实战用图形画图&#xff08;用来巩固代码&#xff09;&#xff1a; rectangle这个函数 四个参数&#xff0c;左上角坐标的x,y值&#xff0c;右下角坐标的x,y值&#xff1b;因为只要有两个点&#xff0c;就可以以它们的横坐标之差为长&#xff…