在之前的推文中介绍了一些爬虫的一些方法,不过这些方法基本上都是基于静态页,然而现实中大部分的页面的都是动态渲染的。requests固然很强大,却无法执行javaScript。
Selenium最初是一个自动化测试工具,Selenium可以驱动浏览器自动执行自定义好的逻辑代码,即通过代码完全模拟使用浏览器自动访问目标站点并操作,所以也可以用来爬虫。
pip install selenium
既然需要使用浏览器模拟,那么自然还需要安装浏览器驱动:
https://sites.google.com/a/chromium.org/chromedriver/downloadssites.google.com/a/chromium.org/chromedriver/downloads
2. Edge浏览器
Microsoft Edge Driverdeveloper.microsoft.com/en-us/microsoft-edge/tools/webdriver/
3. Firefox浏览器
https://github.com/mozilla/geckodriver/releasesgithub.com/mozilla/geckodriver/releases
4. Safari 浏览器
https://webkit.org/blog/6900/webdriver-support-in-safari-10/webkit.org/blog/6900/webdriver-support-in-safari-10/
注意:需要把下载好的文件放到python安装路径的scripts目录中才会生效。
否则,在执行webdriver.Firefox()时,就给一个
selenium.common.exceptions.WebDriverException的错误。
这里用到的是火狐浏览器的驱动,下面也将用此驱动来展开。
执行下面的代码就会调起一个空白的浏览器窗口
from selenium import webdriver
driver=webdriver.Firefox()
结果如下:
不过需要注意的是,不是安装了驱动了就可以随意打开浏览器的,只能使用系统中已经安装的浏览器。
其它浏览器的连接浏览器的方法:
from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
其中PhantomJS是一种无界面浏览器,大家可以自行了解一下;
那么如何自动打开指定的网址呢?
在浏览器中加载指定网址,比如:百度
from selenium import webdriver
driver=webdriver.Firefox()
# 用get打开百度页面
driver.get("http://www.baidu.com")
这里使用drvier.get(url)来打开指定的网址。
结果如下:
既然我们打开了百度,那么肯定会想让他自动搜索一下,如下:
from selenium import webdriver
driver=webdriver.Firefox()
# 用get打开百度页面
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys('python 知识学堂')
这里使用find_element_by_id的方法去定位搜索框的位置,然后用send_keys方法输入内容,模拟键盘输入。
至于为啥find_element_by_id中的值是”kw”,这个在之前的文档中有提过。
结果如下:
从结果看出,貌似还差一步,需要按一下回车键,那么怎么办呢?如下:
from selenium import webdriver
driver=webdriver.Firefox()
# 用get打开百度页面
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys('python 知识学堂')
driver.find_element_by_id("su").click()
这里使用的是click()的方法点击指定的按钮。结果如下:
其实到这里,是不是就算一个简简单单的自动化处理了。
大家可以自己运行一下试试。
上面一直用到find_element_by_id去查找元素,常用的元素定位方法如下:
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()
注意:
1、find_element_by_xxx找的是第一个符合条件的标签,find_elements_by_xxx找的是所有符合条件的标签。
2、find_element()通用方法,它需要传入两个参数:查找方式By和值。实际上,它就是
find_element_by_id()这种方法的通用函数版本,比如
find_element_by_id(id)就等价于
find_element(By.ID, id),二者得到的结果完全一致。
Selenium 还支持xpath语法,这个在之前的基础推文中有详细的介绍,大家可以去公众号中查找
这次就简单的介绍一下Selenium框架,以及如何使用浏览器驱动建起浏览器连接,最后通过打开百度的网址,搜索指定的内容,来展示Selenium的强大。