先来认识下Selenium
Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。
就是说Selenium 可以实现浏览器的模拟操作,我们就可以通过模拟实现网页爬取。
好处就是可以简单的绕过验证码机制(只需首次输入),去掉登录、cookie更新、重定向等的烦恼。
1、环境
我是使用chrome,下载Chrome驱动包:http://chromedriver.storage.googleapis.com/index.html,根据你的chrome版本下载,并放在python安装根目录
2、依赖库安装
pip install selenium
3、依赖库引用
from selenium import webdriver
4、验证码登录,提供自动输入用户名、密码,手动控制台输入验证码
loginurl = 'http://XXX.cn' # 登录页面
# 加载webdriver驱动,用于获取登录页面标签属性
driver = webdriver.Chrome()
driver.get(loginurl) # 请求登录页面
driver.find_element_by_class_name('username').clear() # 获取用户名输入框,并先清空
driver.find_element_by_class_name('username').send_keys('用户名') # 输入用户名
driver.find_element_by_class_name('password').clear() # 获取密码框,并清空
driver.find_element_by_class_name('password').send_keys('密码') # 输入密码
captcha = driver.find_element_by_class_name('yzm_img') # 获取验证码标签
submit = driver.find_element_by_class_name('submit_btn') # 获取提交按钮
# 判断是否需要验证码
if captcha:
captcha_field = driver.find_element_by_class_name('yzm') # 获取验证码输入框
text = input("请输入验证码:") # 控制栏输入验证码
captcha_field.send_keys(text) # 将输入的验证码传递给selenium打开的浏览器
submit.click() # 按钮提交并登录
else:
submit.click() # 无验证码则直接登录提交
5、注意事项1,浏览器加载问题,两种等待方法,常用方法二
time.sleep(3) # 强制等待,休眠3秒
driver.implicitly_wait(60) # 隐性等待,加载完就下一步否则最长等60秒,
5、注意事项2,八种选择方法
webdriver 提供了一系列的对象定位方法,常用的有以下几种:
- id定位:find_element_by_id()
- name定位:find_element_by_name()
- class定位:find_element_by_class_name()
- link定位:find_element_by_link_text()
- partial link定位:find_element_by_partial_link_text()
- tag定位:find_element_by_tag_name()
- xpath定位:find_element_by_xpath()
- css定位:find_element_by_css_selector()
详见https://www.cnblogs.com/eastonliu/p/9088301.html
6、注意事项3,获取一组元素记得使用find_elements,如
tr = div.find_elements_by_tag_name('tr')[1]
td = tr.find_elements_by_tag_name('td')
time = td[0].text
7、class含有空格时解决方法
在实际进行元素定位时,经常发现class name是有多个class组合的复合类,中间以空格隔开。如果直接进行定位会出现报错,可以通过以下方式处理:
driver.find_element_by_class_name('yzm_img')
#class属性唯一但是有空格,选择空格两边唯一的那一个
self.driver.find_elements_by_class_name('table-dragColumn')[0].click()
#若空格隔开的class不唯一可以通过索引进行定位
driver.find_element_by_css_selector('.dtb-style-1.table-dragColumns').click()
#通过css方法进行定位(空格以‘.’代替)
8、多层级元素获取
div = driver.find_element_by_id('tttggg')
tr = div.find_elements_by_tag_name('tr')[1]
td = tr.find_elements_by_tag_name('td')
time = td[0].text