当前位置: 首页 > article >正文

【实战篇】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}')


在这里插入图片描述


http://www.kler.cn/a/379297.html

相关文章:

  • CSharp Ollama
  • 40.第二阶段x86游戏实战2-初识lua
  • 虚拟化环境中的精简版 Android 操作系统 Microdroid
  • HTML 框架
  • 操作系统(10) (并发(2)------基于软件/硬件/操作系统层面解决两个进程之间的临界区问题/抢占式/非抢占式内核)
  • 哔哩哔哩车机版2.7.0|专为司机打造的车机版B站,内容丰富,功能齐全
  • brew 下载过慢, 切换使用国内源
  • Python小白学习教程从入门到入坑------第二十四课 继承(语法进阶)
  • 深度学习案例:一步步搭建多层神经网络以及应用
  • 基于向量检索的RAG大模型
  • 探索设计模式:命令模式
  • 第三十二章 Vue组件分类及存放位置
  • 本质矩阵分解计算Rt
  • 宝塔FTP服务配置结合内网穿透实现安全便捷的远程文件管理和传输
  • 广东网站设计提升你网站在搜索引擎中的排名
  • 搭建支持国密GmSSL的Nginx环境
  • 【AI+教育】一些记录@2024.11.04
  • latex中公式之间的省略号
  • C++ 内存对齐:alignas 与 alignof
  • 基于Matlab 模拟停车位管理系统【源码 GUI】
  • Selenium的下载及chrome环境搭建
  • git入门教程14:Git与其他工具的集成
  • 构造有向(无向)加权图
  • 机器学习算法之回归算法
  • 来康生命科技有限公司心率监测解决方案在健身房与康养机构的应用探索
  • Docker Hub 镜像加速器