一、静态爬取页面信息

有道翻译网址:http://fanyi.youdao.com/

在翻译中输入python

找到接口和请求的方式

参数是From Data类型

需要把参数数据转换为字典,

复制粘贴后按住Ctrl + r ,然后

Headers

内容的长度是data携带参数的长度

代码实现

分析:红色圈住的,是会根据要翻译的内容变化而变化

运行结果:

代码:

  1. import requests
  2. import json
  3.  
  4. # 定义爬取url地址
  5. base_url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
  6.  
  7. # 定义请求参数
  8. data = {
  9. 'i': 'python',
  10. 'from': 'AUTO',
  11. 'to': 'AUTO',
  12. 'smartresult': 'dict',
  13. 'client': 'fanyideskweb',
  14. 'salt': '',
  15. 'sign': '8f6d849c13cec811c6b7ab6d0ad41eb6',
  16. 'ts': '',
  17. 'bv': '6f014bd66917f921835d1d6ae8073eb1',
  18. 'doctype': 'json',
  19. 'version': '2.1',
  20. 'keyfrom': 'fanyi.web',
  21. 'action': 'FY_BY_REALTIME',
  22. 'typoResult': 'false'
  23. }
  24.  
  25. # 定义请求头部参数
  26. headers = {
  27. 'Accept': 'application/json, text/javascript, */*; q=0.01',
  28. 'Accept-Encoding': 'gzip, deflate',
  29. 'Accept-Language': 'zh-CN,zh;q=0.9',
  30. 'Connection': 'keep-alive',
  31. 'Content-Length': '',
  32. 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
  33. 'Cookie': 'OUTFOX_SEARCH_USER_ID=-1632754728@10.169.0.84; JSESSIONID=aaavabYot4NQ1fAZH8sKw; '
  34. 'OUTFOX_SEARCH_USER_ID_NCOO=933374763.1142684; ___rl__test__cookies=1550801165800',
  35. 'Host': 'fanyi.youdao.com',
  36. 'Origin': 'http://fanyi.youdao.com',
  37. 'Referer': 'http://fanyi.youdao.com/',
  38. 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
  39. 'Chrome/71.0.3578.98 Safari/537.36',
  40. 'X-Requested-With': 'XMLHttpRequest'
  41. }
  42.  
  43. # 发起请求 加入headers参数,让服务器知道是浏览器访问的
  44. response = requests.post(base_url, data=data, headers=headers)
  45. json_data = response.json()
  46. print(json_data)

二、动态爬取页面信息(加密)

输入测试数据,再通过使用F12观察,其中有一条是POST请求,而向服务器发送的请求数据并不是在url里,那么我们可以试着模拟这个POST请求。

1、data字典内容:

2、headers字典内容:

3、运行结果:根据不同的单词,返回的数据不一样

4、解决问题:

从data中的参数中,我们看到”salt“和"sign"两个,这是添加数字签名的标记。也就是这两个参数的值是生成出来的,也就是说随着翻译内容的不同,这两个值可能是会变化的。

像这种动态生成的值一般会写在js脚本文件中。

(1)查找对应的js文件

(2)查看文件

双击复制Response中的内容,打开在线格式网页,如下图所示:

为了方便查看,我们在新建一个js文件,并且搜索与”salt“相关的字符,如下图所示:

分析:i在这里是什么?

(3)生产salt内容

其中

这行语句我们可以在浏览器中的控制台上输出看一下,如下图

可见是精化到毫秒(1毫秒=0.001秒)的时间戳,(用同样的方式验证:parseInt(10 * Math.random(), 10)),我们可以在python输出一个时间,两者做个对比

保留三位小数,然后把它转换为整形

所以这个在JS中生成的salt值

在python中可以这样生成:

(4)生成sign内容

推导出:sign = i.sign

  1. sign = n.md5("fanyideskweb" + e + i + "p09@Bn{h02_BIEe]$P^nG")

