python爬虫反爬对抗_Python爬虫入门教程 61-100 写个爬虫碰到反爬了,动手破坏它!...

python3爬虫遇到了反爬

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

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

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

emmmm....

搞定javascript加密

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

16a43ad5abd717bd?w=938&h=939&f=png&s=133107

接下来你要注意的是这个请求是由哪个Js文件发起的

16a43ad5abc7f0f7?w=1052&h=146&f=png&s=26222

文件获取到为 fanyi.min.js,继续追踪,鼠标在这个文件名上面停留一下就可以获取到基本信息,我们点击跟请求相关的那个方法对应的文件链接,跳转到方法内部

16a43ad5abe1ed92?w=933&h=222&f=png&s=45007

这个地方有个操作细节,你需要学会,点击文件之后,跳转到的JS文件是压缩之后的,进行一下格式化操作

16a43ad5abf15d0a?w=1103&h=280&f=png&s=68569

拿到源码

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获取源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值