selenium模块
- 为什么需要使用selenium模块?
- selenium可以更快捷的获取网站中动态加载的数据
- 便捷的实现模拟登录
- 什么是selenium模块?
- 基于浏览器自动化的一个模块
- selenium使用
- 环境安装:pip install selenium
- 下载一个浏览器的驱动程序
- https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/(edge浏览器)
- 可以自己查找对应浏览器的驱动下载网站
- 实例化一个selenium对象
- 编写浏览器自动化代码
- 初始用
from selenium import webdriver from lxml import etree from time import sleep # 实例化一个浏览器对象(传入浏览器的驱动器) # 直接写路径也行,也可以不用写 # bro=webdriver.Edge('msedgedriver.exe') bro=webdriver.Edge('msedgedriver.exe') # 让浏览器发起一个指定url对应请求 bro.get('http://scxk.nmpa.gov.cn:81/xk/') # 获取浏览器当前页面的页面源码数据 page_text=bro.page_source tree=etree.HTML(page_text) li_list=tree.xpath('//ul[@id="gzlist"]/li') for li in li_list: name=li.xpath('./dl/@title')[0] print(name) # 睡眠5秒后关闭浏览器 sleep(5) bro.quit()
- 相关基础语法
- 发起请求:get()
- 在selenium对象发送请求时的url必须带上超文本协议前缀
- 标签定位:find系列方法
- 标签交互:send_keys(‘xxx’)
- 执行js程序:excut_script(‘就js代码’)
- 前进、后退:forward()、back()
- 关闭浏览器:quit()
- 发起请求:get()
- 实战之操纵淘宝
from selenium import webdriver from time import sleep bro=webdriver.Edge() bro.get('https://www.taobao.com/') # 标签定位 serch_input=bro.find_element_by_id('q') # 标签交互,搜索框输入内容 serch_input.send_keys('Iphone') # 执行一组js程序 # 向下滚动 bro.execute_script('window.scrollTo(0,document.body.scrollHeight)') btn=bro.find_element_by_css_selector('.btn-search') # 点击搜索按钮 btn.click() bro.get('https://www.baidu.com') # 后退 sleep(2) bro.back() # 前进 sleep(2) bro.forward() sleep(5) bro.quit()
- selenium处理iframe以及动作链
- 如果定位的标签在iframe中则必须要使用switch_to.frame(‘id’)
- 动作链(拖动):from selenium.webdriver import ActionChains导入动作链包
- 实例化一个动作链对象
- action=ActionChains(bro)
- 触发长按且点击操作
- action.click_and_hold(div)
- 进行拖动
- action.move_by_offset(17,10)
- 动作立即执行
- perform()
- 释放动作链
- action.release()
- 实例化一个动作链对象
- 实操:
from selenium import webdriver from time import sleep # 导入动作链的类 from selenium.webdriver import ActionChains bro=webdriver.Edge() bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') # 如果要定位的标签在iframe标签中,则进行操作 bro.switch_to.frame('iframeResult')# 切换定位的作用域 div=bro.find_element_by_id('draggable') # 动作链 action=ActionChains(bro) # 点击长安指定的标签 action.click_and_hold(div) for i in range(5): # perform()立即 执行动作链操作 action.move_by_offset(17,10).perform() sleep(0.2) # 释放动作链 action.release() bro.quit()
- 模拟登录
- 实战之QQ空间登录
from selenium import webdriver from time import sleep bro=webdriver.Edge() bro.get('https://qzone.qq.com/') bro.switch_to.frame('login_frame') a_tag=bro.find_element_by_id("img_out_2609320777") a_tag.click()
- 无头浏览器和规避检测
from selenium import webdriver from time import sleep # 实现无可视化界面 # 实现规避检测 from selenium.webdriver.edge.options import Options edge_options=Options() edge_options.add_argument('--headless') edge_options.add_argument('--disable-gpu') # 如何实现让selenium规避被检测到的风险 edge_options.add_experimental_option('excludeSwitches',['enable-automation']) bro=webdriver.Edge(options=edge_options) # 无可视化界面(无头浏览器),phantomJs bro.get('https://baidu.com') print(bro.page_source) bro.quit()