Selenium模拟登陆简书
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模拟登陆简书的更多相关文章
- 验证码破解 | Selenium模拟登录简书
使用超级鹰打码平台处理登录的文字点击验证码 import time from io import BytesIO from PIL import Image from selenium import ...
- Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取
区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...
- 4 使用Selenium模拟登录csdn,取出cookie信息,再用requests.session访问个人中心(保持登录状态)
代码: # -*- coding: utf-8 -*- """ Created on Fri Jul 13 16:13:52 2018 @author: a " ...
- Python爬虫 —— 知乎之selenium模拟登陆获取cookies+requests.Session()访问+session序列化
代码如下: # coding:utf-8 from selenium import webdriver import requests import sys import time from lxml ...
- selenium模拟浏览器对搜狗微信文章进行爬取
在上一篇博客中使用redis所维护的代理池抓取微信文章,开始运行良好,之后运行时总是会报501错误,我用浏览器打开网页又能正常打开,调试了好多次都还是会出错,既然这种方法出错,那就用selenium模 ...
- Python爬虫-尝试使用人工和OCR处理验证码模拟登入
刚开始在网上看别人一直在说知乎登入首页有有倒立的汉字验证码,我打开自己的知乎登入页面,发现只有账号和密码,他们说的倒立的验证码去哪了,后面仔细一想我之前登入过知乎,应该在本地存在cookies,然后我 ...
- Selenium模拟浏览器抓取淘宝美食信息
前言: 无意中在网上发现了静觅大神(崔老师),又无意中发现自己硬盘里有静觅大神录制的视频,于是乎看了其中一个,可以说是非常牛逼了,让我这个用urllib,requests用了那么久的小白,体会到sel ...
- 3 使用selenium模拟登录csdn
之前通过F12开发者模式调试,获取网站后台服务器验证用户名和密码的URL之后,再构造post数据的方式会存在一个问题,就是对目标网站的验证机制不明确,构造post数据除了用户名和密码之外,还可能有更复 ...
- 使用selenium模拟知网登录
之前都是用phantomjs和selenium模拟浏览器动作的,后来phantomjs不再更新,就转用chrome了 本次模拟登录的网站是中国知网http://login.cnki.net/login ...
随机推荐
- synchronized的实现原理
常见三种使用方法: 1)普通同步方法,锁是当前实例: 2)静态同步方法,锁是当前类的Class实例,Class数据存在永久代中,是该类的一个全局锁: 3)对于同步代码块,锁是synchronized括 ...
- 重构改善既有代码设计--重构手法11:Move Field (搬移字段)
你的程序中,某个字段被其所驻类之外的另一个类更多的用到.在目标类建立一个新字段,修改源字段的所有用户,令它们改用新字段. 动机:在类之间移动状态和行为,是重构过程中必不可少的措施.随着系 ...
- css3同心圆闪烁扩散效果
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Caffe提取任意层特征并进行可视化
现在Caffe的Matlab接口 (matcaffe3) 和python接口都非常强大, 可以直接提取任意层的feature map以及parameters, 所以本文仅仅作为参考, 更多最新的信息请 ...
- python3学习笔记.3.条件控制与循环
1.条件控制 关键字 if.elif.else 一般形式如下: if 条件1: 结果1 elif 条件2: 结果2 else: 结果3 注意:条件后的:语句的缩进的是相同的 2.循环语句 关键字有 ...
- (1)剑指Offer之斐波那契数列问题和跳台阶问题
一 斐波那契数列 题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 问题分析: 可以肯定的是这一题通过递归的方式是肯定能做出来,但是这样会有 ...
- 【appium】根据UIAutomator定位元素等等资料
https://www.cnblogs.com/paulwinflo/p/4742529.html http://www.cnblogs.com/meitian/p/6103391.html http ...
- Nim 游戏、SG 函数、游戏的和
Nim游戏 Nim游戏定义 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG).满足以 ...
- VS里属性窗口中的生成操作释义
生成操作:无,编译 ,内容 ,嵌入的资源... 如果是类.cs文件,就得编译之后你才能使用的.如果是txt,excel 这种文件,就属性内容或者资源文件了. 内容(Content) - 不编译该文件, ...
- Mybatis的关联映射
实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系.针对多表之间的操作,MyBatis提供了关联映射, 通过关联映射就可以很好的处理对象与对象之间的关联关 ...