@[TOC](python selenum学习笔记(一) 登录bilibil)

利用selenum模拟浏览器操作登录bilibili

之前学习网站内容抓取的时候,一般都是get方法,获取response,主要是对HTML内的元素进行抓取。要获得与js代码交互之后的内容不是很方便。
利用 selenum 来进行一些交互操作就很便利了。目前学习中。

代码及思路

一、首先启动selenum的浏览器模拟器

from selenium import webdriver
browser = webdriver.Firefox()#创建firefox 浏览器模拟
browser.get("https://passport.bilibili.com/login") #bilibili登录网址

二、然后输入账号密码

usertext = browser.find_element_by_id('login-username')
usertext.send_keys("yourusername")
password = browser.find_element_by_id('login-passwd')
password.send_keys('yourpassword')
btn = browser.find_element_by_css_selector('.btn-login')#找到登录按钮

三、点击登录

btn.click()

四、这个时候会弹出一个滑块验证的对话框,查找html元素的方式是找不到图片的src的,要通过js注入的操作。这段代码当时也是参考网上的,但是找不到了那个作者了,sorry。

import base64
JS = 'return document.getElementsByClassName("geetest_canvas_bg geetest_absolute")[0].toDataURL("image/png");'
im_info = browser.execute_script(JS)
im_base64 = im_info.split(',')[1]  #拿到base64编码的图片信息
im_bytes = base64.b64decode(im_base64)  #转为bytes类型
with open('bg.png','wb') as f:  #保存图片到本地f.write(im_bytes)
JS = 'return document.getElementsByClassName("geetest_canvas_slice geetest_absolute")[0].toDataURL("image/png");'
im_info_slice = browser.execute_script(JS)
im_base64_slice = im_info_slice.split(',')[1]  #拿到base64编码的图片信息
im_bytes_slice = base64.b64decode(im_base64_slice)  #转为bytes类型
with open('btn.png','wb') as f0:  #保存图片到本地f0.write(im_bytes_slice)

五、然后对图像进行操作,获取需要滑动的距离。
这个时候需要引入一些库opencv,pillow,numpy。

from PIL import Image, ImageEnhance
import cv2
import numpy as np

六、按照网上的代码要要查找滑块在 背景图上的位置 ,代码应该是:

res = cv2.matchTemplate(template,img_gray,cv2.TM_CCOEFF_NORMED)

就可以返回查找的结果了,但是输出这个结果发现都是“[]”,空队列。怎么回事呢?
原来哔哩哔哩的滑块图片和背景图片一样大…其他地方全是白色,那么这两个图片肯定无法“查找到”匹配的位置了。

两个图片一样大。那么必须对滑块图片进行一些裁剪。
但仔细观察,滑块图片带外发光的有没有?虽然不知道对查找有没有影响还是弄掉比较好。

def cut_img(img2):rows,cols,channels = img2.shape #获取文件大小img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY) #获取蒙版kernel = np.ones((4,4),np.uint8) #...这个如果比较大,那么接下来操作的效果就比较狠,我是这么理解的erode=cv2.erode(mask,kernel,iterations=2) #侵蚀,让图片白色区域缩小dilate=cv2.dilate(erode,kernel,iterations=2)#再扩张白色部分,一来二去,小的白色区域就消失掉了(原来那些发光的痕迹),得到一个干净的蒙版img2_fg = cv2.bitwise_and(img2,img2,mask = dilate)#获取干净的滑块,但是文件大小还是260*160 # 因为对opencv不是很熟悉,也不知道怎么快速的裁切白色的区域就用了笨办法list_row = [] #存储行信息的listlist_col = [] #存储列信息的listfor i in range(rows):for j in range(cols):if all(img2_fg[i,j]==(0,0,0)): #如果是白色pass #那没事了else:list_row.append(i) #如果不是,把行号记录下来。breakfor i in range(cols):for j in range(rows):if all(img2_fg[j,i]==(0,0,0)):#如果是白色pass #那没事了else:list_col.append(i) #如果不是,把列号记录下来。breakx,y = min(list_row),min(list_col) # 获取行和列的最小值x1,y1 = max(list_row),max(list_col) #行和列的最大值#res_img = img2_fg[x:x1,y:y1]  正常的裁切应该是这样的,但是我发现这个滑块居然有内发光,不知道是否影响图像查找,剪了剪了res_img = img2_fg[x+8:x1-8,y+8:y1-8] #所以左右再裁剪8像素。。。return res_img #返回裁剪后的图像

