【实战篇】requests库 - 有道云翻译爬虫 【附:代理IP的使用】

目录

  • 〇、引言
  • 一、目标
  • 二、请求参数分析
  • 三、响应分析
  • 四、编写爬虫脚本【隧道代理的使用】

〇、引言

无论是学习工作、旅游出行、跨境电商、日常交流以及一些专业领域都离不开翻译工具的支持。本文就带大家通过爬虫的方式开发一款属于自己的翻译工具~

一、目标

如下的翻译接口:

本接口涉及到多种加密以及编码概念,没有了解或者不是很熟悉的,建议先给
《爬虫工程师必备技术栈——加密解密以及字符编码原理》
这篇文章再仔细看看~

在这里插入图片描述

二、请求参数分析

  1. 分析接口,对比会发现只有sign和mysticTime是变化的,后者也很容易可以看出是13位时间戳。
    在这里插入图片描述
  2. 全局搜索sign,可以定位到如下位置:
    在这里插入图片描述
  3. python还原【很简单的加密,直接上代码】:
 ts = str(int(time.time() * 1000))
 str_sign = f"client=fanyideskweb&mysticTime={ts}&product=webfanyi&key=fsdsogkndfokasodnaso"
 sign = hashlib.md5((str_sign).encode('utf-8')).hexdigest()

三、响应分析

接口的响应是一串乱码,所以要来定位到解密位置,并用python来还原~

  1. 下断点,追到如下是解密的位置:
    在这里插入图片描述

  2. 跳进去:
    在这里插入图片描述
    t是响应数据,是加密过后的,上图是js解密逻辑,使用的AES解密,key和iv都是走的同一加密逻辑,而入参o和n都是固定不变的。

  3. 跳进y函数:
    在这里插入图片描述
    这部分python还原:

import hashlib

# o --> key = 'ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl'
# n --> iv  = 'ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4'


key_md5 = hashlib.md5(('ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl').encode('utf-8')).digest()
iv_md5 = hashlib.md5(('ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4').encode('utf-8')).digest()

print(len(key_md5))   
print(key_md5)

print(len(iv_md5))
print(iv_md5)

  1. 整体python还原:
from Cryptodome.Cipher import AES
import hashlib
import base64
from Cryptodome.Util.Padding import unpad
import time
import requests
import json


def decrypt(decrypt_str):
    key = "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl"
    iv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4"

    key_md5 = hashlib.md5(key.encode('utf-8')).digest()
    iv_md5 = hashlib.md5(iv.encode('utf-8')).digest()
    print('key_md5:', key_md5)
    print('iv_md5:', iv_md5)
    aes = AES.new(key=key_md5, mode=AES.MODE_CBC, iv=iv_md5)

    code = aes.decrypt(base64.urlsafe_b64decode(decrypt_str))
    return unpad(code, AES.block_size).decode('utf8')

四、编写爬虫脚本【隧道代理的使用】

本脚本完全可以直接CV开一个免费的翻译服务,配合使用隧道代理,完全可以满足日百万级翻译任务量!

关于隧道代理,从业这么多年里用过很多家的产品,但对比各家的隧道代理价格和实际测试之后,这里我比较推荐大家使用青果代理IP

  • 青果代理IP免费体验~在这里插入图片描述

整体使用下来的感受:

  1. 响应速度快,隧道代理池里的IP业务成功率高;
  2. 价格确实很便宜,单个IP才0.0014元;
  3. 最重要的一点是可以免费使用任何套餐6小时!

知识点补给站 - 隧道代理:

  • 隧道代理(全球HTTP)是利用高性能主机构建的动态代理服务器,通过将切换IP的操作放到云端,自动管理用户发出的隧道请求,实现云端自动切换IP转发用户请求,简化用户的操作,降低了用户的时间成本;
  • 隧道代理使用简单,开发者接入隧道服务即可,如下示例直接集成到程序中,极大简化了编程的复杂度。
  • 在这里插入图片描述
#coding=utf-8
# __author__ = 孤寒者
import base64
import hashlib
import json
import time

import requests
from Cryptodome.Cipher import AES
from Cryptodome.Util.Padding import unpad
from fake_useragent import UserAgent


def generate_proxy():
    return {
        'http': 'http://{authkey}:{authpwd}@隧道地址',
        'https': 'http://{authkey}:{authpwd}@隧道地址'
    }


def generate_sign_and_timestamp():
    timestamp_13 = str(int(time.time() * 1000))
    str_sign = f"client=fanyideskweb&mysticTime={timestamp_13}&product=webfanyi&key=fsdsogkndfokasodnaso"
    sign = hashlib.md5(str_sign.encode('utf-8')).hexdigest()
    return sign, timestamp_13


