【3】基于selenium的元素查询及chrome-headless设置-爬取动态网页(2)

第二篇感觉篇幅过长了,所以在思考要不要把实战项目专门放在一个地方。

本文就是介绍第二篇中介绍的方法二:利用selenium操纵浏览器来模拟浏览器行为从而获取数据。

如上篇介绍,我们发现网页源代码和检查元素不一致,这是AJAX异步加载所致。这同时也说明浏览器可以识别出这些加载出来的东西,所以如果我们可以直接控制浏览器,自然也可以抓取到这些本看不到的元素。

Selenium是一个自动化的测试工具,这里主要用到了它的Webdriver操作浏览器。Selenium可以操作大多数主流浏览器(可能需要相应的驱动),windows系统下命令行输入:

pip install selenium
即可安装。

往常而言,selenium的搭档通常是PhantomJS,简单点说PhantomJS就是一个没有界面的浏览器,提供了JavaScript接口。 在Windows平台,下载好PhantomJS后,将phantomjs.exe放到Python的文件路径里即可调用。

但是!!现在python3.6.4已经不支持PhantomJS了,也就是说,相应的模块即将或者已经下架了。

那么支持什么呢?推荐使用firefox或者chrome的headless版本。本文的搭档就选择chrome。

windows平台的话,chrome6.0版本以上才支持headless,而Mac和Linux则是5.9版本以上。

1.chromedriver下载

chromedriver各版本下载

可以自行查询一下chromedriver和chrome的版本对应关系,以确保可以使用headless模式

2.chrome的headless模式设置

不多说,直接上关键代码:

from selenium.webdriver.chrome.options import Options 

chrome_options = Options() 
chrome_options.add_argument('--headless') 
chrome_options.add_argument('--disable-gpu') 
driver =webdriver.Chrome(options=chrome.options) 
#webdriver.Chrome(chrome_options=chrome_options)也可以
以上,即可实现headless模式,所谓headless,即浏览器后台执行,无界面

3.selenium操纵chrome浏览器

如何操纵呢?很简单很直接很方便很好理解:

from selenium import webdriver

#driver = webdriver.PhantomJS()    # 获取浏览器对象,操纵PhantomJS
driver = webdriver.Chrome() # 获取浏览器对象,操纵chrome

driver.get('http://www.baidu.com/')
print driver.page_source #此时driver.page_source已经将JS渲染部分读取出来了

以上,即可实现操纵,要注意和之前的不同之处,此时的get不能直接传递头信息,需要另外设置。

而之所以专门把page_source标出,是为了说明,driver.page_source可以传入bs4从而实现之前那种模式的筛选数据,这样也算是比较熟悉的领域,当然,webdriver中也内置许多find_element方法

4.selenium元素查询及处理

总共内置18种查询方法:

前八种是单一元素的定位选取
1.id定位:find_element_by_id(self, id_)
2.name定位:find_element_by_name(self, name)
3.class定位:find_element_by_class_name(self, name)
4.tag定位:find_element_by_tag_name(self, name)
5.link定位:find_element_by_link_text(self, link_text)
6.partial_link定位find_element_by_partial_link_text(self,link_text)
7.xpath定位:find_element_by_xpath(self, xpath)
8.css定位:find_element_by_css_selector(self,css_selector)

这八种是以上的复数形式,结果返回为list形式,因为之前的BeatifulSoup.select()同样返回list,故这几种可能用起来更方便
9.id复数定位find_elements_by_id(self, id_)
10.name复数定位find_elements_by_name(self, name)
11.class复数定位find_elements_by_class_name(self, name)
12.tag复数定位find_elements_by_tag_name(self, name)
13.link复数定位find_elements_by_link_text(self, text)
14.partial_link复数定位find_elements_by_partial_link_text(self,link_text)
15.xpath复数定位find_elements_by_xpath(self, xpath)
16.css复数定位find_elements_by_css_selector(self,css_selector

还有两种不怎样用的
find_element(self, by='id', value=None)
find_elements(self, by='id', value=None)
选取之后呢?怎么处理呢?

我们知道之前的BeautifulSoup选取后,可以get_text()得到标签之间的文本,get()可以得到标签内的元素值

对应的,以上筛选方式筛选后,可以直接 .text 显示标签之间的文本,而get_attribute()则可以得到标签内的元素值


……………………………………………………………………………………………………………………………………………………………………………………

emmm,剩下的呢,基本就是之前的思路了。

第二篇中讲过,这种方式相对比较暴力,如果数据量大的话,很占内存。另外如果要用以上方法的话,一定要记住两种退出方式:close()以及quit(),其中close()作用即相当于关闭当前页面,而quit()则相当于关闭整个浏览器的效果。

以上,希望大家有问题的话及时交流~

我会在近日选择一个合适的实战项目,用爬取动态网页的两种基本方法去爬取同一内容,以望显示出两者的利弊等。


你可能感兴趣的:(python爬虫)