1,浏览器自动化测试框架selenium
pip install selenium
selinum是api接口而已,真正调用的还是浏览器,需要浏览器的driver完成
下载谷歌driver,并放到谷歌浏览器的可执行文件下边
使用from selenium import webdriver,在run的时候却出现ImportError: cannot import name webdriver的提示
原因如下,我新建的名称叫selenium.py,导致Python会先导入这个文件,然后再导入标准库里面的selenium.py。
2,selenium入门
<1>创建谷歌Driver实例
driver = webdriver.Chrome()
<2>打开一个页面,调用get方法 driver.get(“http://www.google.com”)
webdriver将等待,直到页面全部加载完毕(其实是等到onload方法执行完毕)
<3>与页面交互
查找元素:
<input type="text" name="passwd" id="passwd-id" />
element = driver.find_element_by_id("passwd-id")
element = driver.find_element_by_name("passwd")
element = driver.find_element_by_xpath("//input[@id='passwd-id']")
文本框输入内容;
element.send_keys("some text")
<4>执行js
execute_script(script, *args)
browser.execute_script(“window.scrollTo(0, document.body.scrollHeight); var lenOfPage=document.body.scrollHeight; return lenOfPage;”)
eg:模拟人人网登录
from selenium import webdriver
browser = webdriver.Chrome(executable_path="E:\Google\Chrome\Application\chromedriver.exe")
browser.get("http://renren.com/")
browser.find_element_by_id("email").send_keys("15536307338")
browser.find_element_by_id("password").send_keys("zh179883")
browser.find_element_by_id("login").click()
问题:有时候找不到对应元素是因为页面还未加载完就进行操作了
可以sleep等待加载完成time.sleep(10)
3,chromdriver不加载图片
#add_experimental_option添加实验选项
chrom_opt = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images": 2}
chrom_opt.add_experimental_option("prefs",prefs)
browser = webdriver.Chrome(chrome_options=chrom_opt,executable_path="E:\Google\Chrome\Application\chromedriver.exe")
browser.get("http://taobao.com/")
3,集成到scrapy
selenium下载后,就不用下载器下载了(将它写进download middleware)
使其不用每次打开chrome:
调用super方法,这样chrom就属于这个类了,而不是另起一个chrom
scrapy关闭,但chorme未关闭:
如何在中间件里调用spider.close?既然不是每个页面都用chrome,那么可以把他放到spider中
信号:(spider close)爬虫退出
连接信号
关闭chrome
dispatcher.connect(self.spider_closed, signals.spider_closed)
def spider_closed(self, spider):
#当爬虫退出的时候关闭chrome
print ("spider closed")
self.chrome.quit()
5,动态网页开发,需要有界面,但python为我们提供了无界面的环境(linux)
pip install pyvirtualdisplay
from pyvirtualdisplay import Display
display = Display(visable = 0,size = (800,600))
display.start()
然后是selenium操作