def generate_ydy_headers():
    return {
        'Accept': 'application/json, text/plain, */*',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Cookie': 'OUTFOX_SEARCH_USER_ID=-666666@10.125.88.154; OUTFOX_SEARCH_USER_ID_NCOO=1574852965.0963037',
        'Origin': 'https://fanyi.youdao.com',
        'Referer': 'https://fanyi.youdao.com/',
        'User-Agent': UserAgent().random,
        'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',
        'sec-ch-ua-platform': '"Windows"'
    }


def decrypt_response(encrypted_str):
    key = "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl"
    iv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4"

    key_md5 = hashlib.md5(key.encode('utf-8')).digest()
    iv_md5 = hashlib.md5(iv.encode('utf-8')).digest()
    aes = AES.new(key=key_md5, mode=AES.MODE_CBC, iv=iv_md5)

    decrypted_data = aes.decrypt(base64.urlsafe_b64decode(encrypted_str))
    return unpad(decrypted_data, AES.block_size).decode('utf-8')


def ydy_translate(text, source='auto', target='en'):
    sign, timestamp_13 = generate_sign_and_timestamp()

    form_data = {
        'i': text,
        'from': source,
        'to': target,
        'sign': sign,
        'keyid': 'webfanyi',
        'client': 'fanyideskweb',
        'product': 'webfanyi',
        'appVersion': '1.0.0',
        'vendor': 'web',
        'pointParam': 'client,mysticTime,product',
        'mysticTime': timestamp_13,
        'keyfrom': 'fanyi.web',
    }
    response = requests.post(url="https://dict.youdao.com/webtranslate", headers=generate_ydy_headers(),
                             data=form_data, proxies=generate_proxy())
    res_dic = json.loads(decrypt_response(response.text))

    # 翻译不了 / 未被识别的语种
    if res_dic['code'] != 0:
        return '', 'ydy-translate-fail'

    tgt_values_list = [result['tgt'] for result in res_dic['translateResult'][0]]
    res_data = ' '.join(tgt_values_list)
    source_lang = res_dic['type'].split('2')[0]
    return source_lang, res_data


while True:
    wait_text = input('请输入要翻译的文本:')
    detect_source_lang, trans_result = ydy_translate(wait_text)
    print(f'输入文本语言为:{detect_source_lang} - 翻译结果:{trans_result}')


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[ 应急响应靶场实战 ] VMware 搭建win server 2012应急响应靶机 攻击者获取服务器权限上传恶意病毒 防守方人员应急响应并溯源

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

鸿蒙NEXT开发-学生管理系统小案例(基于最新api12稳定版)

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

keepalived + nginx 实现网站高可用性(HA)

keepalive 一、keepalive简介二、实现步骤1. 环境准备2. 安装 Keepalived3. 配置 Keepalived 双机主备集群架构4. 配置 Nginx5. 启动Keepalived6. 测试高可用性7. 配置keepalived 双主热备集群架构 一、keepalive简介 目前互联网主流的实现WEB网站及数据库服务高可用软件包括&a…

Javase——正则表达式

