python 常见的反爬虫策略


Posted in Python onSeptember 27, 2020

1、判断请求头来进行反爬

这是很早期的网站进行的反爬方式

User-Agent 用户代理
referer 请求来自哪里
cookie 也可以用来做访问凭证
解决办法:请求头里面添加对应的参数(复制浏览器里面的数据)

2、根据用户行为来进行反爬

请求频率过高,服务器设置规定时间之内的请求阈值
解决办法:降低请求频率或者使用代理(IP代理)
网页中设置一些陷阱(正常用户访问不到但是爬虫可以访问到)
解决办法:分析网页,避开这些特殊陷阱
请求间隔太短,返回相同的数据
解决办法:增加请求间隔

3、js加密

反爬方式中较为难处理的一类。
js加密的原理:服务器响应给浏览器的js文件,可以动态的生成一些加密参数,浏览器会根据js的计算 得到这些参数,在请求中带入进来,如果请求中没有这些参数,那么服务器就任务请求无效。

python 常见的反爬虫策略

4、字体加密

字体反爬,是一种常见的反爬技术,网站采用了自定义的字体文件,在浏览器上正常显示,但是爬虫抓取下来的数据要么就是乱码,要么就是变成其他字符。采用自定义字体文件是CSS3的新特性,熟悉前端的同学可能知道,就是font-face属性。

python 常见的反爬虫策略

5、登录验证码

使用Python爬取网页内容时往往会遇到使用验证码登陆才能访问其网站,不同网站的使用的验证码也不同,在最开始使用简单验证码,识别数字,但是随着反爬的不断发展,慢慢设计出了更多复杂的验证码,比如:内容验证码、滑动验证码、图片拼接验证码等等。
网上有很多打码平台,通过注册账号,调用平台接口,进行验证码的验证。

python 常见的反爬虫策略

6、md5相关知识

MD5,消息摘要算法,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。MD5的特点:
1.不可逆:不能从密文推导出明文。
2.不管明文长度为多少,密文的长度都固定。
3.密文之间不会重复。

import hashlib
print(hashlib.md5('python'.encode()).hexdigest())

字符串python加密后的结果:

23eeeb4347bdd26bfc6b7ee9a3b755dd

7、base64

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。

import base64

#python中base64的加密
print(base64.b64encode('python'.encode()).decode())
#python中base64的解密
print(base64.b64decode('Y2hpbmE='.encode()).decode())

结果:

cHl0aG9u
china

二、验证码验证

自己动手看验证码(古诗词网)

import requests

url = "gushiwen.org"

session = requests.Session()

text = session.get(url).text

# 解析响应,找到验证码的图片地址,
# 下载验证码图片,保存
with open('code.jpg', 'wb')as f:
  f.write('验证码的url地址'.encode())

code = input('验证码是: ')

login_url = "login.com"

data = {
  "username": 'xx',
  "password": 'xx',
  "code": code
}
requests.post(url, data=data)

使用打码平台(图鉴)

新建一个captcha_api.py

import json
import requests
import base64
from io import BytesIO
from PIL import Image
from sys import version_info


def base64_api(uname, pwd, img):
  img = img.convert('RGB')
  buffered = BytesIO()
  img.save(buffered, format="JPEG")
  if version_info.major >= 3:
    b64 = str(base64.b64encode(buffered.getvalue()), encoding='utf-8')
  else:
    b64 = str(base64.b64encode(buffered.getvalue()))
  data = {"username": uname, "password": pwd, "image": b64}
  result = json.loads(requests.post("http://api.ttshitu.com/base64", json=data).text)
  if result['success']:
    return result["data"]["result"]
  else:
    return result["message"]
  return ""


def request_captcha(uname, pwd, img_path):
  img_path = img_path # 待验证的验证码路径
  img = Image.open(img_path)
  result = base64_api(uname, pwd, img)
  # 传入账号 密码 和图片
  print(result)

新建use_code.py,调用接口

img_path = '图片路径'

from captcha_api import request_captcha

ret = request_captcha("账号", "密码", img_path)

以上就是python 常见的反爬虫策略的详细内容,更多关于python反爬虫的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python中while循环语句用法简单实例
May 07 Python
python中import学习备忘笔记
Jan 24 Python
python中字符串比较使用is、==和cmp()总结
Mar 18 Python
numpy 计算两个数组重复程度的方法
Nov 07 Python
对python中dict和json的区别详解
Dec 18 Python
Python实现对特定列表进行从小到大排序操作示例
Feb 11 Python
python实现猜拳小游戏
Apr 05 Python
Python实现把多维数组展开成DataFrame
Nov 30 Python
python脚本监控logstash进程并邮件告警实例
Apr 28 Python
Python脚本破解压缩文件口令实例教程(zipfile)
Jun 14 Python
python中常见错误及解决方法
Jun 21 Python
python绘制雷达图实例讲解
Jan 03 Python
python 5个实用的技巧
Sep 27 #Python
Python日志器使用方法及原理解析
Sep 27 #Python
python 爬取免费简历模板网站的示例
Sep 27 #Python
python如何提升爬虫效率
Sep 27 #Python
python操作链表的示例代码
Sep 27 #Python
python用tkinter实现一个简易能进行随机点名的界面
Sep 27 #Python
python实现暗通道去雾算法的示例
Sep 27 #Python
You might like
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
php封装的图片(缩略图)处理类完整实例
2016/10/19 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
2017/05/29 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
用js实现随机返回数组的一个元素
2007/08/13 Javascript
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
用js闭包的方法实现多点标注冒泡示例
2014/05/29 Javascript
JavaScript Promise启示录
2014/08/12 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
2017/01/19 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
2017/03/02 Javascript
使用vue.js编写蓝色拼图小游戏
2017/03/17 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
2017/04/10 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
[02:47]DOTA2亚洲邀请赛 HR战队出场宣传片
2015/02/07 DOTA
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
对python中两种列表元素去重函数性能的比较方法
2018/06/29 Python
浅析python3字符串格式化format()函数的简单用法
2018/12/07 Python
windows下搭建python scrapy爬虫框架步骤
2018/12/23 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
自荐书4要点
2014/01/25 职场文书
卖房协议书
2014/04/11 职场文书
5s推行计划书
2014/05/06 职场文书
新闻人物通讯稿
2014/10/09 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers