【爬虫开发】爬虫从0到1全知识md笔记第7篇:反爬与反反爬,验证码处理【附代码文档】
爬虫开发从0到1全知识教程完整教程(附代码资料)主要内容讲述:爬虫课程概要,爬虫基础爬虫概述,,http协议复习。requests模块,requests模块1. requests模块介绍,2. response响应对象,3. requests模块发送请求,4. requests模块发送post请求,5. 利用requests.session进行状态保持。数据提取概要,数据提取概述1. 响应内容的分类,2. 认识xml以及和html的区别,1. jsonpath模块的使用场景,2. jsonpath模块的使用方法,3. jsonpath练习,1. 了解 lxml模块和xpath语法。Selenium课程概要selenium的介绍,selenium提取数据。Selenium课程概要,反爬与反反爬selenium的其它使用方法。反爬与反反爬常见的反爬手段和解决思路。反爬与反反爬验证码处理,chrome浏览器使用方法介绍。反爬与反反爬,Mongodb数据库JS的解析,介绍,内容,mongodb文档,Mongodb的介绍和安装,小结。Mongodb数据库介绍,内容,mongodb文档,mongodb的简单使用,小结,Mongodb的的增删改查。Mongodb数据库介绍,内容,mongodb文档,mongodb的聚合操作,2 mongodb的常用管道和表达式,Mongodb的索引操作。Mongodb数据库,scrapy爬虫框架介绍,内容,mongodb文档,mongodb和python交互,小结,介绍。scrapy爬虫框架,scrapy爬虫框架介绍,内容,scrapy官方文档,scrapy的入门使用,小结,介绍。scrapy爬虫框架介绍,内容,scrapy官方文档,scrapy管道的使用,小结,scrapy的crawlspider爬虫。scrapy爬虫框架介绍,内容,scrapy官方文档,scrapy中间件的使用,小结,scrapy_redis概念作用和流程。scrapy爬虫框架介绍,内容,scrapy官方文档,scrapy_redis原理分析并实现断点续爬以及分布式爬虫,小结,scrapy_splash组件的使用。scrapy爬虫框架介绍,内容,scrapy官方文档,scrapy的日志信息与配置,小结,scrapyd部署scrapy项目。利用appium抓取app中的信息,利用appium抓取app中的信息介绍,内容,appium环境安装,介绍,内容,利用appium自动控制移动设备并提取数据。appium环境安装,Mongodb的介绍和安装,小结。scrapy的概念和流程 ,小结,selenium的介绍,常见的反爬手段和解决思路。数据提取概述1. 响应内容的分类,2. 认识xml以及和html的区别,爬虫概述,http协议复习。mongodb的简单使用,小结,scrapy的入门使用,小结。selenium提取数据,利用appium自动控制移动设备并提取数据。验证码处理。数据提取-jsonpath模块1. jsonpath模块的使用场景,2. jsonpath模块的使用方法,3. jsonpath练习,chrome浏览器使用方法介绍,Mongodb的的增删改查,小结。scrapy数据建模与请求,小结,selenium的其它使用方法。数据提取-lxml模块1. 了解 lxml模块和xpath语法,2. 谷歌浏览器xpath helper插件的安装和使用,3. xpath的节点关系,4. xpath语法-基础节点选择语法,5. xpath语法-节点修饰语法,6. xpath语法-其他常用节点选择语法。JS的解析,mongodb的聚合操作,2 mongodb的常用管道和表达式。scrapy模拟登陆,小结,Mongodb的索引操作,小结,scrapy管道的使用,小结。Mongodb的权限管理,小结,scrapy中间件的使用,小结。mongodb和python交互,小结,scrapy_redis概念作用和流程,小结,scrapy_redis原理分析并实现断点续爬以及分布式爬虫,小结。scrapy_splash组件的使用,小结,scrapy的日志信息与配置,小结。scrapyd部署scrapy项目,13.Gerapy,13.Gerapy。1.2.1-简单的代码实现,目标urlscrapy的crawlspider爬虫。
全套笔记资料代码移步: 前往gitee仓库查看
感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~
全套教程部分目录:
部分文件图片:
反爬与反反爬
本阶段课程主要学习爬虫的反爬及应对方法。
验证码处理
学习目标
- 了解 验证码的相关知识
- 掌握 图片识别引擎的使用
- 了解 常见的打码平台
- 掌握 通过打码平台处理验证码的方法
1.图片验证码
1.1 什么是图片验证码
- 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。
1.2 验证码的作用
- 防止恶意破解密码、刷票、论坛灌水、刷页。有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试,实际上使用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,百度社区),我们利用比较简易的方式实现了这个功能。虽然登录麻烦一点,但是对网友的密码安全来说这个功能还是很有必要,也很重要。
1.3 图片验证码在爬虫中的使用场景
- 注册
- 登录
- 频繁发送请求时,服务器弹出验证码进行验证
1.4 图片验证码的处理方案
- 手动输入(input) 这种方法仅限于登录一次就可持续使用的情况
- 图像识别引擎解析 使用光学识别引擎处理图片中的数据,目前常用于图片数据提取,较少用于验证码处理
- 打码平台 爬虫常用的验证码解决方案
2.图片识别引擎
OCR(Optical Character Recognition)是指使用扫描仪或数码相机对文本资料进行扫描成图像文件,然后对图像文件进行分析处理,自动识别获取文字信息及版面信息的软件。
2.1 什么是tesseract
- Tesseract,一款由HP实验室开发由Google维护的开源OCR引擎,特点是开源,免费,支持多语言,多平台。
- 项目地址:[
2.2 图片识别引擎环境的安装
1 引擎的安装
- mac环境下直接执行命令
brew install --with-training-tools tesseract
-
windows环境下的安装 可以通过exe安装包安装,下载地址可以从GitHub项目中的wiki找到。安装完成后记得将Tesseract 执行文件的目录加入到PATH中,方便后续调用。
-
linux环境下的安装
sudo apt-get install tesseract-ocr
2 Python库的安装
# PIL用于打开图片文件
pip/pip3 install pillow
# pytesseract模块用于从图片中解析数据
pip/pip3 install pytesseract
2.3 图片识别引擎的使用
- 通过pytesseract模块的 image_to_string 方法就能将打开的图片文件中的数据提取成字符串数据,具体方法如下
from PIL import Image
import pytesseract
im = Image.open()
result = pytesseract.image_to_string(im)
print(result)
2.4 图片识别引擎的使用扩展
- [tesseract简单使用与训练](
- 其他ocr平台
微软Azure 图像识别:
有道智云文字识别:
阿里云图文识别:
腾讯OCR文字识别:
3 打码平台
1.为什么需要了解打码平台的使用
现在很多网站都会使用验证码来进行反爬,所以为了能够更好的获取数据,需要了解如何使用打码平台爬虫中的验证码
2 常见的打码平台
- 云打码:[
能够解决通用的验证码识别
- 极验验证码智能识别辅助:[
能够解决复杂验证码的识别
3 云打码的使用
下面以云打码为例,了解打码平台如何使用
3.1 云打码官方接口
下面代码是云打码平台提供,做了个简单修改,实现了两个方法:
- indetify:传入图片的响应二进制数即可
- indetify_by_filepath:传入图片的路径即可识别
其中需要自己配置的地方是:
username = 'whoarewe' # 用户名
password = '***' # 密码
appid = 4283 # appid
appkey = '02074c64f0d0bb9efb2df455537b01c3' # appkey
codetype = 1004 # 验证码类型
云打码官方提供的api如下:
#yundama.py
import requests
import json
import time
class YDMHttp:
apiurl = '
username = ''
password = ''
appid = ''
appkey = ''
def __init__(self, username, password, appid, appkey):
self.username = username
self.password = password
self.appid = str(appid)
self.appkey = appkey
def request(self, fields, files=[]):
response = self.post_url(self.apiurl, fields, files)
response = json.loads(response)
return response
def balance(self):
data = {'method': 'balance', 'username': self.username, 'password': self.password, 'appid': self.appid,
'appkey': self.appkey}
response = self.request(data)
if (response):
if (response['ret'] and response['ret'] < 0):
return response['ret']
else:
return response['balance']
else:
return -9001
def login(self):
data = {'method': 'login', 'username': self.username, 'password': self.password, 'appid': self.appid,
'appkey': self.appkey}
response = self.request(data)
if (response):
if (response['ret'] and response['ret'] < 0):
return response['ret']
else:
return response['uid']
else:
return -9001
def upload(self, filename, codetype, timeout):
data = {'method': 'upload', 'username': self.username, 'password': self.password, 'appid': self.appid,
'appkey': self.appkey, 'codetype': str(codetype), 'timeout': str(timeout)}
file = {'file': filename}
response = self.request(data, file)
if (response):
if (response['ret'] and response['ret'] < 0):
return response['ret']
else:
return response['cid']
else:
return -9001
def result(self, cid):
data = {'method': 'result', 'username': self.username, 'password': self.password, 'appid': self.appid,
'appkey': self.appkey, 'cid': str(cid)}
response = self.request(data)
return response and response['text'] or ''
def decode(self, filename, codetype, timeout):
cid = self.upload(filename, codetype, timeout)
if (cid > 0):
for i in range(0, timeout):
result = self.result(cid)
if (result != ''):
return cid, result
else:
time.sleep(1)
return -3003, ''
else:
return cid, ''
def post_url(self, url, fields, files=[]):
# for key in files:
# files[key] = open(files[key], 'rb');
res = requests.post(url, files=files, data=fields)
return res.text
username = 'whoarewe' # 用户名
password = '***' # 密码
appid = 4283 # appid
appkey = '02074c64f0d0bb9efb2df455537b01c3' # appkey
filename = 'getimage.jpg' # 文件位置
codetype = 1004 # 验证码类型
# 超时
timeout = 60
def indetify(response_content):
if (username == 'username'):
print('请设置好相关参数再测试')
else:
# 初始化
yundama = YDMHttp(username, password, appid, appkey)
# 登陆云打码
uid = yundama.login();
print('uid: %s' % uid)
# 查询余额
balance = yundama.balance();
print('balance: %s' % balance)
# 开始识别,图片路径,验证码类型ID,超时时间(秒),识别结果
cid, result = yundama.decode(response_content, codetype, timeout)
print('cid: %s, result: %s' % (cid, result))
return result
def indetify_by_filepath(file_path):
if (username == 'username'):
print('请设置好相关参数再测试')
else:
# 初始化
yundama = YDMHttp(username, password, appid, appkey)
# 登陆云打码
uid = yundama.login();
print('uid: %s' % uid)
# 查询余额
balance = yundama.balance();
print('balance: %s' % balance)
# 开始识别,图片路径,验证码类型ID,超时时间(秒),识别结果
cid, result = yundama.decode(file_path, codetype, timeout)
print('cid: %s, result: %s' % (cid, result))
return result
if __name__ == '__main__':
pass
4 常见的验证码的种类
4.1 url地址不变,验证码不变
这是验证码里面非常简单的一种类型,对应的只需要获取验证码的地址,然后请求,通过打码平台识别即可
4.2 url地址不变,验证码变化
这种验证码的类型是更加常见的一种类型,对于这种验证码,大家需要思考:
在登录的过程中,假设我输入的验证码是对的,对方服务器是如何判断当前我输入的验证码是显示在我屏幕上的验证码,而不是其他的验证码呢?
在获取网页的时候,请求验证码,以及提交验证码的时候,对方服务器肯定通过了某种手段验证我之前获取的验证码和最后提交的验证码是同一个验证码,那这个手段是什么手段呢?
很明显,就是通过cookie来实现的,所以对应的,在请求页面,请求验证码,提交验证码的到时候需要保证cookie的一致性,对此可以使用requests.session来解决
小结
- 了解 验证码的相关知识
- 掌握 图片识别引擎的使用
- 了解 常见的打码平台
- 掌握 通过打码平台处理验证码的方法
chrome浏览器使用方法介绍
学习目标
- 点赞
- 收藏
- 关注作者
评论(0)