e = e.i     e.i = 需要翻译的关键字

i = r + parseInt(10 * Math.random(), 10)

r = "" + (new Date).getTime()

编写程序:

编程当中需要注意的地方:

发送post请求时,需要特别注意headers的一些属性:

  Content-Length: 144: 是指发送的表单数据长度为144,也就是字符个数是144个。

  X-Requested-With: XMLHttpRequest :表示Ajax异步请求。

  Content-Type: application/x-www-form-urlencoded : 表示浏览器提交 Web 表单时使用,表单数据会按照 name1=value1&name2=value2 键值对形式进行编码。

代码如下:

  1. import requests
  2. import random
  3. import time
  4. import hashlib
  5.  
  6. # md5加密函数
  7. def getmd5(value):
  8. # 生成MD5对象
  9. md5 = hashlib.md5()
  10. # 将值进行编码 编码成字符串
  11. md5.update(bytes(value, encoding="utf-8"))
  12. # 对字符串进行加密
  13. sign = md5.hexdigest()
  14. return sign
  15.  
  16. def fanyi(key):
  17. # 定义起始url
  18. base_url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
  19.  
  20. # 生成salt和sign参数
  21. salt = int(time.time() * ) + random.randint(, )
  22. sign_str = "fanyideskweb" + key + str(salt) + "p09@Bn{h02_BIEe]$P^nG"
  23. sign = getmd5(sign_str)
  24. data = {
  25. 'i': key,
  26. # 'from': 'AUTO',
  27. # 'to': 'AUTO',
  28. # 'smartresult': 'dict',
  29. 'client': 'fanyideskweb',
  30. 'salt': salt,
  31. 'sign': sign,
  32. # 'ts': '',
  33. # 'bv': '6f014bd66917f921835d1d6ae8073eb1',
  34. # 'doctype': 'json',
  35. # 'version': '2.1',
  36. 'keyfrom': 'fanyi.web',
  37. # 'action': 'FY_BY_REALTIME',
  38. # 'typoResult': 'false'
  39. }
  40.  
  41. headers = {
  42. # 'Accept': 'application/json, text/javascript, */*; q=0.01',
  43. # 'Accept-Encoding': 'gzip, deflate',
  44. # 'Accept-Language': 'zh-CN,zh;q=0.9',
  45. # 'Connection': 'keep-alive',
  46. # 'Content-Length': '',
  47. # 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
  48. 'Cookie': 'OUTFOX_SEARCH_USER_ID=-1632754728@10.169.0.84; JSESSIONID=aaavabYot4NQ1fAZH8sKw; OUTFOX_SEARCH_USER_ID_NCOO=933374763.1142684; ___rl__test__cookies=1550801165800',
  49. # 'Host': 'fanyi.youdao.com',
  50. # 'Origin': 'http://fanyi.youdao.com',
  51. 'Referer': 'http://fanyi.youdao.com/',
  52. 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
  53. # 'X-Requested-With': 'XMLHttpRequest'
  54. }
  55.  
  56. # 发起请求 加入headers参数,让服务器知道是浏览器访问的
  57. response = requests.post(base_url, data=data, headers=headers)
  58. json_data = response.json()
  59. print(json_data)
  60.  
  61. if __name__ == "__main__":
  62. key = input("请输入需要翻译的内容:")
  63. fanyi(key)