正则表达式的相关使用 public static void main(String[] args) {//校验QQ号 System.out.println("3602222222".matches("[1-9][0-9]{4,}"));// 校验18位身份证号 System.out.println("11050220240830901X".matches("^([0-9]){7,18}…

数据结构与算法 - 基础

本文首发于 个人博客 程序 数据结构 算法 其实很多同学知道数据结构与算法很重要&#xff0c;但是却不明觉厉。 这里我们看一个简单的题&#xff1a; 对自然数从1到100的求和 最简单的设计无非是&#xff1a; void addNum () { int total 0; for (int i 1; i < 1…

【React 轮子】文本溢出后显示展开/收起按钮

/** hooks* 用于文本展示时判断是否展示 展开/收起按钮 &#xff08;包含监听 文本变化/页面尺寸变换&#xff09;* param { string } text 需要展示的文本* param { number } maxLength 文本最大展示行数* param { number } lineHeight 文本行高 (单位 px) */ import React, …

交通工具图像分割系统:全面扶持小白

交通工具图像分割系统源码&#xff06;数据集分享 [yolov8-seg-vanillanet&#xff06;yolov8-seg-C2f-Parc等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global A…

pta题目

1.查询至少生产两种不同的计算机(PC或便携式电脑)且机器速度至少为133的厂商 AC: select distinct(pd.maker) --去重查询 from product pd where pd.type in (个人电脑, 便携式电脑) --题目上要求的&#xff0c;至少一个&#xff0c;in是从里面选择 and --这里也是model其实相…

windows下用CMake构建使用protobuf的应用,编译使用VS2022

最近构建一个使用protobuf的应用&#xff0c;踩了不少坑&#xff0c;在此记录一下 一、编译protobuf protobuf只提供源码&#xff0c;没有编译好的库文件给使用造成一定的障碍&#xff08;差评&#xff09;。所以c应用中使用protobuf的第一步是用cmake对protobuf进行构建。 1.…

计组-主存的分类和编址,随机存取(RAM)和只读(ROM)存储器

随机和只读存储器这2类是有着不同的功能的 像我们的内存就属于随机存取存储器&#xff08;RAM&#xff09;&#xff0c;其特点就是当内存一旦断电时&#xff0c;内存里面的所有数据都将被清除掉&#xff0c;无法保存下来&#xff0c;即一断电信息就会丢失 而ROM在断电后是可以…

【electron+vue3】使用JustAuth实现第三方登录(前后端完整版)

实现过程 去第三方平台拿到client-id和client-secret&#xff0c;并配置一个能够外网访问回调地址redirect-uri供第三方服务回调搭建后端服务&#xff0c;引入justauth-spring-boot-starter直接在配置文件中定义好第一步的三个参数&#xff0c;并提供获取登录页面的接口和回调…

一次线程池使用错误导致的问题

记录一次服务线程数量异常问题的排查过程 背景 通过监控发现一个服务的线程数异常多 同期CPU 内存 网络连接都没有什么异常。 排查 第一个反应就是查看线程栈 "pool-2493-thread-3" #3718833 prio5 os_prio0 tid0x00007f1610041000 nid0x38bff6 waiting on con…

我为何要用wordpress搭建一个自己的独立博客

我在csdn有一个博客&#xff0c;这个博客是之前学习编程时建立的。 博客有哪些好处呢&#xff1f; 1&#xff0c;可以写自己的遇到的问题和如何解决的步骤 2&#xff0c;心得体会&#xff0c;经验&#xff0c;和踩坑 3&#xff0c;可以转载别人的好的技术知识 4&#xff0c;宝贵…

java毕业设计之基于Bootstrap的常州地方旅游管理系统的设计与实现(springboot)

项目简介 基于Bootstrap的常州地方旅游管理系统的设计与实现有下功能&#xff1a; 基于Bootstrap的常州地方旅游管理系统的设计与实现的主要使用者分为用户功能模块和管理员功能模块两大部分&#xff0c;用户可查看景点信息、景点资讯等&#xff0c;注册登录后可进行景点订票…

面试经典 150 题:189、383

189. 轮转数组 【参考代码】 class Solution { public:void rotate(vector<int>& nums, int k) {int size nums.size();if(1 size){return;}vector<int> temp(size);//k k % size;for(int i0; i<size; i){temp[(i k) % size] nums[i];}nums temp; }…

mysql--多表查询

一、联合查询 作用&#xff1a;合并结果集就是把两个select语句的查询结果合并到一起&#xff01; 合并结果集有两种方式&#xff1a; UNION&#xff1a;合并并去除重复记录&#xff0c;例如&#xff1a;SELECT * FROM t1 UNION SELECT * FROM t2&#xff1b; UNION ALL&a…

什么是严肃游戏,严肃游戏本地化的特点是什么?

“严肃游戏”是一种交互式数字体验&#xff0c;不仅用于娱乐&#xff0c;还用于教育、培训或解决问题。与主要关注乐趣和参与度的传统游戏不同&#xff0c;严肃游戏的目标不仅仅是娱乐&#xff0c;比如教授特定技能、模拟现实生活场景或提高对重要问题的认识。它们用于医疗保健…

ADI常规SHARC音频处理器性能对比

1、 ADSP-2156x:是基于SHARC+ DSP架构的单核32位/40位/64位浮点处理器,不仅具有灵活的音频连接性和性能可扩展性,还提供多个引脚兼容版本(400MHz至1GHz)和多种片内存储器选项,数据手册链接:https://www.analog.com/media/en/technical-documentation/data-sheets/adsp-2…

springboot 整合 抖音 移动应用 授权

后端开发&#xff0c;因为没有JavaSDK&#xff0c;maven依赖&#xff0c;用到的是API接口去调用 抖音API开发文档 开发前先申请好移动应用&#xff0c;抖音控制台-移动应用 之后还需要开通所有能开通的能力 拿到应用的 clientKey 和 clientSecret&#xff0c;就可以进入开发了 …

Python 三维图表绘制指南

Python 三维图表绘制指南 在数据可视化中&#xff0c;三维图表可以更直观地展示数据之间的关系&#xff0c;尤其是当数据具有多个维度时。Python 提供了多个库来绘制三维图表&#xff0c;其中最常用的就是 Matplotlib。本文将介绍如何使用 Matplotlib 绘制三维图表&#xff0c…