验证码破解 | 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 ...
随机推荐
- memcached源码分析一-slab
Slab作为一种内存管理方案,其作用主要有以下2点: a) 避免频繁的内存分配释放造成的内存碎片 b) 减少内存分配操作产生的性能开销 Linux内核数据结构中也有slab的设计,Linux提供了一套 ...
- Go学习笔记之Map
Go学习笔记之Map Map 引用类型,哈希表.map的key必须可以比较相等,除了slice, map, function的内建类型都可以作为key.struct类型不包含上述字段,也可作为key. ...
- SQL怎么实现SLEEP功能(等待时间) -(转载)
语法格式: WAITFOR DELAY N'小时数:分钟数:秒数.毫秒数' 等待100毫秒: SELECT GETDATE() WAITFOR DELAY N'00:00:00.100' SELECT ...
- Identity和IdentityServer的区别及联系
关于Identity和IdentityServer初学的时候可能会有一些疑惑(虽然我也不是很精深吧),但是,这里说一下自己关于这两者的一些理解,如有错误,欢迎指正 总体上, ASP.NET Core ...
- 一张图看懂SharpSocket
SharpSocket提供了很多接口和类,他们被良好地组织在一起,通过下面的图片,可以瞬间看懂整个类库的脉络.通过调用各个接口的方法,完成socket通信的功能.
- python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题
python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题 一丶爬虫概述 通过编写程序'模拟浏览器'上网,然后通 ...
- vue-cli项目中使用vw——相比flexible更原生的移动端解决方案
安装命令行输入: yarn add postcss-px-to-viewport 或 npm i postcss-px-to-viewport -save -dev 配置package.json中,在 ...
- npm升级到最新版本、指定版本
npm 升级到最新版本 //linux下 npm install -g npm npm升级到指定版本 //比如升级到5.6.0 npm install -g npm@5.6.0
- vue前端实战注意事项
1. vue前端实战注意事项 1.1. 预备 1.1.1. Eslint 这是个语法检查工具,我用webstorm作为开发的ide,这个语法检查还是太严格了,一个空格啥的都会报错,对新手来讲还是建议关 ...
- Vue – 基础学习(3):$forceUpdate()和$nextTick()的区别
Vue – 基础学习(3):$forceUpdate()和$nextTick()的区别