当前位置: 首页 > news >正文

Python爬虫入门教程 61-100 写个爬虫碰到反爬了,动手破坏它!

python3爬虫遇到了反爬

当你兴冲冲的打开一个网页,发现里面的资源好棒,能批量下载就好了,然后感谢写个爬虫down一下,结果,一顿操作之后,发现网站竟然有反爬措施,尴尬了。

接下来的几篇文章,我们研究一下各种反爬虫套路,当然互联网没有100%的反爬措施,只要你能使用浏览器访问的网页,都是可以爬取到了,所有的人不能杜绝爬虫,只能在一定程度上增加你爬取的成本,说白了,就是让你的技术爬不到~

爬虫和反爬虫一直都是这个领域程序员对抗的基础,从最简单的UA限制,到略微复杂一些的IP限制,用户限制,技术都是不断发展的,但是,不怕贼偷,就怕贼惦记,只要你的网站内容有价值,放心,一堆爬虫coder盯着呢?

emmmm....

搞定javascript加密

js加密最简单的是采用md5进行的,我们通过http://fanyi.youdao.com/来演示本篇博客内容

在这里插入图片描述
接下来你要注意的是这个请求是由哪个Js文件发起的
在这里插入图片描述
文件获取到为 fanyi.min.js,继续追踪,鼠标在这个文件名上面停留一下就可以获取到基本信息,我们点击跟请求相关的那个方法对应的文件链接,跳转到方法内部
在这里插入图片描述

这个地方有个操作细节,你需要学会,点击文件之后,跳转到的JS文件是压缩之后的,进行一下格式化操作
在这里插入图片描述
拿到源码

    t.translate = function(e, t) {
        _ = f("#language").val();
        var n = x.val()
          , r = g.generateSaltSign(n)
          , i = n.length;
        if (F(),
        T.text(i),
        i > 5e3) {
            var a = n;
            n = a.substr(0, 5e3),
            r = g.generateSaltSign(n);
            var s = a.substr(5e3);
            s = (s = s.trim()).substr(0, 3),
            f("#inputTargetError").text("有道翻译字数限制为5000字,“" + s + "”及其后面没有被翻译!").show(),
            T.addClass("fonts__overed")
        } else
            T.removeClass("fonts__overed"),
            f("#inputTargetError").hide();
        d.isWeb(n) ? o() : l({
            i: n,
            from: C,
            to: S,
            smartresult: "dict",
            client: k,
            salt: r.salt,
            sign: r.sign,
            ts: r.ts,
            bv: r.bv,
            doctype: "json",
            version: "2.1",
            keyfrom: "fanyi.web",
            action: e || "FY_BY_DEFAULT",
            typoResult: !1
        }, t)
    }

参数分析

  • i 表示 带翻译的词语
  • from 设置为 AUTO
  • to 设置为 AUTO
  • smartresult 默认值 dict
  • client 翻译的客户端:默认应该为 fanyideskweb
  • salt 第一个变量 需要查阅生成规则
  • sign 第二个变量 需要查阅生成规则
  • ts
  • bv
  • 其余的参数保持默认即可

重点参数

  • salt
  • sign
  • ts
  • bv

