前言:之前靠网上的大佬带,学了一点也算是爬虫的一个东西——浏览器自动化,现在算是整理总结或者是回报社会吧x
准备:① Python 3.6
② selenium库
③ google chrome driver (感谢 https://blog.csdn.net/dreamstone_xiaoqw/article/details/78970616 的分享,我当时在官网下超慢)
装好这两个东西就可以开始我们的爬虫之旅了,下面以从12306网站抓取车次信息为案例学习这个库。
浏览器自动化操作大体分为两步——定位和操作,而其中最重要的是定位,因为定位是最困难的并且只有定位到了想要的位置才能进行后续的操作。
首先,我们要打开一个浏览器并访问12306网站——http://www.12306.cn/
from selenium import webdriver
x=webdriver.Chrome(r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')
#这是我的chromedriver的绝对路径,我是默认安装的,所以可以作为新手的参考
x.get('http://www.12306.cn/')
运行这段代码可以看到弹出了一个chrome浏览器,并跳转到了12306的主页上。因为我们想抓取车次信息,所以我们首先要进去那个车次信息的页面,所以我希望能点击一下那个【余票查询】——这句话包含了两层含义:①定位到【余票查询】②点击。
实际上网页一般是用html语言编写的,所以所有东西都是一句或一段的代码,我们需要一个规则,让我们找到那个地方。幸运的是,我们只要检查一下那个位置即可知道哪里的代码是什么。
然后在右边可以看到它的html代码。
可以看到它有一个class属性,且属性为class='k4',所以我们首先学习第一个定位函数find_element_by_class_name
left = x.find_element_by_class_name('k4')
要注意的是,定位时一定要注意规则是否唯一指向,否则定位到的可能不是自己想要的。
这个时候就定位到了【余票查询】的位置了,然后再进行操作——点击,
left.click()
于是就弹到了【余票查询】中来了。
其实还有另外一个函数find_elements_by_class_name,注意到其实这里就多了一个s,所以它返回的并不是一个WebElement,而是一个WebElement的列表,即使列表中只有一个WebElement元素。
恭喜你,我们现在已经会写第一个浏览器自动化操作——所谓爬虫了。
其实定位和操作的方法还有很多,回到刚才的位置(手动叉掉新弹出来的窗口就行,至于为什么没有影响,我们下次再说),我们用其他方法来定位。
从这里我们能看到html代码中还有许多不同的属性比如id、href等,并且html代码呈很明显的层次结构,所以下面介绍一个万能定位函数find_element_by_xpath(或find_elements_by_xpath)。
left = x.find_elements_by_xpath('//div[@id="indexLeftBL"]/ul/li')[5]
# 因为它在第6个li
left.click()
另外,所有定位函数都是可以接在其他定位函数(和自己)后面继续定位的,例如
left = x.find_element_by_id('indexLeftBL').find_elements_by_xpath('ul/li')[5]
# 注意这里不能再像之前那样/或//了
left.click()
定位函数还有:
x.find_element_by_css_selector()
x.find_element_by_link_text()
x.find_element_by_name()
x.find_element_by_partial_link_text()
x.find_element_by_tag_name()
以及它们的find_elements_by_x函数。
常用的操作还有:
.text # 取文本
其他更多更详细的可以直接啃源码或者查看selenium的技术文档,多练练自然就懂了。
如有疑问或建议,可以联系邮箱 jason_coldog@163.com