selenium
浏览器创建
元素定位
节点交互
selenium 相关的动作行为制定
动作链
模拟 JavaScript
获取页面源码数据
前进和后退
cookie 处理
异常处理
selenium 规避被检测识别
现在不少大网站有对 selenium 采取了监测机制. 比如正常情况下我们用浏览器访问淘宝等网站的 Windows.navigator.webdriver 的值为
undefined. 而使用 selenium 访问则该值为 true. 那么如何解决这个问题呢?
只需要设置 Chromedriver 的启动参数即可解决问题. 在启动 Chromedriver 之前, 为 Chrome 开启实验性功能参数 excludeSwitches, 它的值为['enable-automation'], 完整代码如下:
- from selenium.webdriver import Chrome
- from selenium.webdriver import ChromeOptions
- option = ChromeOptions()
- option.add_experimental_option('excludeSwitches', ['enable-automation'])
- driver = Chrome(options=option)
- from selenium import webdriver
- from lxml import etree
- import time
- from selenium.webdriver import ChromeOptions
- option = ChromeOptions()
- option.add_experimental_option('excludeSwitches', ['enable-automation'])
- bro = webdriver.Chrome(executable_path='./chromedriver.exe',options=option)
- # 让浏览器对指定 url 发起访问
- bro.get('http://125.35.6.84:81/xk/')
- # 获取浏览器当前打开页面的页面源码数据(可见即可得)
- page_text = bro.page_source
- time.sleep(2)
- tree = etree.html(page_text)
- name = tree.xpath('//*[@id="gzlist"]/li[1]/dl/a/text()')[0]
- print(name)
- time.sleep(5)
- bro.quit()
- View Code
一. 基本介绍与安装
简介
selenium 最初是一个自动化测试工具, 而爬虫中使用它主要是为了解决 requests 无法直接执行 JavaScript 代码的问题 selenium 本质是通过驱动浏览器, 完全模拟浏览器的操作, 比如跳转, 输入, 点击, 下拉等, 来拿到网页渲染之后的结果, 可支持多种浏览器
环境安装
1. 下载安装
pip install selenium
2. 下载浏览器驱动程序
http://chromedriver.storage.googleapis.com/index.html
3. 查看浏览器版本与驱动的对应关系
https://blog.csdn.net/huilan_same/article/details/51896672
1. 基本实现
使用 selenium 打开浏览器并搜索百度美女图片, 之后关闭浏览器
- from selenium import webdriver
- from time import sleep
- # 后面是你的浏览器驱动位置, 记得前面加 r'','r'是防止字符转义的
- driver = webdriver.Chrome(r'./chromedriver.exe')
- # 用 get 打开百度页面
- driver.get("http://www.baidu.com")
- # 查找页面的 "设置" 选项, 并进行点击
- driver.find_elements_by_link_text('设置')[0].click()
- sleep(2)
- # # 打开设置后找到 "搜索设置" 选项, 设置为每页显示 50 条
- driver.find_elements_by_link_text('搜索设置')[0].click()
- sleep(2)
- # 选中每页显示 50 条
- m = driver.find_element_by_id('nr')
- sleep(2)
- m.find_element_by_xpath('//*[@id="nr"]/option[3]').click()
- m.find_element_by_xpath('.//option[3]').click()
- sleep(2)
- # 点击保存设置
- driver.find_elements_by_class_name("prefpanelgo")[0].click()
- sleep(2)
- # 处理弹出的警告页面 确定 accept() 和 取消 dismiss()
- driver.switch_to_alert().accept()
- sleep(2)
- # 找到百度的输入框, 并输入 美女
- driver.find_element_by_id('kw').send_keys('美女')
- sleep(2)
- # 点击搜索按钮
- driver.find_element_by_id('su').click()
- sleep(2)
- # 在打开的页面中找到 "Selenium - 开源中国社区", 并打开这个页面
- driver.find_elements_by_link_text('美女_百度图片')[0].click()
- sleep(3)
- # 关闭浏览器
- driver.quit()
使用 selenium 爬取药监局页面数据
- from selenium import webdriver
- from lxml import etree
- import time
- bro = webdriver.Chrome(executable_path='./chromedriver.exe')
- # 让浏览器对指定 url 发起访问
- bro.get('http://125.35.6.84:81/xk/')
- # 获取浏览器当前打开页面的页面源码数据(可见即可得)
- page_text = bro.page_source
- time.sleep(2)
- tree = etree.HTML(page_text)
- name = tree.xpath('//*[@id="gzlist"]/li[1]/dl/a/text()')[0]
- print(name)
- time.sleep(3)
- bro.quit()
二. 使用
1. 浏览器创建
Selenium 支持非常多的浏览器, 如 Chrome,Firefox,Edge 等, 还有 Android,BlackBerry 等手机端的浏览器. 另外, 也支持无界面浏览器 PhantomJS.
- from selenium import webdriver
- browser = webdriver.Chrome()
- browser = webdriver.Firefox()
- browser = webdriver.Edge()
- browser = webdriver.PhantomJS()
- browser = webdriver.Safari()
2. 元素定位
常用的元素定位方式:
- find_element_by_id()
- find_element_by_name()
- find_element_by_class_name()
- find_element_by_tag_name()
- find_element_by_link_text()
- find_element_by_partial_link_text()
- find_element_by_xpath()
- find_element_by_CSS_selector()
注意
find_element_by_xxx 找的是第一个符合条件的标签, find_elements_by_xxx 找的是所有符合条件的标签.
根据 ID,CSS 选择器和 XPath 获取, 它们返回的结果完全一致.
另外, Selenium 还提供了通用方法 find_element(), 它需要传入两个参数: 查找方式 By 和值. 实际上, 它就是
find_element_by_id()
这种方法的通用函数版本, 比如
find_element_by_id(id)
就等价于
find_element(By.ID, id)
, 二者得到的结果完全一致.
3. 节点交互
Selenium 可以驱动浏览器来执行一些操作, 也就是说可以让浏览器模拟执行一些动作. 比较常见的用法有: 输入文字时用 send_keys()方法, 清空文字时用 clear()方法, 点击按钮时用 click()方法.
- from selenium import webdriver
- import time
- browser = webdriver.Chrome()
- browser.get('https://www.taobao.com')
- input = browser.find_element_by_id('q')
- input.send_keys('MAC')
- time.sleep(1)
- input.clear()
- input.send_keys('IPhone')
- button = browser.find_element_by_class_name('btn-search')
- button.click()
- browser.quit()
4.selenium 相关的动作行为制定
找到淘宝页面的搜索 element 元素, 并填入搜索条件, 滚动窗口之后搜索
- from selenium import webdriver
- import time
- bro = webdriver.Chrome(executable_path='./chromedriver.exe')
- bro.get('https://www.taobao.com')
- # 节点定位 find 系列的方法
- input_text = bro.find_element_by_id('q')
- # 节点交互
- input_text.send_keys('苹果')
- time.sleep(2)
- # 执行 JS 程序(JS 注入)
- bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
- btn = bro.find_element_by_css_selector('.btn-search')
- btn.click()
- time.sleep(3)
- bro.quit()
5. 动作链
一些操作, 它们没有特定的执行对象, 比如鼠标拖曳, 键盘按键等, 这些动作用另一种方式来执行, 那就是动作链. 比如, 现在实现一个节点的拖曳操作, 将某个节点从一处拖曳到另外一处, 可以这样实现:
- from selenium import webdriver
- # 导入动作链对应的模块
- from selenium.webdriver import ActionChains
- import time
- bro = webdriver.Chrome(executable_path='./chromedriver.exe')
- bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
- # 如果定位的节点是被包含在 iframes 节点之中的, 则必须使用 switch_to 进行 frame 的切换
- bro.switch_to.frame('iframeResult')
- div_tag = bro.find_element_by_id('draggable')
- # 实例化一个动作链对象(需要将浏览器对象作为参数传递给该对象的构造方法)
- action = ActionChains(bro)
- # 单击且长按
- action.click_and_hold(div_tag)
- for i in range(5):
- #让 div 向右移动
- action.move_by_offset(17,0).perform()
- #perform()立即执行动作链
- time.sleep(0.5)
- time.sleep(2)
- bro.quit()
6. 模拟 JavaScript
对于某些操作, Selenium API 并没有提供. 比如, 下拉进度条, 它可以直接模拟运行 JavaScript, 此时使用 execute_script()方法即可实现, 代码如下:
- from selenium import webdriver
- browser = webdriver.Chrome()
- browser.get('https://www.jd.com/')
- browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
- browser.execute_script('alert("123")')
7. 获取页面源码数据
通过 page_source 属性可以获取网页的源代码, 接着就可以使用解析库 (如正则表达式, Beautiful Soup,pyquery 等) 来提取信息了
8. 前进和后退
模拟浏览器的前进后退
- import time
- from selenium import webdriver
- browser=webdriver.Chrome()
- browser.get('https://www.baidu.com')
- browser.get('https://www.taobao.com')
- browser.get('http://www.sina.com.cn/')
- browser.back()
- time.sleep(10)
- browser.forward()
- browser.close()
9.cookie 处理
使用 Selenium, 还可以方便地对 Cookies 进行操作, 例如获取, 添加, 删除 Cookies 等. 示例如下:
- from selenium import webdriver
- browser = webdriver.Chrome()
- browser.get('https://www.zhihu.com/explore')
- print(browser.get_cookies())
- browser.add_cookie({
- 'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'
- })
- print(browser.get_cookies())
- browser.delete_all_cookies()
- print(browser.get_cookies())
10. 异常处理
- from selenium import webdriver
- from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException
- try:
- browser=webdriver.Chrome()
- browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
- browser.switch_to.frame('iframssseResult')
- except TimeoutException as e:
- print(e)
- except NoSuchFrameException as e:
- print(e)
- finally:
- browser.close()
来源: http://www.bubuko.com/infodetail-3076999.html