我的第一个技术文章 有道翻译requests+bs4爬虫,火狐网络工具破解有道反爬虫

第一次写技术文章,有点小紧张,小兴奋。这两天想着好好运用一下刚学到的requests和bs4来爬虫,网上找了个小爬虫项目,就是爬虫实现有道翻译。一开始以为很简单,结果断断续续用了挺长时间,主要是有道的反爬虫机制在提升,所以参考的那篇博客写的时候可能有道还没有用什么反爬虫吧,所以经过自己的捣鼓以及参考了第二个博客现在终于实现了,还是很开心,谢谢自己坚持下来,学到了不少东西,和大家分享一下吧。

首先说明一下用到的工具:火狐浏览器的Web开发者的network工具,用它我们可以清楚看到我们在有道上查一个单词或者词语的时候发出和收到的HTTP/HTTPS请求和响应内容,这个是我们实现爬虫的基础,用来我们构造请求头以及确定我们用get方法还是post方法,在这里呢通过看请求头发现查询用的是post方法,那么呢,我们还需要这个工具来构造我们的提交内容,这里是整个爬虫能不能实现,也是破解有道反爬虫的关键,会在下面详细说!!!!!

我们先看一下我查一个单词用火狐的network工具得到的内容吧


箭头1处,是我们构建爬虫的URL,2处我们得到使用的方法是Post,再通过3确定要提交的是表单,我们根据请求头的格式构造我们自己的请求头,4这里我们构建请求头时要特别注意,每次查询时Cookie的值都不同,下面细讲


上图是我们构造表单内容需要的格式,箭头5,6这里就是反爬虫的机制,也是我们代码能否实现的关键,也下面讲如何确定salt、sign的值。

现在开始介绍如何确定构造cookie,salt,以及sign的值吧,使用的工具依然是network,它的堆栈跟踪,如下图


我们点箭头指的链接跳到下图:


然后为了更好的研究把箭头指的内容我们用站长工具http://tool.chinaz.com/tools/jsformat.aspx来更好的显示。

搜索到salt,可以看到下面一段js代码

t.translate = function(e, t) {

        T = u("#language").val();

        var n = b.val(),

        r = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10)),

        o = u.md5(S + n + r + D),

        a = n.length;

        if (L(), w.text(a), a > 5e3) {

            var l = n;

            n = l.substr(0, 5e3),

            o = u.md5(S + n + r + D);

            var c = l.substr(5e3);

            c = (c = c.trim()).substr(0, 3),

            u("#inputTargetError").text("有道翻译字数限制为5000字,“" + c + "”及其后面没有被翻译!").show(),

            w.addClass("fonts__overed")

        } else w.removeClass("fonts__overed"),

        u("#inputTargetError").hide();

        f.isWeb(n) ? i() : s({

            i: n,

            from: _,

            to: C,

            smartresult: "dict",

            client: S,

            salt: r,

            sign: o,

            doctype: "json",

            version: "2.1",

            keyfrom: "fanyi.web",

            action: e || "FY_BY_DEFAULT",

            typoResult: !1

        },

        t)

    },

    t.showResult = a

}),

