测试小站: 处理网 回收帮 培训网 富贵论坛 老富贵论坛

基于selenium的元素查询及chrome-headless设置-爬取动态网页

  本文就是介绍第二篇中介绍的方法二:利用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('baidu/')

  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定位: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复数定位

  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()则相当于关闭整个浏览器的效果。

posted @ 2021-12-21 14:03  linjingyg  阅读(323)  评论(0)    收藏  举报