得到这样的图。。。
然后执行查找匹配的代码:

def match():img_tar = cv2.imread('btn.png') #加载滑块图片img_rgb = cut_img(img_tar) #利用刚刚的函数进行裁剪img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) #获取灰度文件,灰度文件查找速度快,我没看出来区别,彩色查找也可以吧应该template = cv2.imread('bg.png',0) #获取灰度文件,如果不带,第二个参数 0 ,就是彩色。h, w = img_gray.shape[::-1] #获得裁剪后滑块图片的高和宽res = cv2.matchTemplate(template,img_gray,cv2.TM_CCOEFF_NORMED)  #查找匹配# 使用二分法查找阈值的精确值 ,这段是我抄的,大概意思是res列队中找到匹配的最好的。原理没看懂。L = 0R = 1run = 1while run < 20:run += 1threshold = (R + L) / 2if threshold < 0:return Noneloc = np.where( res >= threshold)if len(loc[1]) > 1:L += (R - L) / 2elif len(loc[1]) == 1:print('目标区域起点x坐标为:%d' % loc[1][0])breakelif len(loc[1]) < 1:R -= (R - L) / 2print(loc)return loc[1][0] #返回最好匹配的顶点(x,y)的x值,就是横坐标啦

七、移动滑块,这个时候需要引入一些库。

from selenium.webdriver import ActionChains
distance = match() #得到匹配位置的顶点很坐标的位置。
offpx = (distance + 11 - 30) #一般经过裁剪的滑块图片宽为22像素,那么中心点横坐标就要加上11,但是因为滑块的起始位置不是0,而是所以加上30,这个30,在别的滑块验证的地方自己调整
slider = browser.find_element_by_css_selector('.geetest_slider_button')#获取滑块元素
#操作滑块 因为模拟人操作的感觉,所以做了一些调整,不是一步到位,网上参考的资料中,给滑块做一个滑行轨道值的方式,在b站貌似不需要的。
ActionChains(browser).click_and_hold(slider).perform() #按住不松
ActionChains(browser).move_by_offset(xoffset=offpx, yoffset=0).perform()
ActionChains(browser).move_by_offset(xoffset=-3, yoffset=0).perform()
time.sleep(0.2)
ActionChains(browser).move_by_offset(xoffset=3, yoffset=0).perform()
time.sleep(0.1)
ActionChains(browser).move_by_offset(xoffset=-2, yoffset=0).perform()
time.sleep(0.3)
ActionChains(browser).move_by_offset(xoffset=2, yoffset=0).perform()
time.sleep(0.1)
ActionChains(browser).release(slider).perform() #松开

目前登录还是蛮准确的,但是登录上去干啥还没想好。
因为代码在jupyter notebook中测试的,有点乱就不整理了。因为我发现:

使用浏览器配置文件自动登录网站

# coding = utf-8
from selenium import webdriverprofileDir = r'yourprofiledir' #你的配置文件目录
profile = webdriver.FirefoxProfile(profileDir)
driver = webdriver.Firefox(profile)
driver.get("https://passport.bilibili.com/login")

直接就登录了,气人不气人?
firefox: 获取配置文件目录的方法是:在浏览器中键入:about:support找到“配置文件夹”…
Chrome: 地址栏访问chrome://version,可以查看用户资料存储位置:

参考资料

  • https://blog.csdn.net/weijiaxin2010/article/details/88350584
  • https://blog.csdn.net/jingjing_94/article/details/80555511

