用python3 urllib破解有道翻译反爬虫机制详解


Posted in Python onAugust 14, 2019

前言

最近在学习python 爬虫方面的知识,网上有一博客专栏专门写爬虫方面的,看到用urllib请求有道翻译接口获取翻译结果。发现接口变化很大,用md5加了密,于是自己开始破解。加上网上的其他文章找源码方式并不是通用的,所有重新写一篇记录下。

爬取条件

要实现爬取的目标,首先要知道它的地址,请求参数,请求头,响应结果。

进行抓包分析

打开有道翻译的链接:http://fanyi.youdao.com/。然后在按f12 点击Network项。这时候就来到了网络监听窗口,在这个页面中发送的所有网络请求,都会在Network这个地方显示出来,如果是空白的,点击XHR。接着我们在翻译的窗口输入我们需要翻译的文字,比如输入hell。然后点击自动翻译按钮,那么接下来在下面就可以看到浏览器给有道发送的请求,这里截个图看看:

用python3 urllib破解有道翻译反爬虫机制详解

点击链接,就可以看到整个请求的信息。包括请求头,请求参数,响应结果。

这里面有一个问题就是参数进行了加密。我们需要知道这些参数是如何加密的。

破解加密难题

要想知道如何加密的,需要查看源码。于是我们需要知道发起这个请求的js文件。在文件查找这个相关代码。刚才我们监听了网络请求,可以看到发起请求的js文件。那么接下来查找发起请求的链路,鼠标浮到请求文件上,显示了一系列执行方法,我们点击跟业务相关的那个方法对应的文件链接,这里是t.translate 对应的连接。

用python3 urllib破解有道翻译反爬虫机制详解

点击进入查看对应的源码

用python3 urllib破解有道翻译反爬虫机制详解

我们可以看到i,salt,sign是变量,其他的请求参数是常量。i是需要翻译的字符串,salt是时间戳生成的13位,sign是S+n+r+D
也就S是client的值,也就是fanyideskweb. 我们查找D 这个常量,在底栏输入框输入 D = (空格D空格=空格;格式化后的代码规范)点击右边的Aa让搜索时大小写敏感。回车查找到下一个,直到找到对应的值。

用python3 urllib破解有道翻译反爬虫机制详解

在上图我们看到了_,C,S,D等常量。

于是你以为构建一个请求,传好这些参数就ok了。别忘了,为了反爬虫,都是会校验请求头。于是要模拟浏览器的请求头。经过验证只需要User-Agent,Referer,Cookie 三个请求头。

实现代码:

# -*- coding: utf-8 -*-
from urllib import request,parse
import json
import time
from hashlib import md5
'''
def dicToSortedStrParam(dic={}):
  keyList = sorted(dic)
  str =""
  for i,key in enumerate(keyList):
    if i==len(keyList)-1:
      str += key +"="+ dic[key]
    else:
      str += key +"="+ dic[key] + "&"
    pass
  return str
'''


def create_md5(data):
  md5_obj = md5()
  md5_obj.update(data.encode("utf-8"))
  return md5_obj.hexdigest()

