分享好友 最新动态首页 最新动态分类 切换频道
百度sign
2024-12-25 18:21

转载: https://www.jianshu.com/p/0fb8a5daf617?from=timeline&isappinstalled=0

 杨强AT南京 关注

2018.11.09 10:09* 字数 1906 阅读 85评论 0喜欢 0

本主题,通过爬取一个翻译网站,实现一个在线翻译程序为例,来说明下怎么处理签名验证的反爬虫技术分析过程。

  1. 签名校验的一般套路
  2. 通过百度分析签名的实现原理
  3. 用Python爬取百度的翻译结果

  面对互联网这么大个数据宝库,现在各种爬虫程序、爬虫框架遍地横行,各种IT江湖人士与非IT的各位寨主、帮主疯狂的爬取各自需要的数据。不过很多Web服务提供商也开始认识数据的价值,变免费为收费(百度,有道,金山三家在线翻译服务都开始收费了,也同时为了减轻服务器的负载、降低运营成本,Web服务供应商开始在技术上采取反爬虫机制。其中签名校验就是其中一种。
  Web的签名校验理论上都是可以破解的。签名校验的关键是生成一个签名字符串,该签名要么在服务生成,要么在浏览器客户端生成
  1. 如果在服务器生成,需要客户端传递信息,在服务器生成后,发送给客户端,再由客服端发送给服务器校验,这种方式源头还是在客户端,理论上也是对所有用户开放的,也能找到客户传递的信息,并获取服务器发送的签名,从而破解。
  2. 如果是在客户端浏览器生成的,则基于Javascrip的脚本非变编译性,我们可以找到生成签名的Javascript代码,通过分析代码破解签名算法。

1、使用浏览器开发工具分析百度翻译

   本主题使用Safari浏览器分析,其他浏览器基本上类似,有的没有开发工具,可以下载开发插件。
   Safari的开发菜单如果没有,需要在设置中开启

Safari浏览器开发菜单设置

   百度翻译的地址:https://fanyi.baidu.com

 

   (1)打开浏览器开发工具

    方式一:使用浏览器系统菜单

打开浏览器开发工具方式一:使用浏览器系统菜单

    方式二:使用右键弹出菜单

打开浏览器开发工具方式二:使用右键弹出菜单

   打开浏览器开发工具后,都是下面这个样子。

红色区域就是开发工具视图

   其中【网络】【资源】标签在浏览器下载数据分析中比较常用。
【网络】标签功能用来跟踪浏览器网络请求与服务器响应的过程比较有用。
【资源】主要用来分析浏览器下载后的资源数据,分析结果比较有用。

 

   (2)跟踪翻译时的浏览器行为

    在浏览器页面上输入需要翻译的数据,点击【网络】标签显示【网络】视图,在其中可以选择XHR查看浏览器发起的异步请求,异步请求都是通过Javascript代码实现

浏览器请求的【网络】功能视图

    在左侧列表中,就会显示很多浏览器发起的AJAX请求。选择其中一个操作以后,右边会显示请求的HTTP协议过程与下载的资源信息。

跟踪AJAX请求的信息显示视图

     每个AJAX请求显示的信息,在数据分析中最有用的是【预览】【标题】【Cookie】
     其中【标题】中显示请求过程中相关信息包含:【摘要】【请求】【响应】与【请求数据】四个字段信息。

 

   (3)分析调用方式并分析数据

     从【摘要】字段中获取请求的URL

请求的URL确认

     从【请求数据】字段中获取请求的数据包格式

AJAX请求的数据包格式

    学习过爬虫开发的都应该看得出,构造AJAX请求包的核心难度是sign与token。只要明白sign与token生成算法,我们就可以按照算法实现sign与token的生成,并发起资源请求,爬取到我们需要的资源。要找到sign与token的生成算法,我们根据对这种web的开放签名的理解,应该在本地Javascript中实现,找到Javascript代码,分析代码,通过阅读代码来回逆算法。
    我们首先得找到实现sign与token算法的Javascript代码,这个过程麻烦而无趣,可以自己写程序下载资源慢慢使用文本编辑工具找(比如Sublime,UtralEdit,Eclipse,VisualStudio,XCode等,也可以在浏览器的开发工具中慢慢找。关键是找到方法,我这儿采用的方法就是:在自己觉得对眼的js脚本中搜索关键字与。

 

   (4)找到签名的Javascript代码

    ►打开【JS】资源的视图

JS视图列出的JS资源


    ►逐个文件搜索
    按照js文件搜索与关键字(使用ctrl+f启动搜索视图

找到实现sign与token算法的js脚本

  其中sign是由一个m函数产生,条件是我们需要翻译的字符串;token是直接调用浏览器的BOM对象的功能产生的token。m就是签名算法的实现函数。

 

2、分析Javascript代码

   (1)AJAX请求代码分析,找到m函数

  根据m的定义格式,可以使用其中的字符串搜索到m的定义。m的定义如下

   (2)找到m函数的原始定义

  我们就根据"translation:widget/translate/input/pGrab"找代码,找到的代码如下

  这个模块定义中有a,n,e三个函数定义,但最后有个语句,说明最终的签名算法函数是e

  剩下的事情就是读懂e函数中的算法。e函数最后的return语句,最后一个语句的返回值与我们在浏览器看到的sign值格式类似。

  下面是浏览器中的sign值格式

3、百度签名算法的处理技巧

  遗憾的是,现在没有时间去详细移植这段算法到Python,计算移植后也没有多大意义,因为这个算法今后也会改变。但我们有了百度的Javascript代码,充分利用这个代码才是最牛的,程序员就用程序员的手段搞定,找一个Javascript运算引擎,在Python中直接执行Javascript代码,获取sign算法计算结果(想把这个算法搞明白的童鞋,我不拦你)。
  实际上很多语言的各种库中,基本上总有一款都能支持Javascript调用的,我知道的Java,C++,C#都是可以的,作为语言中的大杀器Python有支持Javascript运行的库是必然的:js2py模块就是。
  js2py的安装

 

 

  安装截图

js2py模块安装过程

1、js2py的使用

2、使用requests获取window.common.token

  window.common.token的值实际是在主页中一段javascript代码定义的,可以通过请求http://fanyi.baidu.com/得到。由于主页得到的是一段HTML资源,所以获取window.common.token
使用正则表达式查找即可。下面是在主页中找到的token的定义

window.common.token的定义

  下面是获取token的实现代码

 

  我机器返回的是'9b8bb341109338ba7e875bd9a9dd88ba',其中需要解释下的是Python的正则表达式"token: ('.*'),"就是返回token:与,之间的任意字符串,返回的是列表,我们使用取第一个。

3、在Python中调用百度js脚本得到签名

  百度签名函数中需要一个变量i,该变量主页的脚本中定义。下面是签名算法函数中有关的一段代码

  其中u获取的是window[l],如果大家对l变量的ASCII码103,116,107翻译成字符就是gtk,所以u的值应该是window.gtk或者window [ gtk ]。

 

  我们在主页的javascript脚本中可以找到window.gtk的定义

window.gtk的定义

  下面是百度翻译的签名生成的Python代码(其中的Javascript我们从浏览器拷贝)

  下面是程序计算与浏览器中显示的出来的sign值比较

程序计算的sing与浏览器器计算的sign完全一样

  到目前为止,完全解决了翻译的v2transapi调用的AJAX中token与sign的问题,剩下就是Python爬虫最基础的技术:HTTP请求→获取数据→解析数据→存储数据→$分析数据。
  百度翻译中提供三个请求功能
  1). sug请求简单的翻译,是免费的,可以随意获取,没有采取反爬虫技术。

免费的sug获取的翻译

  2). langdetect根据输入的字符,检测其语言。
  3). v2transapi提供功能更加强悍的翻译结果。包含下面图示中的使用箭头标示的四个翻译结果

