环境搭建
python --version
2. 安装selenium (pip install selenium)
3. 安装chorm driver
①. 打开谷歌浏览器, 在地址栏输入 chrome://version/ 查看版本信息
我的版本信息为:
②. 选择合适版本的驱动下载(上图红框为版本号), 如果没有完全匹配的就选最相似匹配的版本下载。
下载地址:http://chromedriver.storage.googleapis.com/index.html
③. 解压下载的驱动放到指定目录,代码调用时指定该目录即可。
把它放在了selenium下的chrome,代码演示如下:
from selenium import webdriver
chrome_driver = r"C:\Python37\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe"
browser = webdriver.Chrome(executable_path=chrome_driver)
#导入之前安装的selelnium包
from selenium import webdriver
#从 time 模块中引入sleep函数,使用sleep函数可以让程序休眠(推迟调用线程的运行)
from time import sleep
url = 'https://mail.163.com/'
driver.get(url)
driver.find_element_by_id("lbNormal").click()
拓展
‘’’
总结一下常见iframe定位方法:
一、非动态的iframe,通常通过以下方式定位:
1.有id,如果唯一,可直接写id
driver.switch_to.frame(“id”)
2.有name,如果唯一,可直接写name
driver.switch_to.frame(“name”)
3.无id,无name,可先定位到iframe元素 (该方法也通常用于定位动态ID)
iframe = driver.find_elements_by_tag_name(“iframe”)[0] (也可以通过Xpath、CSS等定位方法)
driver.switch_to.frame(iframe)
二、遇到动态Id可以利用xpath等元素属性来定位,下面列举xpath中提供的三个非常好的方法:
1.contains(a, b) 如果a中含有字符串b,则返回true,否则返回false
driver.find_element_by_xpath("//div[contains(@id, ‘btn-attention’)]")
2.starts-with(a, b) 如果a是以字符串b开头,返回true,否则返回false
driver.find_element_by_xpath("//div[starts-with(@id, ‘btn-attention’)]")
3.ends-with(a, b) 如果a是以字符串b结尾,返回true,否则返回false
driver.find_element_by_xpath("//div[ends-with(@id, ‘btn-attention’)]")
‘’’
通过定位我们发现iframe的id为动态id:
#x-URS-iframe1574518750431.98
#x-URS-iframe1574518194045.8706
因此采用下面方式定位到iframe会报错
#driver.switch_to.frame(“x-URS-iframe1574518194045.8706”)
因此采用下面的方式进行定位:
driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
driver.find_element_by_name('email').send_keys(name)
driver.find_element_by_name('password').send_keys(passwd)
完整的实例代码参见:https://gitee.com/susucodehome/ceshi
因为京东的登录涉及到图片滑块的验证,因此需要用到cv2这个包对图片进行处理,直接通过如下方式安装opencv即可。
pip install opencv-python
pip install requests
安装Firebug插件,此处我们用的是firebug2.0.19
Firebug官方网址:https://www.getfirebug.com/
导包
import cv2
import time
import numpy as np
from selenium import webdriver
from urllib import request
from selenium.webdriver.common.action_chains import ActionChains
url = "https://passport.jd.com/new/login.aspx?"
brower.get(url)
time.sleep(3)
#使用xpath定位账户登录
s1 = r".//*[@id='content']/div[2]/div[1]/div/div[3]/a"
userlogin = brower.find_element_by_xpath(s1)
userlogin.click()
#定位用户名
username = brower.find_element_by_id("loginname")
username.send_keys(userid)
#定位密码
userpswd = brower.find_element_by_id("nloginpwd")
userpswd.send_keys(password)
time.sleep(5)
定位到登录按钮
brower.find_element_by_id("loginsubmit").click()
注意:此时还没有登录成功,因为京东有滑块验证,因此接下来对滑块进行分析:
破解滑块验证码最为关键的地方在于找到滑块缺口的位置,找到缺口位置后就可以利用Selenium模拟拖动滑块到指定位置实现破解
----------使用Xpath定位到背景图片-------------
# 用于找到登录图片的大图
s2 = r".//*[@id='JDJRV-wrap-loginsubmit']/div/div/div/div[1]/div[2]/div[1]/img"
bigimg = brower.find_element_by_xpath(s2).get_attribute("src")
----------使用Xpath定位到滑块图片-------------
# 用来找到登录图片的小滑块图片
s3 = r".//*[@id='JDJRV-wrap-loginsubmit']/div/div/div/div[1]/div[2]/div[2]/img"
smallimg = brower.find_element_by_xpath(s3).get_attribute("src")
----------获取图片并灰度化-------------
block = cv2.imread(slideimg, 0)
template = cv2.imread(backimg, 0)
# 获取偏移量
result = cv2.matchTemplate(block, template, cv2.TM_CCOEFF_NORMED)
# 查找block在template中的位置,返回result是一个矩阵,是每个点的匹配结果
x, y = np.unravel_index(result.argmax(), result.shape)
# 获取滑块
element = brower.find_element_by_xpath(s3)
ActionChains(brower).click_and_hold(on_element=element).perform()
ActionChains(brower).move_to_element_with_offset(to_element=element, xoffset=y, yoffset=0).perform()
ActionChains(brower).release(on_element=element).perform()
time.sleep(3)