if __name__ == "__main__":
  request_url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
  translate = "hell"
  c = "fanyideskweb"
  data = {}
  data["i"] = translate
  data["from"] = "AUTO"
  data["to"] = "AUTO"
  data["smartresult"] = "dict"
  data["client"] = c
  data["doctype"] = "json"
  data["version"] = "2.1"
  data["keyfrom"] = "fanyi.web"
  data["action"] = "FY_BY_REALTIME"
  data["typoResult"] = "false"
  salt = str(int(round(time.time(),3)*1000))
  # 加密
  data["salt"] = salt
  # a = "rY0D^0'nM0}g5Mm1z%1G4"  网上别人的 也可以
  a = "ebSeFb%=XZ%T[KZ)c(sy!"
  sign = create_md5(c+translate+salt+a)
  data["sign"] = sign
  headers = {}
  headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
  # headers["Content-Type"] = "application/x-www-form-urlencoded; charset=UTF-8"
  headers["Referer"] = "http://fanyi.youdao.com/"
  # headers["Host"] = "fanyi.youdao.com"
  # headers["Origin"]="http://fanyi.youdao.com"
  headers["Cookie"]="OUTFOX_SEARCH_USER_ID=-948455480@10.169.0.83; " \
           "JSESSIONID=aaajvZPcjhFWbgtIBPuiw; " \
           "OUTFOX_SEARCH_USER_ID_NCOO=1148682548.6241577;" \
           " fanyi-ad-id=41685; fanyi-ad-closed=1; ___rl__test__cookies="+salt

  data = parse.urlencode(data).encode('utf-8')
  request1 = request.Request(request_url,data,headers = headers)

  response = request.urlopen(request1)
  print(response.info())
  #读取信息并解码
  html = response.read().decode('utf-8')
  print(html)
  #使用JSON
  translate_results = json.loads(html)
  # 找到翻译结果
  translate_results = translate_results['translateResult'][0][0]['tgt']
  # 打印翻译信息
  print("翻译的结果是:%s" % translate_results)

翻译结果:

{"translateResult":[[{"tgt":"地狱","src":"hell"}]],"errorCode":0,"type":"en2zh-CHS","smartResult":{"entries":["","n. 地狱;究竟(作加强语气词);训斥;黑暗势力\r\n","vi. 过放荡生活;飞驰\r\n","int. 该死;见鬼(表示惊奇、烦恼、厌恶、恼怒、失望等)\r\n"],"type":1}}
翻译的结果是:地狱

翻译的结果是:地狱

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
Mar 13 Python
Python 字符串操作实现代码(截取/替换/查找/分割)
Jun 08 Python
简单谈谈Python流程控制语句
Dec 04 Python
python实现二叉树的遍历
Dec 11 Python
对Python通过pypyodbc访问Access数据库的方法详解
Oct 27 Python
Python 合并多个TXT文件并统计词频的实现
Aug 23 Python
使用django和vue进行数据交互的方法步骤
Nov 11 Python
python3 tkinter实现添加图片和文本
Nov 26 Python
Python更新所有已安装包的操作
Feb 13 Python
Python matplotlib修改默认字体的操作
Mar 05 Python
python 实现客户端与服务端的通信
Dec 23 Python
python使用pygame创建精灵Sprite
Apr 06 Python
使用Python实现图像标记点的坐标输出功能
Aug 14 #Python
python2爬取百度贴吧指定关键字和图片代码实例
Aug 14 #Python
python提取照片坐标信息的实例代码
Aug 14 #Python
python2使用bs4爬取腾讯社招过程解析
Aug 14 #Python
详解用python计算阶乘的几种方法
Aug 14 #Python
Python使用scrapy爬取阳光热线问政平台过程解析
Aug 14 #Python
用Python抢火车票的简单小程序实现解析
Aug 14 #Python
You might like
JAVA/JSP学习系列之六
2006/10/09 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
学习使用curl采集curl使用方法
2012/01/11 PHP
关于js与php互相传值的介绍
2013/06/25 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
php实现redis数据库指定库号迁移的方法
2015/01/14 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
javascript 中String.match()与RegExp.exec()的区别说明
2013/01/10 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
Jquery 在页面加载后执行的几种方式
2014/03/14 Javascript
用js闭包的方法实现多点标注冒泡示例
2014/05/29 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
javascript Array 数组常用方法
2015/04/05 Javascript
基于MVC方式实现三级联动(JavaScript)
2017/01/23 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
JavaScript原生数组Array常用方法
2017/04/06 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
jquery获取input输入框中的值
2019/11/13 jQuery
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
VSCode launch.json配置详细教程
2020/06/18 Javascript
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
Python获取当前时间的方法
2014/01/14 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
2019/06/25 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
Python如何爬取qq音乐歌词到本地
2020/06/01 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
Python函数__new__及__init__作用及区别解析
2020/08/31 Python
python实现企业微信定时发送文本消息的实例代码
2020/11/25 Python
html5图片上传预览示例分享
2014/04/14 HTML / CSS
2014年销售内勤工作总结
2014/12/01 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书