PYTHON爬虫学习(四) -- 验证码识别,模拟登陆

验证码识别:

验证码反爬机制:识别验证验证码图片中的数据,用于模拟登录操作

识别验证码的操作(反反爬):

-人工肉眼识别(不推荐)
-第三方自动识别
	-云打码(http://www.yundama.com/demo.html)(验证码类型全,但是要钱)

1.云打码的使用步骤

1.注册:普通和开发者用户
2.登录:
	--普通用户:查查还有没有分
	--开发者用户:
			--创建一个软件(我的软件-->添加新软件-->录入软件名称-->提交),完成后会拿到软件ID和密钥
			--下载示例代码:开发文档-->点此下载:云打码接口DLL-->选择对应语言的示例下载
			--示例代码使用:更改代码中的用户名和密码,appID和密钥,验证码图片,图片类型,最大识别时间等
				(普通用户的账号密码,开发者用户的ID和密钥,图片名字和路径自己定义,类型上网站看)-->直接调用封装好的方法
3.使用打码平台识别验证码的编码流程:
		- 将验证码图片进行本地下载
		- 调用平台提供的示例代码进行图片数据识别

模拟登陆:

·Post请求中会携带登录之前录入的相关的登录信息(用户名,密码,验证码)
·验证码在每次请求后都会动态变化

编码流程:
	1.验证码的识别,获取验证码图片的文字数据
	2.对post请求进行发送(处理请求参数)
	3.对响应数据进行持久化存储

http/https协议特性:无状态
登陆后直接爬取个人信息失败的原因:
	发起的第二次基于个人主页页面请求时,服务器并不知道该请求时基于登录状态下的请求
cookie:
	用来让服务器端记录客户端的相关状态
	- 手动处理:
		通过抓包工具获取cookie值,将该值封装到header中。(不建议,因为cookie是会变化的)
	- 自动处理:
		-cookie值的来源:
			- 模拟登陆post请求后,由服务器端创建
		Session会话对象:
			- 作用:
				1.可以进行请求的发送
				2.如果请求过程中产生了cookie,则cookie会被自动存储,携带在该session对象中
		- 创建一个session对象:session= requests.Session()
		- 使用session对象进行模拟登录post请求的发送(cookie就会存储在session中)
		- session对象对个人主页对应的get请求进行发送(携带cookie)
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
#需求:模拟人人网登录
#http://www.renren.com/SysHome.do
'''
编码流程
    1.验证码的识别,获取验证码图片的文字数据
    2.对post请求进行发送(处理请求参数)
    3.对响应数据进行持久化存储
'''
import requests
from lxml import etree
import session

#1.对验证码图片进行捕获和识别
def code_check(img_path,img_type):
    #验证码识别方法,传入下载的验证码路径和验证码类型
    #调用对应类中的识别验证码方法
    #返回识别结果
    return 0

headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'#伪装浏览器 
   }
url = 'http://www.renren.com/SysHome.do'
page_text = requests.get(url=url,headers=headers).text
tree = etree.HTML(page_text)
#验证码图片在一个id为verifyPic_login的img中
code_img_src = tree.xpath('//*[@id="verifyPic_login"]/@src')[0]#拿到src,下载图片
code_img_data = requests.get(url=code_img_src,headers=headers).content
with open('./code.jpg','wb') as fp:
    fp.write(code_img_data)
#下载完图片后,对验证码图片进行识别
result = code_check('code.jpg',2004)
print(result)

#先正常登录一下,找到登陆成功后post请求的信息
#2.模仿post结构模拟登录
login_url = 'http://www.renren.com/ajaxLogin/login?=122'#post包中的url
data = {
       #post中的参数
       'email':'18929010795@163.com',
       'icode':result,#验证码信息,将之前识别的验证码传进去
       'key_id':'1',
   }
response = requests.post(url = login_url,headers=headers,data = data)
print(response.status_code)#返回响应码,如:200为请求成功,404为失败

#模拟登陆成功后,爬取个人详情页数据
#直接请求会请求失败,因为服务器不知道请求是否基于登陆状态
#创建session对象存储cookie值模拟登陆状态
response = session.post(url = login_url,headers = headers)
#代替requests,使用session请求并创建session对象
detail_url = 'http://www.renren.com/975499967/profile'#个人详情页url
#请求后,session自动存储了cookie值,因此可以使用携带cookie的session进行get请求的发送
detail_page_text = session.get(url = detail_url,headers=headers).text

#持久化存储
with open('personal.html','w',encoding='utf-8') as fp:
    fp.write(detail_page_text)

代理

代理:
	  ·反爬措施--检测IP访问次数(您的IP访问次数过多)
	  ·  代理--破解封这种反爬机制
	什么是代理?:
		- 代理服务器
	代理的作用:
		- 突破自身IP访问的限制
		- 隐藏自身真实IP
	代理相关的网站:
		- 快代理
		- 西祠代理
		- www.goubanjia.com 
	代理IP的类型:
		- http:应用到http协议的url中
		- https:应用到https协议对应的url中
	代理IP的匿名度:
		- 透明:服务器知道该次请求使用了代理,也知道对应请求的真实IP
		- 匿名:知道使用了代理,不知道真实IP
		- 高匿:不知道使用了代理,更不知道真实IP
# -*- coding: utf-8 -*-
#反爬机制:封IP
#反反爬机制:使用代理发送请求

import requests
url='https://www.baidu.com/s?wd=ip'
headers={
     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'#伪装浏览器 
    }

page_text = requests.get(url = url,headers = headers,proxies= {"https":'222.110.147'})
#proxies--挂代理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值