v2transapi获得翻译效果

 

4、使用v2transapi实现功能更强的翻译

  下面代码的实现原理
  1)首先使用get方法请求百度翻译的首页,从中获取两个信息,,其中的关键在于我们使用了从浏览器产生的headers格式。
  2)然后使用产生,并使用与,以及其他数据构造请求数据,发去爬取请求,获得我们需要的数据。
  数据的解析与分析,这里代码就不实现了。
  【代码如下】

  【运行结果】

 

爬取得输出结果(数据很大很大

 

  下面是把数据粘贴到文本编辑工具sublime显示的效果

爬取数据在sublime打开的结果

  这么多的数据,付点费用是应该,也是值得的。

5、使用langdetect侦测输入的语言类型

   langdetect的请求没有采用反爬虫技术,可以采用通用的http请求获取,这里就不提供实现代码

  补充一个langdetect的小例子

 

 

  运行结果

语言检测结果

6、使用sug实现简单翻译

   sug与langdetect的请求基本上一样,其请求也没有采用反爬虫技术,可以采用通用的http请求获取,这里就不提供实现代码

  补充一个sug的小例子

 

 

  运行结果

sug运行结果


  1. 代码清单
      |-测试javascript调用:callJavascript.py
      |-获取百度产生的token:gettoken_baidu.py
      |-完整翻译数据爬取:v2transapi.py
  2. 下载地址
最新文章
提升品牌曝光率的最佳方法:40个免费网站推广平台推荐
在当今互联网时代,推广产品或服务变得愈加重要。寻找合适的平台可以帮助你更好地接触到目标受众。本文将介绍40个免费网站推广平台,帮助你在网络上提升曝光率,吸引更多潜在客户。社交媒体是推广的绝佳渠道。你可以利用平台如Facebook、In
杭州SEO服务排名揭秘,多平台优势对比,助您挑选最佳合作伙伴
杭州SEO服务市场繁杂,本文全面解析各大平台优势,助您轻松挑选优质服务。从技术实力、服务质量、客户口碑等方面对比,为您的决策提供有力支持。选择专业SEO服务,助力企业网络营销高效开展。随着互联网技术的迅猛进步,众多企业逐渐认识到
富平SEO优化,提升网站流量,助力企业腾飞
随着互联网的普及,越来越多的企业开始重视网络营销。而SEO(搜索引擎)作为网络营销的重要手段,已经成为企业提高流量、提升品牌知名度的关键。本文将围绕富平SEO优化展开,探讨如何通过SEO优化助力企业腾飞。一、富平SEO优化的重要性1.
揭开网站优化推广公司的神秘面纱,你需要知道的真相!
在当今数字化时代,拥有一个优秀的网站对于企业的成功至关重要,仅仅拥有一个网站是远远不够的,还需要进行有效的网站优化推广,以提高网站的排名和流量,这就引出了一个问题:网站优化推广公司靠谱吗?我们需要明确的是,网站优化推广是一
【SEO】如何快速收录?快速收录背后的原理解析
一、快速收录文章因素1、百度快速收录与新内容有关百度喜欢新鲜的东西,百度是通过搜索引擎抓取新的东西存储到数据库文件里,如果一篇文章已经被百度收录过了,在进行二次发布那么很难被百度收录,有很多人想到自己写文章太困难,当然去搜
淮北推广后台升级,赋能企业品牌影响力与精准营销新突破
淮北通过优化推广后台,助力企业增强品牌影响力,实现精准营销,推动企业数字化转型,提升市场竞争力。简介![淮北](http://www.fengzhengtop.com/zb_users/upload/2024/10/20241024232031172978323168022.jpeg)淮北优化推广后台是一款融合
揭秘搜索引擎去重:8大方面深度解析!
在当今互联网时代,搜索引擎是人们获取信息最主要的途径之一。然而,随着互联网内容的爆炸式增长,搜索引擎面临着越来越多的重复内容,这给用户带来了不便,也对搜索引擎的效率造成了影响。因此,搜索引擎去重成为了一个非常重要的问题。本
建立权威外链,提升网站SEO排名
网站外链规划与执行方案外链建设对于网站的 SEO 优化至关重要,可以提高网站的权威性和信誉。以下是一个全面的外链规划和执行方案,旨在建立高质量的外链,从而提高您的网站在搜索引擎中的排名:在开始构建外链之前,制定一个清晰的外链策
百度10大最新算法规则
做SEO的我们都知道,我们时时刻刻都是在围绕搜索引擎在转,就拿百度来说吧,你个人做的再好,但是百度的算法一变,你如果不作相应的改进那好多功夫都是枉然,所以分析了2016年百度10大最新算法规则,希望给大家有所帮助。1、百度进一步提高
普兰店SEO优化攻略,揭秘企业网络腾飞之道
普兰店SEO网络优化策略深度解析,旨在提升企业在线影响力。本文详细阐述关键词研究、内容优化、链接建设等关键策略,助力企业实现搜索引擎排名提升,吸引更多潜在客户,推动业务腾飞。随着互联网的快速发展,网络营销已成为企业获取客户、
相关文章
推荐文章
发表评论
0评