用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 相关文章推荐
Windows上使用virtualenv搭建Python+Flask开发环境
Jun 07 Python
sublime text 3配置使用python操作方法
Jun 11 Python
python使用 cx_Oracle 模块进行查询操作示例
Nov 28 Python
python爬虫开发之urllib模块详细使用方法与实例全解
Mar 09 Python
PyQt5事件处理之定时在控件上显示信息的代码
Mar 25 Python
Django import export实现数据库导入导出方式
Apr 03 Python
Keras预训练的ImageNet模型实现分类操作
Jul 07 Python
Python如何绘制日历图和热力图
Aug 07 Python
python mock测试的示例
Oct 19 Python
基于Python实现全自动下载抖音视频
Nov 06 Python
Python图片验证码降噪和8邻域降噪
Aug 30 Python
Python matplotlib绘制条形统计图 处理多个实验多组观测值
Apr 21 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
encode脚本和normal脚本混用的问题与解决方法
2007/03/08 Javascript
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
js防止表单重复提交的两种方法
2013/09/30 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
玩转vue的slot内容分发
2018/09/22 Javascript
微信小程序class封装http代码实例
2019/08/24 Javascript
原生JS实现无缝轮播图片
2020/06/24 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
vue实现图片按比例缩放问题操作
2020/08/11 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
python3.3教程之模拟百度登陆代码分享
2014/01/16 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
Django视图、传参和forms验证操作
2020/07/15 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
2013/01/31 HTML / CSS
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
高中三年学习生活的自我评价
2013/10/10 职场文书
优秀教师获奖感言
2014/01/31 职场文书
2014年检验科工作总结
2014/11/22 职场文书
捐助感谢信
2015/01/22 职场文书
导游欢送词
2015/01/31 职场文书
大学生就业意向书
2015/05/11 职场文书
现货白银电话营销话术
2015/05/29 职场文书
2015年社区党建工作汇报材料
2015/06/25 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android