from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from PIL import Image
from io import BytesIO
import time USERNAME = '15xxx'
PASSWORD = '111111'
BORDER = 6 class Login(object):
def __init__(self):
self.browser = webdriver.Chrome()
self.username = USERNAME
self.password = PASSWORD
self.wait = WebDriverWait(self.browser, 10) def __del__(self):
self.browser.close() def open(self):
self.browser.get('https://www.jianshu.com/')
login = self.wait.until(EC.element_to_be_clickable((By.XPATH, '//a[@class="btn log-in"]')))
login.click()
time.sleep(10) username = self.wait.until(EC.presence_of_element_located((By.ID, 'session_email_or_mobile_number')))
password = self.wait.until(EC.presence_of_element_located((By.ID, 'session_password')))
username.clear()
password.clear()
username.send_keys(self.username)
password.send_keys(self.password) def click_button(self):
'''
点击按钮呼出验证码图片
'''
button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_radar_tip')))
button.click() def get_captcha(self,name='captcha.png'):
'''
截图并且按照验证码图片的位置进行抠图
'''
img = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_img')))
time.sleep(2)
location = img.location
size = img.size
print('验证码图片位置是:', location)
print('验证码图片尺寸是:', size)
top,bottom,left,right = location['y'], location['y']+size['height'], location['x'], location['x']+size['width'] screenshot = self.browser.get_screenshot_as_png()
screenshot = Image.open(BytesIO(screenshot))
captcha = screenshot.crop((left, top, right, bottom))
captcha.save(name) def get_slider(self):
slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_slider_button')))
return slider def get_gap(self, captcha1, captcha2):
'''
左边部分一定存在差异,因此直接忽略
'''
left = 60
for i in range(left,captcha1.size[0]): # captcha1.size宽度和高度的元组
for j in range(captcha1.size[1]):
if not self.is_pixel_equal(captcha1, captcha2, i, j):
left = i
return left
return left def is_pixel_equal(self, captcha1, captcha2, x, y):
'''
对每个像素的RGB值进行比较
'''
pixel1 = captcha1.load()[x, y]
pixel2 = captcha2.load()[x, y]
threshold = 60
if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel2[1] - pixel2[1]) < threshold and \
abs(pixel1[2] - pixel2[2]) < threshold:
return True
else:
return False def get_track(self, distance):
track = []
current = 0
mid = distance*4/5
t = 0.2
v = 0
while current < distance:
if current < mid:
a = 10
else:
a = -18
v0 = v
v = v0 + a * t
move = v0 * t + 1 / 2 * a * t * t
current += move
track.append(round(move))
return track def move_to_gap(self, slider, track):
ActionChains(self.browser).click_and_hold(slider).perform()
for x in track:
ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0)
time.sleep(0.5)
ActionChains(self.browser).release().perform() def loginin(self):
submit = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'commit')))
submit.click()
time.sleep(5)
print('登陆成功') def crack(self):
self.open()
self.click_button() # 点击按钮呼出验证码图片
captcha1 = self.get_captcha('captcha1.png') # 截图,获取原始验证码位置,抠图 slider = self.get_slider() # 获取验证码滑块位置
slider.click() # 点击位置
captcha2 = self.get_captcha('captcha2.png') # 截图,获取凹凸验证码位置,抠图 gap = self.get_gap(captcha1, captcha2) # 图片对比,距离
gap -= BORDER # 减去左边的边框距离
track = self.get_track(gap) # 获取移动轨迹 print('滑动轨迹', track) self.move_to_gap(slider, track)
success = self.wait.until(
EC.text_to_be_present_in_element((By.CLASS_NAME, 'geetest_success_radar_tip_content'), '验证成功'))
print(success) time.sleep(0.5)
self.loginin()
# if not success:
# self.crack()
# else:
# self.login() if __name__ == '__main__':
crack = Login()
crack.crack()

