1、验证码识别:(为了模拟登陆)
相关的线上识别平台:打码兔,云打码,
超级鹰(主要使用):http://www.chaojiying.com/about.html
1.注册,登陆(用户中心的身份认证)
2、识别收费、
3、登陆后创建一个软件
①点击软件ID-> 生成一个软件ID
②下载实例代码: 点击开发文档-选择python-下载文档
文档和爬虫项目放同目录
4、价格体系-有验证码类型,英文数字,中文汉字(如1902)
二、对古诗文网中的验证码图片进行识别:
重点:
对古诗文网站模拟登陆
设计到的反爬:
-验证码
-动态请求参数:每次请求对应的请求参数都是动态变化的
-解决办法:动态捕获,通常情况下动态请求的参数都会被
隐藏在前台页面的原码中
-cookie
-解决办法:
-1,headers中添加cookie
-2使用session发送请求 :重点要弄清楚是cookie室友哪个url产生的
-本例中,cookie实在验证码图片对应url请求你时产生的
代码:
import requests
from lxml import etree
#使用session捕获cookie ,zhel
s=requests.Session()
first_url='https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
s.get(first_url,headers=headers)
url='https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
}
page_text=requests.get(url,headers=headers).text
tree=etree.HTML(page_text)
url10000=tree.xpath('//*[@id="imgCode"]/@src')[0]
#注意,url10000对应的地址是不完整的,缺少域名,域名的查找:点击图片-复制图片地址
#xpath返回的都是列表,所以哪怕只有一个元素,也需要切片索引
img_src='https://so.gushiwen.cn'+tree.xpath('//*[@id="imgCode"]/@src')[0]
img_code_data=s.get(img_src,headers=headers).content
with open('./yanzhengma.jpg','wb') as fp:
fp.write(img_code_data)
继续解析动态变化的参数?动态捕获动态的请求参****
__VIEWSTATE=tree.xpath('//*[@id="__VIEWSTATE"]/@value')[0]
__VIEWSTATEGENERATOR=tree.xpath('//*[@id="__VIEWSTATEGENERATOR"]/@value')[0]
上边代码是下载验证码图片,下载后需要超级英鹰识别该图片,并将其中的字母或数字返回**
img_text=getCodeImgText('./yanzhengma.jpg',1004) #验证码图片路径和验证码类型
print(img_text)
*接下来就是利用识别代码进行模拟登陆 为什么需要模拟登陆?因为有些数据是经过登陆后才会显示出来的
#重点是寻找 点击登陆按钮 发送请求对应得数据包 因为需要输入
密码和用户名,以及验证码,所以至少有三个参数的url 寻找url时
一定要找点击同时刻产生的数据包
# 点击登陆按钮后发起请求的url:通过抓包工具获得
load_url='https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
form_data={
'__VIEWSTATE':__VIEWSTATE,
'__VIEWSTATEGENERATOR': __VIEWSTATEGENERATOR,
'from': 'http://so.gushiwen.cn/user/collect.aspx',
'email': '18781954274',
'pwd': 'lwx@930911',
'code': img_text # 这里需要用到之前提取解析到的验证码内容,
'denglu': '登录',
}
main_page=s.post(load_url,headers=headers,data=form_data).text
with open('main.html','w',encoding='utf-8') as fp:
fp.write(main_html)