python selenum学习笔记(一) 登录bilibil相关推荐

  1. Python tkinter 学习笔记(2)-- 控件、组件(二)

    Python tkinter 学习笔记(1)-- 第一个窗口之HelloWorld 教程 Python tkinter 学习笔记(2)-- 控件.组件(一) > 续上一章节 Python tki ...

  2. python自动化测试学习笔记合集三

    上次我们学到了redis的一些操作,下面来实际运用以下. 这里我们先来学习一下什么是cookie和session. 什么是Cookie 其实简单的说就是当用户通过http协议访问一个服务器的时候,这个 ...

  3. python模块学习笔记

    python模块学习笔记 1.Python自动发送邮件smtplib 2.制作二维码图片MyQR 3.绝对值模块math 4.CSV模块 5.openpyxl 模块,操作Excel文件 ExcelMa ...

  4. Python自动化学习笔记(八)——接口开发、发送网络请求、发送邮件、写日志...

    1.接口开发(flask模块) Python自动化学习笔记(七)接口开发部分的内容补充 1.1参数为json格式: flask.request.is_json #判断参数是否是json格式 flask ...

  5. Python tkinter 学习笔记(3) -- 界面布局1(grid和pack)

    Python tkinter 学习笔记(1)-- 第一个窗口之HelloWorld 教程 Python tkinter 学习笔记(2)-- 控件.组件(一) Tkinter 界面布局(grid\pac ...

  6. python爬虫学习笔记 1.9 (Handler处理器 和 自定义Opener)

    python爬虫学习笔记 1.1(通用爬虫和聚焦爬虫) python爬虫学习笔记 1.2 ( HTTP和HTTPS ) python爬虫学习笔记 1.3 str和bytes的区别 python爬虫学习 ...

  7. python做直方图-python OpenCV学习笔记实现二维直方图

    本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d ...

  8. python 正则学习笔记

    python 正则学习笔记 官方document #1.0 import re m=re.search('(?<=abc)def','cxabcdefgb')print(m.group(0))# ...

  9. Python数据结构学习笔记——链表:无序链表和有序链表

    目录 一.链表 二.无序链表 实现步骤分析 三.无序链表的Python实现代码 四.有序链表 实现步骤分析 五.有序链表的Python实现代码 结语 一.链表 链表中每一个元素都由为两部分构成:一是该 ...

最新文章

  1. CVPR2020 - SLAM workshop 在线盛会预告
  2. python编程基础_月隐学python第一课
  3. 在 Visual C++ 中使用内联汇编
  4. 2018年11月27日 分类与集合
  5. 不要残渣10w+,推荐8个我平时看的公众号
  6. C语言求素数中flag的作用,c语言编程判断素数 c语言程序设计(判断素数)
  7. 2037 data maker
  8. 计算几何【套模板,推荐模板】 Separating Pebbles UVALive - 7461
  9. 前端自学学习笔记——JavaScript
  10. 基于微信小程序的宠物医院诊所小程序源码
  11. 陀螺仪随机误差的Allan方差分析
  12. 《操作系统》-生产者消费者问题
  13. 少儿编程Scratch学习教程4--基本操作(一)特效例子
  14. Android录音,PCM音频数据打包成AAC
  15. 使用设计模式出任CEO迎娶白富美(4)--走马上任,华丽转身
  16. 201217,成交量异动检测
  17. PDF打印机 能打印A2以上纸张
  18. 瑞工热敏票据打印机不自动裁切的设置
  19. 【c#系列】PDF进行操作-浏览、分割、合并、插入、删除(2)
  20. unity3d泰斗破坏神2----课程列表

热门文章

  1. nginx的worker_processes优化
  2. “长光卫星”已完成2.5亿元天使轮融资,已是全国规模最大的民营商业卫星公司... 1
  3. MCU-MBD单元测试流程
  4. Python计算机二级编程题真题及考点总结(上篇)
  5. 《百年孤独》的读后感范文3483字
  6. 单臂路由配置实例讲解
  7. 第二次作业网络问卷制作
  8. sqlserver 根据汉字获取拼音首字母 函数
  9. 关于VCC、VDD、VSS、GND的术语解释
  10. 数独算法+文件读取+结果保存到文件+Python3版本