Selenium模拟登陆简书的更多相关文章

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

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

  2. Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取

    区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...

  3. 4 使用Selenium模拟登录csdn,取出cookie信息,再用requests.session访问个人中心(保持登录状态)

    代码: # -*- coding: utf-8 -*- """ Created on Fri Jul 13 16:13:52 2018 @author: a " ...

  4. Python爬虫 —— 知乎之selenium模拟登陆获取cookies+requests.Session()访问+session序列化

    代码如下: # coding:utf-8 from selenium import webdriver import requests import sys import time from lxml ...

  5. selenium模拟浏览器对搜狗微信文章进行爬取

    在上一篇博客中使用redis所维护的代理池抓取微信文章,开始运行良好,之后运行时总是会报501错误,我用浏览器打开网页又能正常打开,调试了好多次都还是会出错,既然这种方法出错,那就用selenium模 ...

  6. Python爬虫-尝试使用人工和OCR处理验证码模拟登入

    刚开始在网上看别人一直在说知乎登入首页有有倒立的汉字验证码,我打开自己的知乎登入页面,发现只有账号和密码,他们说的倒立的验证码去哪了,后面仔细一想我之前登入过知乎,应该在本地存在cookies,然后我 ...

  7. Selenium模拟浏览器抓取淘宝美食信息

    前言: 无意中在网上发现了静觅大神(崔老师),又无意中发现自己硬盘里有静觅大神录制的视频,于是乎看了其中一个,可以说是非常牛逼了,让我这个用urllib,requests用了那么久的小白,体会到sel ...

  8. 3 使用selenium模拟登录csdn

    之前通过F12开发者模式调试,获取网站后台服务器验证用户名和密码的URL之后,再构造post数据的方式会存在一个问题,就是对目标网站的验证机制不明确,构造post数据除了用户名和密码之外,还可能有更复 ...

  9. 使用selenium模拟知网登录

    之前都是用phantomjs和selenium模拟浏览器动作的,后来phantomjs不再更新,就转用chrome了 本次模拟登录的网站是中国知网http://login.cnki.net/login ...

随机推荐

  1. vue-router.esm.js?fe87:16 [vue-router] Route with name 'page' does not exist

    本文地址:http://www.cnblogs.com/veinyin/p/7910525.html 我的路由配置 { path: '/page', name: page, component: pa ...

  2. 下载Google My Tracks

    http://code.google.com/p/mytracks/source/browse/?name=2.0.2#hg%2FMyTracks%253Fstate%253Dclosed 需要类似的 ...

  3. 游戏的物理和数学:Unity中的弹道和移动目标提前量计算

    下载地址:https://www.jianguoyun.com/p/DZPN6ocQ2siRBhihnx8 弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺 ...

  4. JS的全局函数eval解析JSON字符串

    JavaScript eval() 函数 定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法 eval(string) 参数 描述 string 必需. ...

  5. 初窥ThinkPHP

    MVC全称(Model View Controller) Model:模型(可以理解位数据库操作模型) View:视图(视图显示) Controller:(控制器) 简单的说框架就是一个类的集合.集合 ...

  6. 38 - 网络编程-socketserver

    目录 1 socket编程弊端 2 SocketServer模块 2.1 服务器类 2.2 Mixin类 2.3 RequestHandlerClass是啥 2.4 编程接口 3 实现EchoServ ...

  7. 如何使用curl命令指定ip访问url

    有时我们需要测试一个url,但域名并没解析,这时为了一个简单的测试而写host或去做域名解析,显然这并不高效,而有些域名甚至是正式的域名,因此我们可有使用curl命令进行测试 方法一 curl url ...

  8. SpringBoot微服务

    在企业级软件的架构模型上,我们主要讨论下SOA与微服务架构. SOA的全称是Service-Oriented Architecture,可译为“面向服务的架构”,它是一个组件模型,将应用程序的不同功能 ...

  9. ASP.NET Core 2.0 MVC 发布部署--------- CentOS7 X64 具体操作

    .Net Core 部署到 CentOS7 64 位系统中的步骤 1.安装工具 1.apache 2..Net Core(dotnet-sdk-2.0) 3.Supervisor(进程管理工具,目的是 ...

  10. HDU 2544 最短路(floyd+bellman-ford+spfa+dijkstra队列优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找点1到点n的最短路(无向图) 练一下最短路... dijkstra+队列优化: #i ...