文章目录

  • 一、JS反爬
    • 1.环境搭建
      • 安装node.js
      • 安装js代码调试工具
      • 安装 PyExecJs模块
    • 2.JS中常见的算法
      • MD5算法
      • DES/AES算法
        • AES和DES的区别
      • RSA算法
      • base64加密算法
    • 3.案例演示
  • 二、字体反爬
    • 1.什么是字体反爬?
    • 2.如何解决字体反爬?
  • 三、验证码图片反爬
  • 四、行为验证反爬
  • 五、ip反爬
  • ua反爬

一、JS反爬

1.环境搭建

安装node.js

下载网站:https://nodejs.org/en/download/
参考网站:https://blog.csdn.net/qq_41465646/article/details/107656044

安装js代码调试工具

发条js代码调试工具

安装 PyExecJs模块

pip install PyExecJs -i https://pypi.douban.com/simple

2.JS中常见的算法

• 线性散列MD5算法
• 对称加密DES/AES算法
• 非对称加密算法RSA
• base64加密算法

MD5算法

MD5是一种被广泛使用的线性散列算法,可以产出一个128位(16字节)的散列值(hash value),用于确保信息传输完整的一致性。且MD5加密之后产生的是一个固定长度(32位或16位)数据
https://cdn.bootcdn.net/ajax/libs/blueimp-md5/1.0.1/js/md5.js

DES/AES算法

DES对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密钥(称为对称密码),是一种对称加密算法

AES和DES的区别

• 加密后密文长度不同
• DES加密后密文长度是8的整数倍
• AES加密后密文的长度是16的整数倍
• 安全度不同
• 一般情况下DES足够安全
• 如果要求高可以使用AES
• DES和AES切换只需要修改CryptoJS.DES =>CryptoJS.AES

RSA算法

RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。
非对称加密需要2个密钥
• 公开密钥(publickey:公钥)
• 私有密钥(privatekey:私钥)
• 公钥和私钥是一对

base64加密算法

base64是一种用64个字符来表示任意二进制数据的方法。
base64使用 A–Z a–z 0–9 + / 这64个字符实现对数据的加密

3.案例演示

微信公众平台:https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=40987134
steam平台:https://store.steampowered.com/login/?redir=&redir_ssl=1
完美世界:https://passport.wanmei.com/login?location=L3NhZmUv

二、字体反爬

1.什么是字体反爬?

就是网页的制作者,它在发布他网页数据的时候。将其中一部分的字体变成乱码。即使你把网页的数据爬取下来,你也获取不到真实数据的样貌。这样就达到了一个反爬虫的目的

2.如何解决字体反爬?

• 1 下载.ttf文件
• 2 将.ttf文件转换成xml文件
• 3 分析字体规律找到映射关系
测试网站
https://club.autohome.com.cn/bbs/thread/665330b6c7146767/80787515-1.html

三、验证码图片反爬

