selenium
在淘宝镜像中下载指定的chromedriver,windwos的用户将其放在 虚拟环境的scripts
或者python3的环境文件中,总之要和python.exe同级目录,Linux和Mac用户放入/usr/local/bin
目录下
selenium入门
from selenium import webdirver
driver = webdriver.Chrome() # 创建一个Chrome的driver实例对象
# 访问人人登录页面
driver.get(url="http://www.renren.com/")
# 填写用户名和密码
driver.find_element_by_id("email").send_keys("xxx")
driver.find_element_by_id("password").send_keys("xxx")
# 点击登陆
driver.find_element_by_id("login").click()
# 退出
driver.quit()
driver.page_source
网页源码driver.current_url
当前网页的url
selenium处理cookie
通过driver.get_cookies()
能够获取所有的cookie
# 把cookie转化为字典
{cookie['name']: cookie['value'] for cookie in driver.get_cookies()}
#删除一条cookie
driver.delete_cookie("CookieName")
# 删除所有的cookie
driver.delete_all_cookies()
selenium定位元素
# 通过xpath定位元素
driver.find_element_by_xpath("//a")
# 通过链接文字定位
driver.find_element_by_link_text("下一页")
# 通过包含得链接文字定位元素
driver.find_element_by_partial_link_text("下一")
# 通过标签名定位
driver.find_element_by_tag_name("a")
- find_element 返会一个Element对象,如果没找到,报错
- find_elements 返回一个列表,元素项时Elements,如果没找到,返回空列表
**find_element_by_xpath() 或者find_element_by_xpath()中传入得xpath表达式只能定位到标签 ** ,如果需要获取指定element的文本或者属性值:
- elelemt.text 获取文本
- element.get_attribute("") 获取属性内容
切换iframe
网页存在iframe嵌套架构,如果要查找的标签在指定的iframe里面,必须先切换到iframe中才能正确找到
driver.switch_to.frame()
可以传入iframe的id、name、element对象
验证的判断
flask的项目中的验证码逻辑:
- 前端js产生一个UUID,发起图片验证码请求时带上UUID参数
- 后端随机生成一个code,以UUID:code的形式存入Redis数据库中
- 前端POST请求提交验证时,需要携带UUID,后端从redis中读取指定的code和用户输入的进行对比验证
传统的验证码请求方式:
- 请求网页登陆页面的时候,服务器为当前用户开辟session空间,并向浏览器的cookies中写入一个seesion_id
- 浏览器请求验证码验证码图片时会自动携带cookies,seesion_id 会被提交到服务器 ,后端产生随机的code 放入sesion_id指定的sesion空间中
- 前端发起提交验证的 post请求时,也会自动携带cookie,seesion_id 会再次被提交到服务器 ,后端根据session_id在指定的sesion空间中找出曾经存入的code,和前端提交的进行对比验证
此种情况下,应考虑使用requests.session()
来进行验证码突破