可以看出salt,sign的值分别为r,o,在上面我已经加粗显示,r就是系统当前时间戳加上一个1到10之间的随机整数,o是一个获取S + n + r + D字符串的md5值(这个可以百度一下),所以python代码中我们需要用到time,random以及hashlib(获取S + n + r + D字符串的md5值)这些库。S的值可以看到对应的是请求报文中的client值fanyideskweb,n是查询的内容,r就是salt,D我们也可以通过查看js脚本找到它对应的值为ebSeFb%=XZ%T[KZ)c(sy!

这样之后我们的表单就可以构建好了,但我们在查询不同内容的时候,请求头里的cookie也是不同的,所以我们还需要找到cookie值的构造规律,这个是在v1.js这个脚本中找到的如下图


同样的,我们用站长工具搜索Cookie找到如下代码:


可以看到cookie最后一串数字其实就是系统当前的时间戳。

好喽,找到salt、sign、Cookie后我们就已经要成功了,可以附上我的代码喽,不知道怎么把代码很好的展示出来,我就直接粘贴过来吧。。。对了,还有一件事情要说,就是URL的值我是就直接用的请求头里的URL的,只要把salt、sign和Cookie成功构造好,就不会出现网上的那些错误,也不需要去掉_o


import requests
from bs4 import BeautifulSoup
import json
import time
import random
import hashlib
def crawl_youdao():
    while True:
        content =raw_input('请输入要查询的单词/词语(输入0退出翻译):')
        d = content
        if content == '0':
            print('欢迎下次使用!')
            break
        url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule '
        ctime=int(time.time()*1000)#!!!
        headers = {
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'Accept-Encoding':'gzip, deflate',
            'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
            'Cache-Control': 'no-cache',
            'Connection': 'keep-alive',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        #!!!
            'Cookie':'YOUDAO_MOBILE_ACCESS_TYPE=1; OUTFOX_SEARCH_USER_ID=-1289760786@10.168.8.76; OUTFOX_SEARCH_USER_ID_NCOO=939708194.3484184; _ntes_nnid=3261dca1448d041f16596bf4942976dd,1524295653112; JSESSIONID=aaaWj8T4yP2lIcfjqeSlw; ___rl__test__cookies='+str(ctime),
            'Host': 'fanyi.youdao.com',
            'Pragma': 'no-cache',
            'Referer': 'http://fanyi.youdao.com/',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0',  
            'X-Requested-With': 'XMLHttpRequest'
            }
        salt=str(ctime+random.randint(1,10))#!!!
        sign = hashlib.md5("fanyideskweb" + content + salt + "ebSeFb%=XZ%T[KZ)c(sy!").hexdigest()#!!!!
        data={
            'from':'AUTO',
            'to':'AUTO',
            'smartresult':'dict',
            'client':'fanyideskweb',
            'doctype':'json',
            'version':'2.1',
            'keyfrom':'fanyi.web',
            'action':'FY_BY_REALTIME',
            'typoResult':'true',
            'i':content,
            'salt': salt,
            'sign':sign     
        }

        res = requests.post(url,params =data, headers=headers)
        soup = BeautifulSoup(res.text,'lxml')
        jd = json.loads(soup.text)
        #print soup.text
        #print jd
        print('翻译结果:')
   
        for translate in jd['smartResult']['entries']:
           print(translate)
        print('\n')

if __name__=='__main__':
    crawl_youdao()

然后然后就是看看我的程序运行结果吧,终于实现了,好开心啊,开心到飞起~~~,写出来和大家分享一下我内心的喜悦~~~~~


特别感谢:https://blog.csdn.net/shadkit/article/details/79174948

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容

  • 以前,很多人学习Python爬虫的第一个爬虫就是爬的有道翻译,但是现在由于有道翻译进行了参数加密,增加了反爬机制,...
    sexy_cyber阅读 1,586评论 0 0
  • 破解有道翻译反爬虫机制 web端的有道翻译,在之前是直接可以爬的。也就是说只要获取到了他的接口,你就可以肆无忌惮的...
    编程小蝉阅读 6,107评论 10 28
  • 感恩昨天启明星对股东及对我的看重,感恩老婆对我昨晚上的一番肺腑之言,感恩老妈每天如此早的过来帮忙,感恩丈母娘昨晚辛...
    2月31日阅读 144评论 0 0
  • 准备了很多材料明天去面试,毕业季求职之路真的不容易呢,希望自己加油,尽人事,听天命。
    格格亦吾阅读 82评论 0 0
  • 人生过半,离別总是感触很多。 在建达大厦里工作了五年多,对面就是中国作协。对于小县城里出来爱好文学的我,那...
    佳楠木阅读 141评论 0 0