一、验证码识别
1、验证码和爬虫之间的关系
- 验证码属于一种 反爬机制
- 第三方自动识别(推荐使用)
- 超级鹰 的使用流程:http://www.chaojiying.com
- 注册该平台,下载该平台的Python开发文档
- 把python源文件放到自己的项目中去
- 稍微修改一下python源文件,就可以进行识别了,前提是需要有题分【没有就充值】
- 在自己的python文件中import该文件
- 然后实例化一个Chaojiying_Client(“用户名”,”密码”,”软件id”)
- im = open(‘../二手房/a.jpg’, ‘rb’).read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
- print(chaojiying.PostPic(im, 1902)) # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
- 返回json数据 其中的 {‘err_no’: 0, ‘err_str’: ‘OK’, ‘pic_id’: ‘6125113035261700001’, ‘pic_str’: ‘7261’, ‘md5’: ‘2cd18ae5f5b652059c48b607e3184fca’} 为验证码
- 使用模拟登录的话,最后可以查看一个返回结果的.status_code属性,如果是200 说明模拟登录成功
**
cookie: 服务端通过cookie 来判断用户是否已经登陆
- 手动处理: 通过抓包工具获取cookie值,将该值封装到headers字典中 【不建议】
- 自动处理:
cookie值的来源是 :发送登录请求时,服务端返回的
session会话对象:**
- 作用:可以进行请求的发送。
- 如果请求过程中产生的cookie则该cookie会被自动存储/携带该session中
创建一个session对象
**session = request.Session()**
使用session对象进行模拟登录post 请求的发送(cookie会被存储到session中)
- 使用已经存储cookie的session对象对个人主页对应的url进行get请求发送
往往在进行模拟登录的时候 都会需要处理cookie, 所以 如果是模拟登录 就是用session.post()方法**
# 获取session对象
login_session = requests.Session()
# 使用session对象发送post请求,服务器返回得到cookie会自动保存
login_response = login_session.post(url=login_url, data=form_data, headers=headers)
# 个人信息的url
my_info_url = "http://www.renren.com/975495839/profile"
# 获得个人信息的响应信息 使用session发送,会自动登录时服务器返回的cookie信息
my_info_response = login_session.get(my_info_url, headers=headers)
三、模拟登陆
1、模拟登录古诗词网
import requests
from lxml import etree
from chaojiying import Chaojiying_Client
if __name__ == '__main__':
url = "https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/85.0.4183.121 Safari/537.36 "
}
# 进行第一次爬取,获得页面数据
response = requests.get(url, headers=headers)
# 生成tree
page_tree = etree.HTML(response.text)
# 解析出来验证码的src属性
img_src = page_tree.xpath("//img[@id='imgCode']/@src")[0]
# 拼接出完整的url
img_url = "https://so.gushiwen.cn" + img_src
# 发送请求,获取验证码数据
img_response = requests.get(img_url)
file_name = "./验证码/yzm.jpg"
# 将验证码写入到文件中
with open(file_name, "wb") as fp:
fp.write(img_response.content)
"""
使用超级鹰来分析验证码
导入chaojiying.py中的class | from chaojiying import Chaojiying_Client
创建对象
调用他的postPic方法
"""
chaojiying = Chaojiying_Client('qq2298320493', 'qq2298320493', '910477') # 用户中心>>软件ID 生成一个替换 96001
im = open(file_name, 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
# 得到验证码
yzm = chaojiying.PostPic(im, 1902)['pic_str'] # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
print("验证码为 %s" % yzm)
# 模拟登录
login_url = "https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx"
# 模拟表单登录信息
login_form = {
"__VIEWSTATE":"n05Ff/p8USORrfg5Tr/ZTleMtid6oM5CwmqZJlmPa3iLd0wVKLTc0VuqlTsdxpG3GNB"
"/301JfVDcWnmUUwxZ8WwhSPdzCzqOHl3aHmiyu9uO6Z94Ks6HbhtuOW4=",
"__VIEWSTATEGENERATOR": "C93BE1AE",
"from": "http://so.gushiwen.cn/user/collect.aspx",
"email": "2298320493@qq.com",
"pwd": "qq2298320493",
"code": yzm, # 验证码信息
"denglu": "登录"
}
response = requests.post(login_url, data=login_form, headers=headers)
with open("./login_rigth.html", "w", encoding="utf-8") as fp:
fp.write(response.text)
print(img_src)
print(response.status_code)
print("模拟登录完毕")
2、模拟登录人人网
import requests
from lxml import etree
from chaojiying import Chaojiying_Client
if __name__ == '__main__':
url = "http://www.renren.com/SysHome.do"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/85.0.4183.121 Safari/537.36 "
}
response = requests.get(url, headers=headers)
page_tree = etree.HTML(response.text)
img_url = page_tree.xpath("//img[@id='verifyPic_login']/@src")[0]
# 向验证码图片发送请求,下载图片
img_response = requests.get(img_url, headers=headers)
# 将获取的图片二进制数据 下载下来
with open("./验证码/renrenyzm.jpg", "wb") as fp:
fp.write(img_response.content)
# 使用超级鹰 将验证码解析出来
chaojiying = Chaojiying_Client('qq2298320493', 'qq2298320493', '910477') # 用户中心>>软件ID 生成一个替换 96001
im = open('./验证码/renrenyzm.jpg', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
yzm_text = chaojiying.PostPic(im, 1006)['pic_str'] # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
print("验证码为 %s" % yzm_text)
# 发送post请求,模拟登录
login_url = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20201101556901"
form_data = {
"email": "17631503981",
"icode": yzm_text,
"origURL": " http://www.renren.com/975495839",
"domain": "renren.com",
"key_id": "1",
"captcha_type": "web_login",
"password": "7ee96119aec1653e5991bddba7b529d4dd7097338fe06708a60fc22618701376",
"rkey": "039f51e435d2e317427e5feee225aa83",
"f": ""
}
reponse = requests.post(url=login_url, data=form_data, headers=headers)
with open("./人人网模拟登录.html", "w", encoding="utf-8") as fp:
fp.write(response.text)
print(response.status_code)