【爬虫开发】爬虫开发从0到1全知识教程第7篇:反爬与反反爬【附代码文档】
教程全知识点简介:Mongodb数据库 介绍 内容 mongodb的简单使用 1. mongodb服务端的启动 2. 启动mongodb的客户端:进入mongo shell 小结 scrapy爬虫框架 人民币玩家的代码(使用abuyun提供的代理ip) 启动爬虫 停止爬虫 5. 了解scrapyd的其他webapi 13.Gerapy 4.通过Gerapy配置管理scrapy项目 补充: 利用appium抓取app中的信息 利用appium自动控制移动设备并提取数据 2.1 安装appium-python-client模块并启动已安装好的环境 2.2 初始化以及获取移动设备分辨率 2.3 定位元素以及提取文本的方法 2.4 控制抖音app滑动 2.5 整理并完成自动滑动的代码 爬虫课程概要 爬虫概述 1. 爬虫的概念爬虫基础 http协议复习 1. http以及https的概念和区别 2. 爬虫特别关注的请求头和响应头 3. 常见的响应状态码 4. 浏览器的运行过程 5. 关于http协议的其它参考阅读 requests模块 4. requests模块发送post请求 4.2 POST请求练习 5. 利用requests.session进行状态保持 5.3 课堂测试 数据提取概述 1. 响应内容的分类 2. 认识xml以及和html的区别 2.1 认识xml 2.3 常用数据解析方法 数据提取-jsonpath模块 1. jsonpath模块的使用场景 数据提取-lxml模块 1. 了解 lxml模块和xpath语法 2. 谷歌浏览器xpath helper插件的安装和使用 3. xpath的节点关系 4. xpath语法-基础节点选择语法 4.1 xpath定位节点以及提取属性或文本内容的语法 4.2 语法练习 7. lxml模块的安装与使用示例 Selenium课程概要 se 获取当前标签页的全部cookie信息 把cookie转化为字典 删除所有的cookie 5. 页面等待 反爬与反反爬 常见的反爬手段和解决思路 1 服务器反爬的原因 2 服务器常反什么样的爬虫 3 反爬虫领域常见的一些概念 4 反爬的三个方向 5 常见基于身份识别进行反爬 - 实现思路: - 使用session发送rKey获取登录需要信息 - url: - 方法: get 获取session对象 设置session的请求头信息 print(response.content.decode()) - 根据获取信息对密码进行加密 - 准备用户名和密码 - 使用js2py生成js的执行环境:context
👉👉👉 https://gitee.com/yinuo112/Backend/blob/master/爬虫/爬虫开发从0到1全知识教程/note.md
反爬与反反爬
本阶段主要学习爬虫的反爬及应对方法。
处理
学习目标
- 了解 的相关知识
- 掌握 图片识别引擎的使用
- 了解 常见的打码平台
- 掌握 通过打码平台处理的方法
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浏览器使用方法介绍
学习目标
- 了解 新建隐身窗口的目的
- 了解 chrome中network的使用
- 了解 寻找登录接口的方法
1 新建隐身窗口
浏览器中直接打开网站,会自动带上之前网站时保存的cookie,但是在爬虫中首次获取页面是没有携带cookie的,这种情况如何解决呢?
使用隐身窗口,首次打开网站,不会带上cookie,能够观察页面的获取情况,包括对方服务器如
- 点赞
- 收藏
- 关注作者
评论(0)