有道词典翻译(携带请求头和post参数请求)的更多相关文章

  1. PHP发送请求头和接收打印请求头

    一.发送请求头 //发送地址 $url = 'http://127.0.0.1/2.php'; //请求头内容 $headers = array( 'Authorization: '.$basic, ...

  2. nginx 获取请求头,URL参数

    获取url参数 在 ngx_lua 中访问 Nginx 内置变量 ngx.var.arg_PARAMETER 即可获得GET参数PARAMETER的内容. 在 nginx配置中,通过$arg_PARA ...

  3. http请求报文格式(请求行、请求头、空行 和 请求包体)和响应报文格式(状态行、响应头部、空行 和 响应包体)

    转载 出处 超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议.HTTP 是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求 ...

  4. Android-Retrofit-2.0-Post与Get-请求有道词典翻译

    Retrofit-2.0版本后,内置已经集成了OKHttp,在使用Retrofit的时候 看似是Retrofit去网络请求的 实际上Retrofit只是封装,所以不要以为Retrofit是网络请求框架 ...

  5. Tornado—添加请求头允许跨域请求访问

    跨域请求访问 如果是前后端分离,那就肯定会遇到cros跨域请求难题,可以设置一个BaseHandler,然后继承即可. class BaseHandler(tornado.web.RequestHan ...

  6. 使用RestTemplate发送post请求,请求头中封装参数

    最近使用RestTemplate发送post请求,遇到了很多问题,如转换httpMessage失败.中文乱码等,调了好久才找到下面较为简便的方法: RestTemplate restTemplate ...

  7. python:爬虫1——实战(下载一张图片、用Python模拟浏览器,通过在线的有道词典来对文本翻译)

    一.下载一只猫 import urllib.request response = urllib.request.urlopen("http://cdn.duitang.com/uploads ...

  8. SpringBoot图文教程17—上手就会 RestTemplate 使用指南「Get Post」「设置请求头」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1-Spr ...

  9. ASP.NET Core - 实现Http自定义请求头策略

    前言 在正常的情况下,当我们系统用到JWT认证方式时,需要在Http请求头添加Authorization: XXX,这样在后台服务的控制器中打上[Authorize]授权标签,就限定所有的请求必须通过 ...

随机推荐

  1. 下拉菜单被表单、图片、FLASH挡住的解决办法

    设置Flash的参数: <param name="wmode" value="opaque"> <object classid="c ...

  2. 前端框架之Vue(5)-条件渲染

    v-if 在字符串模板中,比如 Django Template语法中,我们得像这样写一个条件块: <!-- Handlebars 模板 --> {%if 1%} <h1>Yes ...

  3. C语言数据类型运算法则

    整形与整形运算得到的还是整形 printf("%d\n",1/3); //0 printf("%d\n",1+2); //3 整形与浮点型运算得到浮点型数据 p ...

  4. 2019.03.23 Cookie

    Cookie  曲奇饼干  哈哈哈.通俗的将,应该是发票. 因为http是无状态操作 当你访问服务器之后,应该会给你响应发票Cookie记录你访问了什么东西 便于下次再来查找吧,Cookie有时间的限 ...

  5. GO language for windows

    我记得我们已经下载完成了windows 下Go 的安装包 go1.9.windows-amd64.msi下面接着说吧 GO 在Windows 上也是按照linux 惯例来编程的,所以,你还需要一个wi ...

  6. pyqt常用窗口组件

    扩展知识: 熟悉常用的窗口组件: 1 按钮类 QPushButton   普通按钮 QToolButton   工具按钮:通常在工具栏使用 QRadioButton   单选框 QCheckBox   ...

  7. composer----------composer基本命令和遇到一些问题解决方案

    1.composer跟xdebug有冲突,每次用composer命令的时候都要报xdebug的错误,去php的配置文件里面将xdebug注释掉就可以了,但是我注释掉了以后还是不行.找了半天才看到,我用 ...

  8. webpack打包二进制文件报错

    错误示例,如下图所示: 修改webpack的module部分的rules,在其中添加一下代码: { test: /\.woff[0-9]{0,}$/, loader: "url-loader ...

  9. 219. 存在重复元素 II

    给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k. 示例 1: 输入: nums = ...

  10. 关于toolchain(工具链)的一点知识

    之前一直觉得toolchain是个高大上的东西,现摘录 uClibc中的FAQ以助理解. A toolchain consists of GNU binutils, the gcc compiler, ...