Python爬虫(十)模拟登陆ilabx(实验空间—国家虚拟仿真实验教学项目共享服务平台)

215 阅读5分钟

模拟登陆一般用来爬取基于某些用户的用户信息

我这里使用ilabx(www.ilab-x.com/login )来做测试

一:模拟登陆实现流程

1.      点击登陆按钮之后会发起一个post请求

2.      Post请求中会携带登陆之前录入的相关的登录信息(用户名,密码,验证码……)

3.      验证码:买次都会变化

 

二:识别页面中的验证码(百度OCR文字识别、超级鹰)

关于验证码的识别,请移步《[Python爬虫(七)图形验证码识别——使用云打码平台]》里边有详细的介绍。

但是,走到上面这一步中的前提是,你得能获取到验证码的图片,ilabx网站的登录页面

11.png

红框标注的部分是页面加载完成之后,使用javascript生成的。这个可以在f12调试状态下,在资源中可以看到,我这里不再赘述。

那这就没办法了,常规手段肯定是不行了,就需要用到我上篇日志中看到的selenium

代码如下:

from selenium import webdriver
from lxml import etree
from time import sleep
import os,base64

# =========================================================================
# 模拟登陆
# 实例化一个浏览器对象
bro = webdriver.Chrome()
# 浏览器最大化
bro.maximize_window()
# 让浏览器发起一个指定的url对应的请求
bro.get('http://www.ilab-x.com/login')
# 定位 用户名输入框
user_input = bro.find_element_by_id('user')
# 定位 密码输入框
pwd_input = bro.find_element_by_id('password')
# 定位验证码输入框
code_input = bro.find_elements_by_css_selector('.ipt verify')
# 等待页面加载,
sleep(2)
# page_source获取浏览器当前页面的页面源码数据
page_text = bro.page_source
# 使用xpath 解析
tree = etree.HTML(page_text)
# xpath获取标题名称
base_img = tree.xpath('/html/body/div[1]/div[3]/div/div[3]/form/div[1]/div[3]/span/img/@src')
# 处理一下字符串
base_code = base_img[0].replace('data:image/jpeg;base64, ','')
# base64 转image
imgdata = base64.b64decode(base_code)
# 将image保存图片
with open('ilabxCode.jpg','wb') as fe:
    fe.write(imgdata)
    print('爬取完成')

 

走到这一步,我就已经拿到了页面中的验证码图片,将其存储到了本地。

接下来,我们使用百度云的OCR文字识别来处理这个验证码,没用过,试一试

1:安装百度模块

pip install baidu-aip

 

2:调用识别验证码模块

文档地址:ai.baidu.com/ai-doc/OCR/…

from aip import AipOcr
""" 读取图片 """
def get_file_content(filePath):
    with open(filePath, 'rb'as fp:
        return fp.read()

image = get_file_content('ilabxCode.jpg')

""" 你的 APPID AK SK """
APP_ID = '1111'
API_KEY = 'GX3hueN2d1S156468768DFgrds213135sdfdsfsdfsdf11bNu6dNImAeq6b'
SECRET_KEY = '111111'

client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
""" 如果有可选参数 """
options = {}
options["detect_direction"] = "true"
options["probability"] = "true"
""" 调用通用高精度文字识别, 图片参数为本地图片 """
res = client.basicAccurate(image)
print(res)

识别结果差强人意,这个不是专业识别验证码的工具,体验一般。识别精度还是很高的

 

关于验证码的识别,还得是超级鹰。

关于超级鹰识别验证码,请移步《[Python爬虫(七)图形验证码识别——使用云打码平台]》

 

三:模拟用户登录完整操作

验证码这个最大的问题解决了,其余的就比较简单了。用户登录无非就是一下几个步骤:

1:输入用户名

2:输入密码

3:输入验证码

4:点击登陆按钮

具体代码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2022/3/10 19:55
# @Author  : camellia
# @Email   : 805795955@qq.com
# @File    : seleniums.py
# @Software: PyCharm
from selenium import webdriver
from lxml import etree
from time import sleep
import os,base64
from aip import AipOcr

import requests
from hashlib import md5

class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password =  password.encode('utf8')
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'Connection''Keep-Alive',
            'User-Agent''Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
        }

    def PostPic(self, im, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:报错题目的图片ID
        """
        params = {
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()

# =========================================================================
# 模拟登陆
# 实例化一个浏览器对象
bro = webdriver.Chrome()
# 浏览器最大化
bro.maximize_window()
# 让浏览器发起一个指定的url对应的请求
bro.get('http://www.ilab-x.com/login')
# 等待页面加载,
sleep(2)
# page_source获取浏览器当前页面的页面源码数据
page_text = bro.page_source
# 使用xpath 解析
tree = etree.HTML(page_text)
# xpath获取标题名称
base_img = tree.xpath('/html/body/div[1]/div[3]/div/div[3]/form/div[1]/div[3]/span/img/@src')
# 处理一下字符串
base_code = base_img[0].replace('data:image/jpeg;base64, ','')
# base64 转image
imgdata = base64.b64decode(base_code)
# 将image保存图片
with open('ilabxCode.jpg','wb'as fe:
    fe.write(imgdata)
    print('爬取完成')
# 其实我这里没有必要将验证码图片 base64转二进制 二进制存图 图再读取成二进制 为了更明确流程,我才这样做的,各位看官,勿喷
# 用户中心>>软件ID 生成一个替换 96001
chaojiying = Chaojiying_Client('你的用户名''你的密码''96001')
# 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
im = open('ilabxCode.jpg''rb').read()
# 识别验证码
CAPTCHA = chaojiying.PostPic(im, 8001)
print(CAPTCHA)
codes = CAPTCHA['pic_str']
print(codes)

# 定位 用户名输入框
user_input = bro.find_element_by_id('user')
# 定位 密码输入框
pwd_input = bro.find_element_by_id('password')
# 定位验证码输入框
# code_input = bro.find_element_by_css_selector('.ipt verify')
code_input = bro.find_element_by_xpath('/html/body/div[1]/div[3]/div/div[3]/form/div[1]/div[3]/input')

# 将用户名填入
user_input.send_keys('11111111111')
sleep(1)
# 将密码填入
pwd_input.send_keys('xxxxxxxxxx')
sleep(1)
# 将验证码填入
code_input.send_keys(codes)
sleep(1)

# 定位 登录按钮
log_btn = bro.find_element_by_id('loginBut')
log_btn.click()
# 等待登录成功
sleep(10)
bro.quit()

# ==============================================
# 百度文字识别(非专业识别验证码,验证码识别效果不如专业平台超级鹰)
# """ 读取图片 """
# def get_file_content(filePath):
#     with open(filePath, 'rb') as fp:
#         return fp.read()
#
# image = get_file_content('ilabxCode.jpg')
#
# """ 你的 APPID AK SK """
# APP_ID = '1111111'
# API_KEY = 'wwwwwwwwwsssasdasdasdas'
# SECRET_KEY = '2dasdasdasdasdasdasdasd'
#
# client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
# """ 如果有可选参数 """
# options = {}
# options["detect_direction"] = "true"
# options["probability"] = "true"
# """ 调用通用高精度文字识别, 图片参数为本地图片 """
# res = client.basicAccurate(image)
# print(res)

 

以上代码,即可以完美实现ilabx模拟登陆的效果。

 

有好的建议,请在下方输入你的评论。