验证码破解 | Selenium模拟登陆微博
模拟登陆微博相对来说,并不难。验证码是常规的5个随机数字字母的组合,识别起来也比较容易。主要是用到许多Selenium中的知识,如定位标签、输入信息、点击等。如对Selenium的使用并不熟悉,请先移驾《Python爬虫 | Selenium详解》。相信你再来看本篇一定可以看懂。
破解微博登陆的思路:
(1)使用webdriver打开微博网页;
(2)输入用户名和密码,点击登录;
(3)对第二步的结果进行判断
- 情况一:用户名或者密码错误
- 情况二:登录成功
- 情况三:出现验证码图片,需识别
- 情况四:其他错误
(4)本例中增加了登录成功后获得cookies的情况
import requests
from requests import RequestException
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from chaojiying import Chaojiying # 超级鹰用户名、密码、软件ID、
CHAOJIYING_USERNAME =
CHAOJIYING_PASSWORD =
CHAOJIYING_SOFT_ID =
CHAOJIYING_KIND = 1006 class LoginWeibo(): def __init__(self, username, password):
self.url = 'https://www.weibo.com'
self.browser = webdriver.Chrome(executable_path='D:\download\pythonRelated\chromedriver.exe')
self.wait = WebDriverWait(self.browser, 20)
self.username = username
self.password = password
self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID) # def __del__(self):
# self.browser.close() def open(self):
"""
打开网页输入用户名密码
:return: None
"""
self.browser.get(self.url)
username = self.wait.until(EC.presence_of_element_located((By.ID, 'loginname')))
password = self.wait.until(EC.presence_of_element_located((By.NAME, 'password')))
username.send_keys(self.username)
password.send_keys(self.password) def get_click_button(self):
'''
找到登录按钮
:return:
'''
'''
<a href="javascript:void(0)" class="W_btn_a btn_32px " action-type="btn_submit" node-type="submitBtn" suda-data="key=tblog_weibologin3&value=click_sign" tabindex="6"><span node-type="submitStates">登录</span></a>
'''
button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'W_btn_a')))
return button def login_successfully(self):
"""
判断登陆是否成功
:return:
"""
'''
登录成功才能看到
<em class="W_ficon ficon_mail S_ficon">I</em>
'''
try:
return bool(
WebDriverWait(self.browser, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.ficon_mail')))
)
except TimeoutException:
return False def get_click_image(self, name='captcha.png'):
"""
获取验证码图片
:param name:
:return: 图片对象
"""
try:
'''
<img width="95" height="34" action-type="btn_change_verifycode" node-type="verifycode_image" src="https://login.sina.com.cn/cgi/pin.php?r=88815771&s=0&p=gz-66c0488ef9191010d88bea8c9f3a09fdf3bf">
'''
element = self.wait.until(
EC.presence_of_element_located((By.XPATH, '//img[@action-type="btn_change_verifycode"]')))
image_url = element.get_attribute('src')
image = get_html(image_url).content
with open(name, 'wb') as f:
f.write(image)
return image
except NoSuchElementException:
print('')
return None def password_error(self):
"""
判断是否密码错误
:return:
"""
try:
element = WebDriverWait(self.browser, 5).until(
EC.presence_of_element_located((By.XPATH, '//div[@class="W_layer W_layer_pop"]/div/p/span[2]')))
print(element.text)
if element.text == '用户名或密码错误。':
return True
except TimeoutException:
return False def get_cookies(self):
"""
获取Cookies
:return:
"""
print(self.browser.get_cookies())
return self.browser.get_cookies() def login(self): # 1. 打开网址 输入用户名和密码
self.open() # 2. 点击登录按钮
button = self.get_click_button()
button.click() if self.password_error():
print('用户名或密码错误')
return {
'status': 2,
'content': '用户名或密码错误'
}
if self.login_successfully():
print('登录成功')
# 获取帐号对应的cookies
cookies = self.get_cookies()
return {
'status': 1,
'content': cookies
}
else: # 有时会需要验证码
# 获取验证码图片
image = self.get_click_image() # 识别验证码
result = self.chaojiying.post_pic(image, CHAOJIYING_KIND)
print(result) # 输入验证码
'''
<input type="text" class="W_input " maxlength="6" autocomplete="off" value="验证码" action-data="text=请输入验证码" action-type="text_copy" name="verifycode" node-type="verifycode" tabindex="3">
'''
verifycode = self.wait.until(EC.presence_of_element_located((By.NAME, 'verifycode')))
verifycode.send_keys(result['pic_str']) # 点击登录按钮
button = self.get_click_button()
button.click()
if self.login_successfully():
print('登录成功')
# 获取帐号对应的cookies
cookies = self.get_cookies()
return {
'status': 1,
'content': cookies
}
else:
self.chaojiying.report_error(result['pic_id'])
self.login()
# return {
# 'status': 3,
# 'content': '登录失败'
# } def get_html(url):
try:
# 添加User-Agent,放在headers中,伪装成浏览器
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
response.encoding = response.apparent_encoding
return response
return None
except RequestException:
return None if __name__ == '__main__':
result = LoginWeibo('username', 'password').login()
本篇博文仅供学习交流相关的爬虫知识,请勿过度使用,如有任何纠纷,与本人无关。(瑟瑟发抖)
验证码破解 | Selenium模拟登陆微博的更多相关文章
- 验证码破解 | Selenium模拟登陆12306
12306官网登录的验证码破解比较简单,验证码是常规的点触类型验证码,使用超级鹰识别率比较高. 思路: (1)webdriver打开浏览器: (2)先对整个屏幕截屏,通过标签定位找到验证码图片,并定位 ...
- 验证码破解 | Selenium模拟登录简书
使用超级鹰打码平台处理登录的文字点击验证码 import time from io import BytesIO from PIL import Image from selenium import ...
- 验证码破解 | Selenium模拟登录知乎
import requests import re import execjs import time import hmac from hashlib import sha1 class Zhi ...
- Selenium模拟登陆百度贴吧
Selenium模拟登陆百度贴吧 from selenium import webdriver from time import sleep from selenium.webdriver.commo ...
- selenium 模拟登陆豆瓣,爬取武林外传的短评
selenium 模拟登陆豆瓣,爬去武林外传的短评: 在最开始写爬虫的时候,抓取豆瓣评论,我们从F12里面是可以直接发现接口的,但是最近豆瓣更新,数据是JS异步加载的,所以没有找到合适的方法爬去,于是 ...
- 使用selenium模拟登陆淘宝、新浪和知乎
如果直接使用selenium访问淘宝.新浪和知乎这些网址.一般会识别出这是自动化测试工具,会有反制措施.当开启开发者模式后,就可以绕过他们的检测啦.(不行的,哭笑) 如果网站只是对windows.na ...
- 使用selenium模拟登陆新浪微博
1.selenium基本使用 1.selenium安装及基本操作 selenium是一个自动化测试工具,它支持各种浏览器,包括Chrome,Safari,Firefox等主流界面浏览器驱动,也包括Ph ...
- 关于模拟登陆微博(PC)
微博模拟登陆 1.基类对象的方法建立一个类__init__初始化方法,接收username和password. class launcher(): def __init__(self, usernam ...
- python selenium模拟登陆163邮箱。
selenium是可以模拟浏览器操作. 有些爬虫是异步加载的,通过爬取网页源码是得不到需要的内容.所以可以模拟浏览器去登陆该网站进行爬取操作. 需要安装selenium通过pip install xx ...
随机推荐
- Windows和Linux简单命令的总结
MS-DOS 命令提示符(cmd) 启动: Win+R,输入cmd回车 切换盘符 盘符名称: 进入文件夹 cd ...
- Python Web 之 Flask SQLalchemy
Flask-SQLalchemy 一. 一对多 A表中的一条记录与B表中的多天记录关联 语法实现: 在"多"实体类中增加 外键列名 = db.Column(db.Integer, ...
- Linux学习笔记之秋水BBR一键部署
0x00 本脚本适用环境 系统支持:CentOS 6+,Debian 7+,Ubuntu 12+内存要求:≥128M 阅读文章时请除手动删出干扰字符“1”.(Shadowsocks) 0x01 关于本 ...
- EF之DataBase添加新字段
数据库中表添加新字段后,在EF的xml格式的中找到与表名相同的节点添加新字段 (SSDL.CSDL和C-S都要添加相关信息)
- English--五大基本句型基本概念
English|五大基本句型基本概念 英语的基本句型是整个英语的框架体系,所以,祝愿看到此文的伙伴们,都可以牢牢掌握! 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力 ...
- xcode11新项目删除main.storyboard 两种方法
方法一 心急的童鞋按照老操作完成后再按照如下操作即可 /** 弃用storboard 1.info.plist去除 <key>UIApplicationSceneManifest</ ...
- Typora优化-适合不懂CSS代码的小白
转载请注明出处:https://www.cnblogs.com/nreg/p/11116176.html 先来一张优化前与优化后的对比图: 优化前: 优化后: 1.通过 文件-偏好设置 打开主题文件 ...
- MYSQL使用mysqldump导出表的部分数据
MySQLdump是MySQL自带的导出数据工具,通常我们用它来导出MySQL中,但是有时候我们需要导出MySQL数据库中某个表的部分数据,这时该怎么办呢? mysqldump命令中带有一个 --wh ...
- Mysql 控制结构初识
Mysql 流程控制 认识 从我目前所接触的编程语言,C, R, VB, Python, Javascript...,来看, 无非就是变量, 表达式, 流程控制(顺序, 分支, 循环), 封装了一些更 ...
- Linux Kbuild文档(转)
转载链接:http://blog.chinaunix.net/uid-10221131-id-2943265.html Linux Kbuild文档 Linux Kbuild文档 V 0.1 tang ...