代码的复查当中找到参数来源

 var r = function(e) {
        var t = n.md5(navigator.appVersion)
          , r = "" + (new Date).getTime()
          , i = r + parseInt(10 * Math.random(), 10);
        return {
            ts: r,
            bv: t,
            salt: i,
            sign: n.md5("fanyideskweb" + e + i + "1L5ja}w$puC.v_Kz3@yYn")
        }

OK,我们已经获取到参数的内容了

  • ts = r 表示当前的时间戳
  • salt 用r去加上一个随机数
  • sign 为 一个特殊的md5,中间重点注意 e 其实就是你要翻译的词语
  • navigator.appVersion 这个比较容易,在开发者工具中运行一下就可以得到了

    5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36

代码尝试

准备好这么多材料之后,剩下的就是编码了,我们开始吧,这个地方依据的是JS的源码,然后转换成Python即可,没有特别难的地方

参数的生成

def generate_salt_sign(translate):
    # var t = n.md5(navigator.appVersion)
    app_version = "5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
    bv = hashlib.md5(app_version.encode(encoding='UTF-8')).hexdigest()
    # r = "" + (new Date).getTime()
    ts = str(int(round(time.time(),3)*1000))
    # i = r + parseInt(10 * Math.random(), 10);
    salt = ts + str(random.randint(1,10))

    # sign: n.md5("fanyideskweb" + e + i + "1L5ja}w$puC.v_Kz3@yYn")
    sign = hashlib.md5(("fanyideskweb"+translate+salt+"1L5ja}w$puC.v_Kz3@yYn").encode(encoding='utf-8')).hexdigest()

    return salt,sign,ts,bv

参数的拼接与header的准备

def params():
    data = {}
    translate = 'morning'
    client = 'fanyideskweb'
    data['i'] = translate
    data['from'] = 'AUTO'
    data['to'] = 'AUTO'
    data['smartresult'] = 'dict'
    data['client'] = client

    data['salt'],data['sign'],data['ts'],data['bv'] = generate_salt_sign(translate)
    data['doctype'] = 'json'
    data['version'] = '2.1'
    data['keyfrom'] = 'fanyi.web'
    data['action'] = 'FY_BY_REALTIME'
    data['typoResult'] = 'false'

    return data

发起请求

def tran():
    data = params()
    headers = {}
    headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
    headers["Referer"] = "http://fanyi.youdao.com/"
    headers["Cookie"] = "OUTFOX_SEARCH_USER_ID=-1868577286@222.222.147.75;"

    with requests.post("http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule",headers=headers,data=data) as res:
        print(res.text)

if __name__ == '__main__':
    tran()

结果展示

{"translateResult":[[{"tgt":"早....","src":"morning"}]],"errorCode":0,"type":"en2zh-CHS","smartResult":{"entries":["","n. 早晨;黎明;初期\r\n"],"type":1}}

得到数据之后就表示我们的目标完成了~

本篇博客的反爬内容搞定~

关注微信公众账号,回复0401获取源码

转载于:https://www.cnblogs.com/happymeng/p/10749850.html

相关文章:

  • 青柠音乐搜索下载2.0.1(PC软件)
  • postgres读写性能测试(本地、NFS)
  • UCML JS函数说明
  • 【剑指Offer】13、调整数组顺序使奇数位于偶数前面
  • 【2019计划】想要变得优秀 顺其自然是不可能的。
  • 常见跨域解决方案
  • 前端工程化
  • 【AtCoder】ARC071
  • [Markdown] 02 简单应用 第二弹
  • webmagic爬虫框架抽取元素
  • ScriptManager的几个属性和方法
  • Alpha冲刺(3/10)——2019.4.25
  • 接口测试基础
  • MySql综合知识汇总
  • FullCalendar Timeline View 使用
  • @angular/forms 源码解析之双向绑定
  • canvas 绘制双线技巧
  • CSS3 变换
  • JavaScript DOM 10 - 滚动
  • markdown编辑器简评
  • mongo索引构建
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Python 反序列化安全问题(二)
  • rabbitmq延迟消息示例
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Vue UI框架库开发介绍
  • Webpack入门之遇到的那些坑,系列示例Demo
  • Web设计流程优化:网页效果图设计新思路
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 测试开发系类之接口自动化测试
  • 后端_ThinkPHP5
  • 前嗅ForeSpider教程:创建模板
  • 浅谈Golang中select的用法
  • 使用API自动生成工具优化前端工作流
  • 以太坊客户端Geth命令参数详解
  • 找一份好的前端工作,起点很重要
  • 自定义函数
  • 最近的计划
  • 进程与线程(三)——进程/线程间通信
  • ![CDATA[ ]] 是什么东东
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #NOIP 2014#Day.2 T3 解方程
  • #pragam once 和 #ifndef 预编译头
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (分布式缓存)Redis持久化
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (三分钟)速览传统边缘检测算子
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET 发展历程
  • .NET多线程执行函数
  • .NET实现之(自动更新)