模拟登陆微博相对来说,并不难。验证码是常规的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&amp;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&amp;s=0&amp;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模拟登陆微博的更多相关文章

  1. 验证码破解 | Selenium模拟登陆12306

    12306官网登录的验证码破解比较简单,验证码是常规的点触类型验证码,使用超级鹰识别率比较高. 思路: (1)webdriver打开浏览器: (2)先对整个屏幕截屏,通过标签定位找到验证码图片,并定位 ...

  2. 验证码破解 | Selenium模拟登录简书

    使用超级鹰打码平台处理登录的文字点击验证码 import time from io import BytesIO from PIL import Image from selenium import ...

  3. 验证码破解 | Selenium模拟登录知乎

      import requests import re import execjs import time import hmac from hashlib import sha1 class Zhi ...

  4. Selenium模拟登陆百度贴吧

    Selenium模拟登陆百度贴吧 from selenium import webdriver from time import sleep from selenium.webdriver.commo ...

  5. selenium 模拟登陆豆瓣,爬取武林外传的短评

    selenium 模拟登陆豆瓣,爬去武林外传的短评: 在最开始写爬虫的时候,抓取豆瓣评论,我们从F12里面是可以直接发现接口的,但是最近豆瓣更新,数据是JS异步加载的,所以没有找到合适的方法爬去,于是 ...

  6. 使用selenium模拟登陆淘宝、新浪和知乎

    如果直接使用selenium访问淘宝.新浪和知乎这些网址.一般会识别出这是自动化测试工具,会有反制措施.当开启开发者模式后,就可以绕过他们的检测啦.(不行的,哭笑) 如果网站只是对windows.na ...

  7. 使用selenium模拟登陆新浪微博

    1.selenium基本使用 1.selenium安装及基本操作 selenium是一个自动化测试工具,它支持各种浏览器,包括Chrome,Safari,Firefox等主流界面浏览器驱动,也包括Ph ...

  8. 关于模拟登陆微博(PC)

    微博模拟登陆 1.基类对象的方法建立一个类__init__初始化方法,接收username和password. class launcher(): def __init__(self, usernam ...

  9. python selenium模拟登陆163邮箱。

    selenium是可以模拟浏览器操作. 有些爬虫是异步加载的,通过爬取网页源码是得不到需要的内容.所以可以模拟浏览器去登陆该网站进行爬取操作. 需要安装selenium通过pip install xx ...

随机推荐

  1. NP完全问题的证明

    目录 NP完全问题的证明 一.限制法 最小覆盖问题(VC) 子图同构问题 0-1背包(Knapsack) 三元集合的恰当覆盖(X3C) 集中集 有界度的生成树 多处理机调度 二.局部替换法 3SAT问 ...

  2. php 逻辑题

    越长大约发现,高中学的数学,都还给了数学老师,一点都没有留住. 最近遇到了一个 逻辑题,然后想了半天,后来做出来了,我就发现了,我可能是一个假的理科生.很简单的样子. 废话不说,看看这道题吧. /** ...

  3. Django ForeignKey不需要参照完整性?

    我想在django模型中设置一个ForeignKey字段,它在某些时候指向另一个表.但我希望可以在这个字段中插入一个id,它引用另一个表中可能不存在的条目.因此,如果该行存在于另一个表中,我希望获得F ...

  4. Options of the DB storage of prometheus

    参考: // Options of the DB storage. type Options struct { // The timestamp range of head blocks after ...

  5. JAVA - Windows下JDK自动设置脚本

    CMD窗口如果使用下面脚本代码出现乱码,则按照下文处理后,就可以了: https://www.cnblogs.com/sunylat/p/11308037.html @echo off echo ** ...

  6. Java JDBC结果集的处理

    结果集指针的移动 while (resultSet.next()){ //...... } 指针最初指向第一条记录之前,next()是指向下一个位置,返回的是boolean值,true表示有内容(记录 ...

  7. React 之 Redux 的使用

    Redux可以简单概况为:将需要修改的state都存入到store里,发起一个action用来描述发生了什么,用reducers描述action如何改变state tree .创建store的时候需要 ...

  8. Weshop基于Spring Cloud开发的小程序商城系统

    WESHOP | 基于微服务的小程序商城系统 Weshop是基于Spring Cloud(Greenwich)开发的小程序商城系统,提供整套公共微服务服务模块,包含用户中心.商品中心.订单中心.营销中 ...

  9. can解析

  10. SpringBoot解决跨域请求拦截

    前言 同源策略:判断是否是同源的,主要看这三点,协议,ip,端口. 同源策略就是浏览器出于网站安全性的考虑,限制不同源之间的资源相互访问的一种政策. 比如在域名https://www.baidu.co ...