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获取源码
Python爬虫入门教程 61-100 写个爬虫碰到反爬了,动手破坏它!的更多相关文章
- Python爬虫入门教程 4-100 美空网未登录图片爬取
美空网未登录图片----简介 上一篇写的时间有点长了,接下来继续把美空网的爬虫写完,这套教程中编写的爬虫在实际的工作中可能并不能给你增加多少有价值的技术点,因为它只是一套入门的教程,老鸟你自动绕过就可 ...
- Python爬虫入门教程 13-100 斗图啦表情包多线程爬取
斗图啦表情包多线程爬取-写在前面 今天在CSDN博客,发现好多人写爬虫都在爬取一个叫做斗图啦的网站,里面很多表情包,然后瞅了瞅,各种实现方式都有,今天我给你实现一个多线程版本的.关键技术点 aioht ...
- Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分
1. 爬取前的分析 mitmdump是mitmproxy的命令行接口,比Fiddler.Charles等工具方便的地方是它可以对接Python脚本. 有了它我们可以不用手动截获和分析HTTP请求和响应 ...
- Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分
1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...
- Python爬虫入门教程 37-100 云沃客项目外包网数据爬虫 scrapy
爬前叨叨 2019年开始了,今年计划写一整年的博客呢~,第一篇博客写一下 一个外包网站的爬虫,万一你从这个外包网站弄点外快呢,呵呵哒 数据分析 官方网址为 https://www.clouderwor ...
- Python爬虫入门教程 36-100 酷安网全站应用爬虫 scrapy
爬前叨叨 2018年就要结束了,还有4天,就要开始写2019年的教程了,没啥感动的,一年就这么过去了,今天要爬取一个网站叫做酷安,是一个应用商店,大家可以尝试从手机APP爬取,不过爬取APP的博客,我 ...
- 2019-03-22 Python Scrapy 入门教程 笔记
Python Scrapy 入门教程 入门教程笔记: # 创建mySpider scrapy startproject mySpider # 创建itcast.py cd C:\Users\theDa ...
- Python基础入门教程
Python基础入门教程 Python基础教程 Python 简介 Python环境搭建 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 Python 循 ...
- python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题
python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题 一丶爬虫概述 通过编写程序'模拟浏览器'上网,然后通 ...
随机推荐
- [ SSH框架 ] Struts2框架学习之一
一.Struts2框架的概述 Struts2是一种基于MVC模式的轻量级Web框架,它自问世以来,就受到了广大Web开发者的关注,并广泛应用于各种企业系统的开发中.目前掌握 Struts2框架几乎成为 ...
- 在Windows上安装FFmpeg程序的方法(you-get下载视频必备程序)
FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库libavcodec. 该程序 ...
- YOLO_Online 将深度学习最火的目标检测做成在线服务实战经验分享
YOLO_Online 将深度学习最火的目标检测做成在线服务 第一次接触 YOLO 这个目标检测项目的时候,我就在想,怎么样能够封装一下让普通人也能够体验深度学习最火的目标检测项目,不需要关注技术细节 ...
- Taurus.MVC 支持Asp.Net Core 的过程
前言: 这些天,似乎.NET Core相关的新闻和文章经常在我眼前晃~~~ 昨天,微软又发布了.Core 2.1,又愰了一下,差点没亮瞎我的眼睛. 好吧,大概是上天给我的暗示,毕竟 CYQ.Data ...
- Python函数化编程整理
1.映射函数 items=[1,2,3,4,5] def inc(x): return x+1 list(map(inc,items)) [2, 3, 4, 5, 6] >>> a ...
- Java io使用简介
图:Java io概览图 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更 ...
- C++内存深入理解
转载地址:http://www.cnblogs.com/DylanWind/archive/2009/01/12/1373919.html 前部分原创,转载请注明出处,谢谢! class Base ...
- nginx常用配置系列-静态资源处理
接上篇,nginx处理静态资源的能力很强,后端服务器其实也可以处理静态资源,比如tomcat,但把非业务类的单一数据交给后端处理显然效率比较低,还有一种场景是多个站点公用一套资源集时,通过nginx可 ...
- spring 切入点表达式
spring表达式有多种的指示符,如: 切入点指示符用来指示切入点表达式目的,,在Spring AOP中目前只有执行方法这一个连接点,Spring AOP支持的AspectJ切入点指示符如下: exe ...
- PAT1048:Find Coins
1048. Find Coins (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Eva loves ...