8-1
7-9

简介

浏览器自动化测试框架,它可以像真人操作一样来访问浏览器,可以用于调试网站在不同浏览器的适配程度,它支持的语言很多。它本质上就是利用JavaScript来对浏览器进行模拟真人调试

包和驱动/对象

selenium
webdriver浏览器驱动包
time

浏览器驱动

下载网址:https://sites.google.com/a/chromium.org/chromedriver/downloads
注意:本机的浏览器版本要和浏览器驱动的支持版本适配,否则会报错

Chrome对象

方法
get 打开目标网页
quit 关闭浏览器
get_cookies 获取cookies
get_cookie(cookieName) 获取目标cookie
属性
page_source 页面dom结构以及js
maximize_window() 最大化窗体

python调用

  1. from selenium import webdriver
  2. #浏览器对象
  3. browser = webdriver.Chrome(executable_path="/Users/user3/python/selenium.exe")
  4. print(browser.page_source)
  5. # browser返回的就是一个整页

模拟应用案例

页面元素提取

当它转换成selector的时候,就可以使用xpath和css选择器

  1. from scrapy.selector import Selector
  2. browser = webdriver.Chrome(executable_path="/Users/user3/python/selenium.exe")
  3. #生成selector
  4. t_selector = Selector(text=browser.page_source)
  5. t_selector.css("")
  6. t_selector.xpath("")

模拟访问浏览器

怎么用这个浏览器驱动对象打开浏览器,get方法

  1. browser.get("https://www.zhihu.com/#signin")

模拟向输入框输入数据/点击按钮

css选择器:find_element_by_css_selector()
xpath选择器:find_element_by_xpath_selector()
紧接着调用send_keys()模拟键盘输入,click()模拟鼠标点击

  1. browser = webdriver.Chrome(executable_path="/Users/user3/python/selenium/chromedriver")
  2. browser.get("https://www.zhihu.com/#signin")
  3. browser.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[1]/div/form/div[1]/div[2]').click()
  4. browser.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[1]/div/form/div[2]/div/label/input').send_keys("15208961314")
  5. browser.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[1]/div/form/div[3]/div/label/input').send_keys("15208961314")
  6. browser.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[1]/div/form/button').click()

设置延迟

代码是同步执行的,有可能页面没加载完,模拟输入的代码就会开始执行,那么我们使用time包下的sleep方法就可以规避这种现象发生。
一般设置5秒就差不多

  1. 加载页面代码
  2. time.sleep(5)
  3. 模拟输入和登陆代码

模拟鼠标向下滚动

  1. browser.execute_script("window.scrollTo(0,document.body.scrollHeight);var lenOfPage=document.body.scrollHeight;return lenOfPage")

案例

  1. from selenium import webdriver
  2. from scrapy.selector import Selector
  3. import time
  4. browser = webdriver.Chrome(executable_path="/Users/user3/python/selenium/chromedriver")
  5. browser.get("https://www.oschina.net/blog")
  6. time.sleep(8)
  7. for i in range(3):
  8. browser.execute_script("window.scrollTo(0,document.body.scrollHeight);var lenOfPage=document.body.scrollHeight;return lenOfPage")
  9. time.sleep(3)

设置不加载图片

不加载图片可以让爬取数据变得快,因为图片是网页加载慢的元凶之一

  1. from selenium import webdriver
  2. #核心配置代码
  3. chrome_opt = webdriver.ChromeOptions()
  4. prefs = {"profile.managed_default_content_settings.images": 2}
  5. chrome_opt.add_experimental_option("prefs", prefs)
  6. browser = webdriver.Chrome(executable_path="/Users/user3/python/selenium/chromedriver", chrome_options=chrome_opt)
  7. browser.get("https://www.taobao.com")

无界面的浏览器

phantomjs,轻量级浏览器,但是它并不是很稳定,尤其在多进程方面表现逊色一些
下载地址:https://phantomjs.org/download.html 下载指定系统的phantomjs驱动包

关于爬取微博

微博有一个开放平台是允许开发者进行数据爬取的,https://open.weibo.com/ 所以有的网站提供相关服务了,我们也就不需要花时间去爬它