爬虫-12.Selenium案例
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。
火狐浏览器:
import selenium.webdriver
import time
from selenium.webdriver.common.keys import Keys
#定义火狐浏览器参数
options = selenium.webdriver.FirefoxOptions()
#设置为headless模式(无头浏览器)
options.add_argument('-headless')
#禁止硬件加速
options.add_argument('--disable-gpu')
#调用指定的浏览器创建浏览器对象
driver = selenium.webdriver.Firefox(firefox_options=options)
#设置浏览器窗口大小
#driver.set_window_size(1200,1200)
PhantomJS:
#如果没有设置浏览器的环境变量,需要在创建的时候指明
driver_path = '/Users/yuxiaolong/Downloads/phantomjs/bin/phantomjs'
driver = selenium.webdriver.PhantomJS(executable_path=driver_path)
driver.get("http://www.douban.com")
#截取屏幕,PhantomJS截取为全屏,相比其他浏览器较好
driver.save_screenshot('douban.png')
案例一:网站模拟登录
模拟网站登陆
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.PhantomJS()
driver.get("http://www.douban.com")
# 输入账号密码
driver.find_element_by_name("form_email").send_keys("xxxx")
driver.find_element_by_name("form_password").send_keys("xxxx")
# 模拟点击登录
driver.find_element_by_xpath("//input[@class='bn-submit']").click()
# 等待3秒
time.sleep(3)
# 生成登陆后快照
driver.save_screenshot("douban.png")
with open("douban.html", "w") as file:
file.write(driver.page_source)
driver.quit()
案例二:动态页面模拟点击
js分页网站,模拟点击
python测试模块
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# python的测试模块
import unittest
from selenium import webdriver
from bs4 import BeautifulSoup
class douyuSelenium(unittest.TestCase):
# 初始化方法
def setUp(self):
self.driver = webdriver.PhantomJS()
#具体的测试用例方法,一定要以test开头
def testDouyu(self):
self.driver.get('http://www.douyu.com/directory/all')
while True:
# 指定xml解析
soup = BeautifulSoup(driver.page_source, 'xml')
# 返回当前页面所有房间标题列表 和 观众人数列表
titles = soup.find_all('h3', {'class': 'ellipsis'})
nums = soup.find_all('span', {'class': 'dy-num fr'})
# 使用zip()函数来可以把列表合并,并创建一个元组对的列表[(1,2), (3,4)]
for title, num in zip(titles, nums):
print u"观众人数:" + num.get_text().strip(), u"\t房间标题: " + title.get_text().strip()
# page_source.find()未找到内容则返回-1
if driver.page_source.find('shark-pager-disable-next') != -1:
break
# 模拟下一页点击
self.driver.find_element_by_class_name('shark-pager-next').click()
# 退出时的清理方法
def tearDown(self):
print '加载完成...'
self.driver.quit()
if __name__ == "__main__":
unittest.main()
案例三:执行 JavaScript 语句
Ajax加载的网页
from selenium import webdriver
import time
driver = webdriver.PhantomJS()
driver.get("https://movie.douban.com/typerank?type_name=剧情&type=11&interval_id=100:90&action=")
# 向下滚动10000像素
js = "document.body.scrollTop=10000"
#js="var q=document.documentElement.scrollTop=10000"
time.sleep(3)
#查看页面快照
driver.save_screenshot("douban.png")
# 执行JS语句
driver.execute_script(js)
time.sleep(10)
#查看页面快照
driver.save_screenshot("newdouban.png")
driver.quit()