import requests
from hashlib import md5
from PIL import Image
from selenium import webdriver
import time
from selenium.webdriver import ActionChainsclass Chaojiying_Client(object):def __init__(self, username, password, soft_id):self.username = usernamepassword =  password.encode('utf8')self.password = md5(password).hexdigest()self.soft_id = soft_idself.base_params = {'user': self.username,'pass2': self.password,'softid': self.soft_id,}self.headers = {'Connection': 'Keep-Alive','User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',}def PostPic(self, im, codetype):"""im: 图片字节codetype: 题目类型 参考 http://www.chaojiying.com/price.html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)return r.json()def ReportError(self, im_id):"""im_id:报错题目的图片ID"""params = {'id': im_id,}params.update(self.base_params)r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)return r.json()# chaojiying = Chaojiying_Client('Jerry1234 ', '123456', '914400')  # 用户中心>>软件ID 生成一个替换 96001
# im = open('code2.png', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
# print(chaojiying.PostPic(im, 9004)['pic_str'])driver = webdriver.Chrome()
# 加载登录页面
driver.get('https://kyfw.12306.cn/otn/login/init')
time.sleep(5)
# 对加载的页面进行截图并保存
driver.save_screenshot('code.png')
# 定位图片
code_img_element = driver.find_element_by_class_name('touclick-image')
lacation = code_img_element.location # 验证码图片左上角的坐标 lacation 它是个字典
size = code_img_element.size # 验证码图片对应的是长和宽 size 也是个字典
# 左上角和右下角坐标
rangle = (int(lacation['x']),int(lacation['y']),int(lacation['x']+size['width']),int(lacation['y']+size['height']))i = Image.open('./code.png') # 打开整张截图
code_img_name = './yzm.png'
frame = i.crop(rangle) # crop() 根据指定区域进行裁剪
frame.save(code_img_name)# 将验证码图片提交给超级鹰进行识别
chaojiying = Chaojiying_Client('Jerry1234 ', '123456', '914400')
im = open('yzm.png', 'rb').read()
print(chaojiying.PostPic(im, 9004)['pic_str'])result = chaojiying.PostPic(im, 9004)['pic_str']
all_lst = [] # 存储要被点击的点的坐标 [[],[]]
if '|' in result: # 判断竖线是否在返回的结果中 如果有竖线就进行分割lst1 = result.split('|')count1 = len(lst1)  # 获取长度for i in range(count1):xy_lst = []x = int(lst1[i].split(',')[0])y = int(lst1[i].split(',')[1])xy_lst.append(x)xy_lst.append(y)all_lst.append(xy_lst)
else:x = int(result.split(',')[0])y = int(result.split(',')[1])xy_lst = []xy_lst.append(x)xy_lst.append(y)all_lst.append(xy_lst)
print(all_lst)# 遍历列表使用行为链对每一个列表元素对应的x,y指定的位置进行点击
for l in all_lst:x = l[0]y = l[1]# 将参照物移动到验证码图片 code_img_element(验证码图片的元素)ActionChains(driver).move_to_element_with_offset(code_img_element,x,y).click().perform()time.sleep(0.5)

四、行为验证反爬

from selenium import  webdriver
import time
from selenium.webdriver import ActionChains
from selenium.common.exceptions import NoSuchElementException,StaleElementReferenceExceptiondef login():driver = webdriver.Chrome()driver.get('https://i.qq.com/')time.sleep(2)# 切换iframedriver.switch_to.frame(driver.find_element_by_id('login_frame'))# 切换登录方式driver.find_element_by_id('switcher_plogin').click()driver.find_element_by_id('u').send_keys('192149641')driver.find_element_by_id('p').send_keys('logic12345')time.sleep(1)driver.find_element_by_id('login_button').click()time.sleep(2)# 创建行为链对象actions = ActionChains(driver)# 切换拖动验证的iframe tcaptcha_iframedriver.switch_to.frame(driver.find_element_by_id('tcaptcha_iframe'))# x坐标的偏移量x = 165flag = Truewhile flag:try:# 定位拖动按钮tcaptcha_drag_thumb = driver.find_element_by_id('tcaptcha_drag_thumb')# 按下拖动actions.drag_and_drop_by_offset(tcaptcha_drag_thumb,xoffset=x,yoffset=0).perform()except NoSuchElementException:driver.quit()login()time.sleep(2)try:actions.drag_and_drop_by_offset(tcaptcha_drag_thumb, xoffset=x, yoffset=0).perform()except StaleElementReferenceException:passx = x + 5 # 每次偏移量+5time.sleep(1)try:driver.find_element_by_id('feed_tab_my')breakexcept NoSuchElementException:print('未登录到主页')login()

参考文章
https://www.cnblogs.com/xiao-apple36/p/8878960.html

五、ip反爬

设置代理ip
http://httpbin.org/ip 返回当前的ip地址
https://www.ipip.net/ 查看当前的ip地址
https://h.wandouip.com/member/index 比较好用的ip代理平台

ua反爬

爬虫中非常重要的一种反反爬策略
user-agent 用户代理
解决方式
• 添加随机的user-agent
• fake_useragent

爬虫 第九讲 反爬的策略相关推荐

  1. Python爬虫学习第九天---反爬与反反爬

    反爬与反反爬 一.常见反爬手段和解决思路 1.服务器反爬原因 1.爬虫占总PV比例较高,这样浪费钱. 2.三月份爬虫:每年的三月份我们会迎接一次爬虫高峰期,有大量的硕士在写论文的时候会选择爬取一些往网 ...

  2. Python爬虫:字体反爬处理(猫眼+汽车之家)-2018.10

    环境:Windows7 +Python3.6+Pycharm2017 目标:猫眼电影票房.汽车之家字体反爬的处理 -全部文章: 京东爬虫 .链家爬虫.美团爬虫.微信公众号爬虫.字体反爬.Django笔 ...

  3. 7 爬虫学习之反爬与反反爬

    一.常见的反爬手段和解决思路 1.服务器反爬的原因 a.爬虫占总PV(PV是指页面的访问次数,每打开或刷新一次页面,就算做一个PV)比例较高,这样浪费钱(尤其是三月份爬虫[爬虫高峰期]). b.公司可 ...

  4. python爬虫常见反爬措施_爬虫常见的反爬措施有哪些

    爬虫常见的反爬措施有三种: 1.header头部信息 解决方法: 加User-Agent值: 如果不加header头,部分网站服务器判断不到用户的访问来源,所以会返回一个404错误来告知你是一个爬虫, ...

  5. 有道翻译 爬虫,分析反爬 附代码

    有道翻译 爬虫,破解反爬加密 0引言 1准备工作 开始第一部分 开始第二部分 准备工作,下载并安装requests模块 确定反爬用的变量 确定变量的值 requests模块的使用 0引言 我在这里会很 ...

  6. 【python】——爬虫05 初级反爬笔记

    这里写自定义目录标题 一.反爬 1. 反爬原因 2. 服务器常反爬虫 3. 一些概念 4. 反爬方向 4.1 基于身份识别进行反爬 headers 请求参数 4.2 基于爬虫行为进行反爬 请求频率 爬 ...

  7. python爬图片_网络爬虫经验:反爬和反反爬

    我想很多人入门python是图片爬虫,就是HTTP请求,保存一下图片,用python实现非常快.网上很多爬虫的教程就讲到这里,实际上很单一,看了跟没看没什么区别,都是找一下网页的规律,然后Beauti ...

  8. Python爬虫---猫眼字体反爬

    在做过汽车之家论坛的字体反爬过后,信心稍微增长点,那么索性找点字体文件反爬的网址,猫眼便是一个不错的网址,那么便开始搞起来. 目标网址 https://piaofang.maoyan.com/?ver ...

  9. 爬虫--09:反爬机制

    Crawler--09: Anti-Crawling-Mechanismus 一.ua反爬 二.IP反爬 1.相关网址 2.ip反爬 三.图形验证码反扒 1.解决办法 2.tesseract 的使用 ...

最新文章

  1. iOS 数组中的模型去重
  2. 步进或伺服运动控制偏位问题:现象、原因及解决办法
  3. DL之DNN优化技术:DNN中参数初始化【Lecun参数初始化、He参数初始化和Xavier参数初始化】的简介、使用方法详细攻略
  4. 栈的应用--进制转换
  5. 自动瘦脸与眼睛放大美颜算法
  6. Mysql使用存储过程与函数进行批量插入数据
  7. java方法示例注释 @_Java注释和真实世界的Spring示例
  8. java privilege的用法_java反射--注解的定义与运用以及权限拦截
  9. 100999凑整到万位进一_四年级数学专项练习
  10. 我和linux的第十三天
  11. Linux下C语言实现俄罗斯方块——详细版
  12. linux中红帽系统下载地址,Redhat8.3系统下载
  13. java开发表格,JAVA开发简历表格下载
  14. Usability Engineering
  15. cmd 如何跨驱动器移动文件夹
  16. 常用的前端JavaScript方法封装
  17. C++学习笔记-STL
  18. C语言简易程序设计————6、用*号输出字母C的图案
  19. 哪一个属于计算机外存储器,下边哪一个属于计算机的外存储器()
  20. 【产品管理】产品管理四要素

热门文章

  1. 将 varchar 值 'ACCE5057EC423F7C' 转换成数据类型 int 时失败
  2. OSChina 周五乱弹 —— 中国队坐马航回来了?
  3. LikeLib跨链技术方案之哈希锁定
  4. 三星s10刷linux,刷机神器TWRP布支持三星Galaxy S10+ 刷机不怕砖
  5. 基于Docker搭建Elasticsearch集群
  6. OFSA 究竟是做什么的--来自大师的感悟
  7. 盘古开源:从认知思维革新到数字化转型,如何推动分布式存储建设生态的发展
  8. 教师资格证备考之计算机基础知识
  9. go高效缓存框架教你实现
  10. 企业微信投票可以多选吗