selenium
最初是一个自动化测试工具,而爬虫中使用它主要是为了解决 requests 无法直接执行 JavaScript 代码的问题 selenium 本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器。
总结:基于浏览器自动化的一个模块。
- 便捷的获取网站动态加载的数据
- 便捷实现模拟登录
- pip install selenium
下载路径:http://chromedriver.storage.googleapis.com/index.html
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()
- 发起请求:
- get(url)
- 获取页面源码数据:page_source
- browser.page_source
- 标签定位:find一系列方法
- 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()
- 标签交互:
- 输入文字时用:send_keys('xxx’)方法,
- 清空文字时用:clear()方法,
- 点击按钮时用:click()方法。
- 执行js程序:execute_script(‘jsCode’)
- browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
- 前进和后退:back(),forward()
- 关闭浏览器:quit()
- 如果定位的标签存在于iframe标签中,必须使用switch_to.frame('iframeID')方法。
- browser.switch_to.frame('iframeResult')
- 动作链:from selenium.webdriver import ActionChains
- 实例化一个动作链对象:actions.click_and_hold(source)
- click_and_hold(source):长按且点击
- move_by_offset(x,y)
- perform():让动作链立即执行
- actions.release():释放动作链
实现一个节点的拖曳操作,将某个节点从一处拖曳到另外一处。
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
# 实例化一个动作链对象
actions = ActionChains(browser)
# actions.drag_and_drop(source, target)
# 长按且点击
actions.click_and_hold(source)
time.sleep(3)
for i in range(5):
actions.move_by_offset(xoffset=17,yoffset=0).perform()
time.sleep(0.5)
actions.release()
需求:模拟登录qq空间
# _author: 17393
# date: 2020/9/24
from selenium import webdriver
from time import sleep
bro = webdriver.Chrome('./chromedriver.exe')
bro.get('https://qzone.qq.com/')
bro.switch_to.frame('login_frame')
bro.find_element_by_id('switcher_plogin').click()
tag_Name = bro.find_element_by_id('u')
tag_Pwd = bro.find_element_by_id('p')
tag_Name.send_keys('1739359757')
tag_Pwd.send_keys('xxxxxxx')
btn = bro.find_element_by_id('login_button').click()
sleep(10)
bro.quit()
from selenium import webdriver
#
from selenium.webdriver.chrome.options import Options
import time
# 创建一个参数对象,用来控制chrome以无界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 创建浏览器对象
browser = webdriver.Chrome(executable_path='./chromedriver.exe', chrome_options=chrome_options)
# 上网
url = 'http://www.baidu.com/'
browser.get(url)
time.sleep(3)
browser.save_screenshot('baidu.png')
browser.quit()
现在不少大网站有对selenium采取了监测机制。比如正常情况下我们用浏览器访问淘宝等网站的 window.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)
- 使用selenium打开登录页面
- 对当前selenium打开的页面进行截图
- 对截取的页面进行局部裁剪
- 好处:将验证码图片和模拟登录一一对应
- 使用超级鹰识别验证码图片((坐标)