用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 相关文章推荐
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
May 22 Python
Python读写unicode文件的方法
Jul 10 Python
python模块之time模块(实例讲解)
Sep 13 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
May 16 Python
Python爬虫框架Scrapy基本用法入门教程
Jul 26 Python
Python判断有效的数独算法示例
Feb 23 Python
Python实现Linux监控的方法
May 16 Python
Python FTP文件定时自动下载实现过程解析
Nov 12 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
Jun 09 Python
python的launcher用法知识点总结
Aug 07 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 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
php生成略缩图代码
2012/07/16 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
PHP正则验证Email的方法
2015/06/15 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
PHP MYSQL简易交互式站点开发
2016/12/27 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
一个用js实现的页内搜索代码
2007/05/23 Javascript
JavaScript Date对象 日期获取函数
2010/12/19 Javascript
jQuery LigerUI 使用教程表格篇(1)
2012/01/18 Javascript
javaScript复制功能调用实现方案
2012/12/13 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
JS填写银行卡号每隔4位数字加一个空格
2016/12/19 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
vue数组对象排序的实现代码
2018/06/20 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
2018/08/12 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
2019/08/07 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
JS实现网站吸顶条
2020/01/08 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
vue-video-player视频播放器使用配置详解
2020/10/23 Javascript
TypeScript魔法堂之枚举的超实用手册
2020/10/29 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
python set内置函数的具体使用
2019/07/02 Python
Servlet方面面试题
2016/09/28 面试题
平安家庭示范户事迹
2014/06/02 职场文书
教师求职自荐书
2014/06/14 职场文书
反邪教观后感
2015/06/11 职场文书
2016公司中秋节寄语
2015/12/07 职场文书
担保书怎么写 ?
2019/04/22 职场文书
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python
部分武汉产收音机展览
2022/04/07 无线电