通过selenium实现模拟浏览器操作

1.selenium介绍

搜到了几种方法:1.urllib2,mechanize,单纯的访问web,不解析其js,css;2.selenium,利用浏览器,支持js,css等,具体包括打开浏览器和不需要打开浏览器两种方式,此外还有splinter,将selenium进行封装得到更顶层的API。目前仅仅试了一下selenium。

selenium是一种自动化测试工具,用来对web界面进行测试,它支持各种浏览器,包括 Chrome,Safari,Firefox ,IE等,支持多种语言开发,比如 Java,C,Ruby,python等等。

安装selenium

selenium库可以使用pip命令进行安装。

pip install selenium

Webdriver

使用不同的浏览器需要不同的webdriver,类似于驱动,chrome的叫chromedriver,firefox的是geckodriver。

Chromedriver下载地址国内无法访问,可以通过阿里的镜像https://npm.taobao.org/mirrors/chromedriver/下载。

Geckodriver为Firefox官方提供的Webdriver,下载地址https://github.com/mozilla/geckodriver/releases,官方说明如下:

Proxy for using W3C WebDriver-compatible clients to interact with Gecko-based browsers.

This program provides the HTTP API described by the WebDriver protocol to communicate with Gecko browsers, such as Firefox. It translates calls into the Firefox remote protocol by acting as a proxy between the local- and remote ends.

需要注意不同版本支持的Firefox版本也不同,将其放置在python安装根目录(与python.exe 同一目录),或者将放置geckodriver的目录添加到环境变量。

如果配置正确,使用下面的代码会自动打开一个firefox的界面。

from selenium import webdriver
driver = webdriver.Firefox()

2.使用selenium

打开网页

上面的代码实现了对浏览器对象的一个初始化,之后就可以使用driver对象,执行各种操作。

使用get()方法来请求一个网页,参数为网页URL。

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")

运行后,会通过Firefox打开百度首页。

如果只是想通过python程序访问网页,不需要在浏览器中打开,可以使用headless。

Headless Chrome 是 Chrome 浏览器的无界面形态,可以在不打开浏览器的前提下,使用所有 Chrome 支持的特性运行你的程序。相比于现代浏览器,Headless Chrome 更加方便测试 web 应用,获得网站的截图,做爬虫抓取信息等。相比于出道较早的 PhantomJS,SlimerJS 等,Headless Chrome 则更加贴近浏览器环境。

Headless Firefox是相同的道理。加入下面的代码,就可以实现在程序运行中不打开Firefox的界面。

fireFoxOptions = webdriver.FirefoxOptions()
fireFoxOptions.set_headless()
driver = webdriver.Firefox(firefox_options = fireFoxOptions)

查找元素

要想对网页进行操作,首先要知道当前网页中有哪些元素,selenium提供了很多API

  • find_element_by_id:通过元素的id选择,例如:driver.find_element_by_id('loginForm')
  • find_element_by_name:通过元素的name选择,driver.find_element_by_name('password')
  • find_element_by_xpath:通过xpath选择,driver.find_element_by_xpath("//form[1]")
  • find_element_by_link_text:通过链接地址选择
  • find_element_by_partial_link_text:通过链接的部分地址选择
  • find_element_by_tag_name:通过元素的名称选择
  • find_element_by_class_name:通过元素的id选择
  • find_element_by_css_selector:通过css选择器选择

此外,还提供了通用的find_element()函数,查找方法为第一个参数,值为第二个参数,

例如:driver.find_element_by_id('loginForm') ,driver.find_element(By.ID,loginForm)

比如要选择baidu首页的搜索框,通过浏览器的检查元素功能,找到输入框的name = "wd"  id = "kw"

通过selenium实现模拟浏览器操作_第1张图片

如下代码,分别使用id和name进行查找。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By   #需要import By

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")

elem1 = driver.find_element_by_id("kw")
elem2 = driver.find_element_by_name("wd")
elem3 = driver.find_element(By.ID,"kw")
elem4 = driver.find_element(By.NAME,"wd")
print(elem1)
print(elem2)
print(elem3)
print(elem4)
driver.close()

得到输出如下,表示四种方法查找到的是同一元素。




元素交互

下面的代码模拟搜索操作,查找到搜索框,输入内容,点击提交。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")

elem = driver.find_element_by_id("kw")
elem.send_keys("hello")
elem.send_keys(Keys.RETURN)

使用上一节的方法定位到搜索框后,利用 Keys 这个类来模拟键盘输入,输入文字用send_keys()方法,另外还有按钮点击,用click()方法。更多的操作可以参见官方文档的交互动作介绍

https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement

3.参考

https://zhuanlan.zhihu.com/p/27100187 初探 Headless Chrome

https://blog.csdn.net/BalterNotz/article/details/79181088 Python Selenium Headless Firefox配置

https://zhuanlan.zhihu.com/p/29435831 Python3中Selenium使用方法

https://zhuanlan.zhihu.com/p/31127896 4.3 通过selenium 模拟浏览器抓取

你可能感兴趣的:(selenium)