这里写自定义目录标题
一、反爬
1. 反爬原因
- 爬虫占PV比例高,费钱(三月爬虫
- 资源被批量抓走
- GREY
2. 服务器常反爬虫
- 低级的-不管服务器压力
- 失控的小爬虫
- 成型的商业对手
- 抽风搜索引擎
3. 一些概念
- 爬虫:获取数据的任何技术手段 ,批量
- 反爬虫:阻止获取数据的任何技术手段 ,批量
- 误伤:错将普通用户为爬虫
- 拦截
- 资源:机器 人力
4. 反爬方向
- 基于身份识别进行反爬
- 基于爬虫行为进行反爬
- 基于数据加密进行反爬
4.1 基于身份识别进行反爬
headers
- User-Agent
- referer
- cookies
请求参数
- html静态文件中获取
- 发送请求获取数据
- js生成
- 验证码
4.2 基于爬虫行为进行反爬
请求频率
- 请求ip单位时间请求数量——购买多个账号
- 请求间隔——随机休眠
- 请求次数阈值
爬取步骤
- 通过js实现跳转反爬——抓包分析
- 通过蜜罐获取爬虫ip——找缺陷
- 通过假数据反爬
- 阻塞任务队列
- 阻塞网络IO——多线程
4.3 基于数据加密进行反爬
对响应中含有的数据进行特殊化处理
- 特殊字体
- css位移
- 图片
- 编码格式
二、验证码
1. 图片验证码
- 验证码 CAPTCHA
- 区分人工、工具
2. 图片识别引擎
- 安装tesseract.exe
- 安装python模块pillow
3. 打码平台
会使用接口
三、js解析
1.定位
- 定位 发送请去的包
- search关键字定位
- 元素绑定的事件监听函数定位
2. 加密步骤、py模拟
法一:第三方js加载模块
模块js2py、pyv8 execjs一个翻译工具
人人网登录抓包
包:login 向服务器发送请求 post ,做验证
查看post中的数据,密码做过处理
搜索,无果
切换到手机端(login以上的包 都没显示了
xhr
属于ajax请求(rkey、clog
如何获取加密后的密码——get(rkey的url)就可了
定位加密文件
通过clog的initiator
celllog.js
查找rkey
检查登录没触登录后,才触发函数
登录按钮绑定了事件——Event Listeners
——绑定回调函数
找到加密函数,遇到的函数直接ctrl F定位
# 分析需要的:
# t这个对象
# 导入函数
t.password = t.password.split("").reverse().join(""),
setMaxDigits(130);
var 0 =nes RSAKeyPair(n.e,"",n.n),
r = encryptedString(o, t.password);
t.password = r ,
t.rkey = n.rkey
法二:python重现
有道翻译
蚌埠住了,那天(周二网技)解决不了的反爬要在这里解决了
把这个数据拿出来
i: 坚定选择你
from: AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 16368251416712
sign: 4ee9d8a60f9a753238307381d8360729
lts: 1636825141671
bv: 2c5a61877bd32cbd1c3db560d35de93d
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_REALTlME
其实只要找这三个值由来
salt: 16368251416712
sign: 4ee9d8a60f9a753238307381d8360729
lts: 1636825141671
定位:
- 找initiate
- 查找所有文件
salt
sign
lts
改了一段时间的成功,面向对象学的像屎一样
import requests
import hashlib
import time
import random
import json
class Youdao(object):
def __init__(self, word):
self.url = "https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44",
"Cookie": "[email protected]; JSESSIONID=aaacVY1-8tYZ-bbE6OuMx; JSESSIONID=abcTpnzjEZLepfAy6OuMx; OUTFOX_SEARCH_USER_ID_NCOO=850288843.93545; UM_distinctid=179cabdde7ab32-0a0062b4a9d564-51361244-144000-179cabdde7b4ed; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; _ntes_nnid=c8abec4478ea4f7ceb5d9fceb62cbf81,1622604145716; _ga=GA1.2.1317045666.1630461915; SESSION_FROM_COOKIE=unknown; ___rl__test__cookies=1636904424584",
"Referer": "https://fanyi.youdao.com/"
}
self.DATA = None
self.word = word
def generate(self):
# ts: r = "" + (new Date).getTime()
# salt: =ts + parseInt(10 * Math.random(), 10);
# sign: n.md5("fanyideskweb" + e + i + "Y2FYu%TNSbMCxc3t2u^XT") salt是i
lts = str(int(time.time() * 1000))
salt = lts + str(random.randint(0, 9))
aaa = "fanyideskweb" + self.word + salt + "Y2FYu%TNSbMCxc3t2u^XT"
md5 = hashlib.md5()
md5.update(aaa.encode())
sign = md5.hexdigest()
self.DATA = {
"i": self.word,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": salt,
"sign": sign,
"lts": lts,
"bv": "350570558960e08a67e4e9303822810a",
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_CLICKBUTTION"
}
def get_data(self):
# print(self.DATA)
response = requests.post(self.url, headers=self.headers, data=self.DATA)
return response.content
def parse_data(self, data):
dict_data = json.loads(data)
# try:
# print(dict_data)
# except:
print(dict_data['translateResult'])
def run(self):
self.generate()
# print(self.DATA)
data = self.get_data()
# print(data)
self.parse_data(data)
if __name__ == "__main__":
youdao = Youdao("平安")
youdao.run()