Python有道翻译爬虫,破解反爬虫机制,解决{errorCode:50}错误

2024-02-12 01:32

本文主要是介绍Python有道翻译爬虫,破解反爬虫机制,解决{errorCode:50}错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、引言

参考网址:https://tendcode.com/article/youdao-spider/
当前成功时间:2019-6-28
转自个人开源博客:https://my.oschina.net/u/4004713/blog/3067132

本人使用环境:

  • Python3.7 (Anaconda)
  • IDE:PyCharm
  • 系统:mac

二、具体操作

2.1 审查元素

(1)打开有道翻译网址:http://fanyi.youdao.com/ ,右键空白处选择“审查元素/检查”,点击“Network”,选择“XHR”。

在左侧输入要翻译内容,比如说“你好”,网站会自动生成翻译显示在右侧界面,并在XHR中多出一个translate_o文件,点击“翻译”按钮,也会多出一个translate_o文件,不同之处在于Form Data中的action参数,前者为FY_BY_REALTlME,后者是FY_BY_CLICKBUTTION,两种方法皆可,本文以后者为例。

(2)需要记住的内容有:

Request Headers(请求头,只需要Cookie,Referer,User-Agent)

Request URL(请求URL地址)

Form Data(发送的数据)

Response(响应内容,可根据其格式取要显示数据)

2.2 破解反爬虫机制

在无爬虫机制的情况下,我们可以简单的使用Form Data中的内容,以及Request Headers请求数据。

Form_Data = {'i': self.msg,'from': 'AUTO','to': 'AUTO','smartresult': 'dict','client': 'fanyideskweb','salt': '15616860238197','sign': '67bf9a6f73b5fc6f3ecc7c14047403f8','ts': '1561686023819','bv': 'c6b8c998b2cbaa29bd94afc223bc106c','doctype': 'json','version': '2.1','keyfrom': 'fanyi.web','action': 'FY_BY_REALTlME'}response = requests.post(self.url, data=Form_Data, headers=headers).texttranslate_results = json.loads(response)

然而,返回结果却是{“errorCode”:50}。从Form Data中分析原因得知,salt,sign,ts三个参数值是动态变化的,每次请求其值都不同,这表明网站对这三个参数作出了加密反爬虫机制,若想取得数据,就必须先破解其加密机制。

观察这几个参数,猜测salt和ts参数与时间戳有关,具体使用了何种加密方式,还要去看网页代码元素。

右键,查看网页源代码,在html中并没有找到对应参数,那么就可能在js文件中,在网页的最后一部分代码,根据js文件的文件名,猜测这几个参数的获取方式可能在"fanyi.min.js"文件中。

打开该js文件,发现这个文件是处理过的 js,直接看是难以看出逻辑的,所以可以把 js 代码放到一些可以重新排版的工具中再查看,如在线“站长工具”,最后可以通过搜索“salt”找到几个参数的生成位置,具体代码片段如下:

define("newweb/common/service", ["./utils", "./md5", "./jquery-1.7"],
function(e, t) {var n = e("./jquery-1.7");e("./utils");e("./md5");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 + "@6f#X3=cCuncYssPsuRUE")}};

从上述参数生成代码中,可知:

(1)网站采用的是md5加密
(2)ts = "" + (new Date).getTime()  ,为时间戳
(3)salt = "" + (new Date).getTime() + parseInt(10 * Math.random(), 10)
(4)sign = n.md5("fanyideskweb" + e + i + "@6f#X3=cCuncYssPsuRUE")
其中,e为要翻译内容,i为时间戳,等于ts,其余为固定字符串

明确参数获取方式后,即可编写python代码,破解反爬虫机制。

三、附录代码

import hashlib
import random
import time
import requests
import json"""
向有道翻译发送data,得到翻译结果
"""class Youdao:def __init__(self, msg):self.msg = msgself.url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'self.D = "@6f#X3=cCuncYssPsuRUE"self.salt = self.get_salt()self.sign = self.get_sign()self.ts = self.get_ts()def get_md(self, value):# md5加密m = hashlib.md5()# m.update(value)m.update(value.encode('utf-8'))return m.hexdigest()def get_salt(self):# 根据当前时间戳获取salt参数s = int(time.time() * 1000) + random.randint(0, 10)return str(s)def get_sign(self):# 使用md5函数和其他参数,得到sign参数s = "fanyideskweb" + self.msg + self.salt + self.Dreturn self.get_md(s)def get_ts(self):# 根据当前时间戳获取ts参数s = int(time.time() * 1000)return str(s)def get_result(self):Form_Data = {'i': self.msg,'from': 'AUTO','to': 'AUTO','smartresult': 'dict','client': 'fanyideskweb','salt': self.salt,'sign': self.sign,'ts': self.ts,'bv': 'c6b8c998b2cbaa29bd94afc223bc106c','doctype': 'json','version': '2.1','keyfrom': 'fanyi.web','action': 'FY_BY_CLICKBUTTION'}headers = {'Cookie': 'OUTFOX_SEARCH_USER_ID=-368708839@10.108.160.18; JSESSIONID=aaaL2DMAbpTgg8Qpc2xUw; OUTFOX_SEARCH_USER_ID_NCOO=1451460344.418452; ___rl__test__cookies=1561684330987','Referer': 'http://fanyi.youdao.com/','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OSX10_14_2) AppleWebKit/537.36(KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}response = requests.post(self.url, data=Form_Data, headers=headers).texttranslate_results = json.loads(response)# 找到翻译结果if 'translateResult' in translate_results:translate_results = translate_results['translateResult'][0][0]['tgt']print("翻译的结果是:%s" % translate_results)else:print(translate_results)if __name__ == "__main__":y = Youdao('我成功啦')y.get_result()

这篇关于Python有道翻译爬虫,破解反爬虫机制,解决{errorCode:50}错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/701332

相关文章

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3