Python爬虫数据提取方式——-selenium爬虫框架中的数据提取方式

介绍:

selenium测试框架在爬虫中的应用:



网页中通过js渲染的数据,爬虫的解决办法:
    1. 去静态源码中查找
     2. 抓包或者网络请求中,查看是否有类似与json的get请求,直接请求这个json的API拿到数据
    3. 使用phantomjs/selenium进行访问动态页面,而静态页面仍然使用requests进行获取


selenium框架本身提供了许多元素定位的方法,比如:find_element_by_id()这些方法底层是用python语言实现的,提取速度上会慢一些。通常情况下,使用phantomjs/selenium也只是获取js渲染后的网页源代码,而网页中数据的提取,还可以使用xpath, css, re, bs4, etree等。


selenium框架的元素定位
    1、geckodriver.exe: 是selenium用来打开火狐浏览器的驱动。需要将它和python.exe放在一起。
    2、 chromedriver.exe: 是谷歌的

注意:不兼容会出现启动错误
     1. geckodriver.exe的版本必须和火狐浏览器的版本兼容;

    2. geckodriver.exe的版本必须和当前操作系统兼容;



元素定位的方法总结:
(1)函数后面的小括号里都要加上双引号或者单引号,都可以。但是括号内还有引号时,最外面的就用双引号,里面的用单引号,避免混淆。

(2)首先选择css_selector方法,因为此方法定位效率高、速度快。name、id也较常用。

(3)所有方法都定位不了时,选择xpath。xpath定位,在页面元素有变动时,容易定位错误(比如层级变化),所以一般不选这种方式。

1.1 一般常用方法

driver.find_element_by_link_text(‘第一章’).click()

driver.find_element_by_partial_link_text(‘3-1 揭开自动化’).click()

driver.find_element_by_id(‘search-key’).click()

driver.find_element_by_name(‘Q’).click()

driver.find_element_by_class_name(‘btn-engine’).click()

driver.find_element_by_tag_name(‘ty’).click()

driver.find_element_by_xpath(‘/html/body/div/div[2]/form/div/div[2]/div/input[3]’).click()

  总的原则就是保证选择定位的元素方式要能唯一标识。虽然id在一个html页面中有唯一性,但是当id不唯一时,不一定会报错。因此,定位时,一定要搜索一下,定位的标识是不是唯一的。

  如果定位方式的标识不唯一,可以选用下面的方式。

  注意:(1)find_elements_by…返回的是一个列表,所以后面要带列表的下标,标明是第几个位子。这个列表的序号是从1开始的,不是从0开始。(2)下标写在小括号的外面,不像XPATH定位一样写在里面。(XPath定位一般不会再用列表形式来标注)

 

driver.find_elements_by_link_text(‘第一章’)[1].click()

driver.find_elements_by_partial_link_text(‘3-1 揭开自动化’)[2].click()

driver.find_elements_by_id(‘search-key’)[1].click()

driver.find_elements_by_name(‘Q’)[3].click()

driver.find_elements_by_class_name(‘btn-engine’)[3].click()

driver.find_elements_by_tag_name(‘ty’)[4].click()

driver.find_elements_by_xpath(‘/html/body/div/div[2]/form/div/div[2]/div/input[3]’)[4].click()



1.2xpath定位详解

XPath定位详解
  一般选择xpath定位是因为无论用id、name、class等,都不能唯一定位的时候。

1.2.1 绝对路径法
  (1)就是从HTML文件最外面一层tag一直找到所要的元素的tag为止;(2)如果某一层有多个同名的tag,就用数组标注的方式;(3)以单斜杠、双斜杠开头都可以。

driver.find_element_by_xpath(‘/html/body/div/div[2]/form/div/div[2]/div/input[3]’).click()

driver.find_element_by_xpath(‘//html/body/div/div[2]/form/div/div[2]/div/input[3]’).click()

1.2.2 相对路径法
  使用绝对路径太长。可以选择离当前元素最近的一个层级,且那个层级可以使用非path法唯一定位。比如,离当前元素最近的一层元素有id:

  driver.find_element_by_xpath(‘//html/body/div[2]/table/tbody/tr/td[1]/div[1]/div[5]/div/div/table/tbody/tr[3]/td[2]/a’).click()

  driver.find_element_by_xpath(“//div[@id=’gallery_sl’]/div/table/tbody/tr[3]/td[2]/a”).click()

  相对路径的第一个元素定位方法:(1)最外一层双引号;(2)第一个元素的:tag名称[@元素属性=’元素值’];(3)不论是元素的id,名称还是什么属性,都用@引用。

1.2.3 类似partical_link_text法

  注意最前面用双斜杠,不仅可以用于链接式的文本,也能用于其他含文本的元素。

  driver.find_element_by_css_selector("//a[contains(text(),'平面设计')]").click()

 

1.2.4 XPATH多次最短路径定位
 

driver.find_element_by_xpath(“//tr[@id=’login_btn’]//td[text()=’登录’]”).click()

 

driver.find_element_by_xpath(“/*/tr[@id=’login_btn’]//td[text()=’登录’]”).click()

 

中间用双斜线或者双斜线中间加一个星号来表示中间有若干个tag

 

1.2.5 用元素的text属性定位的两种表达式
 

driver.find_element_by_xpath(“/*/tr[@id=’login_btn’]//td[text()=’登录’]”).click()

 

driver.find_element_by_xpath(“/*/tr[@id=’login_btn’]//td[contains(text(),’登录’)]”).click()

 

两者的区别:第一种元素的属性必须为“登录”只能相等,而第二种包含字符就行,如“登录按钮”


1.3 css_selector定位详解

driver.find_element_by_css_selector()
css定位可以分为四类:id、class、其他属性、路径。

1.3.1 #id方式
两种方式,可以在前面加上tag名称,也可以不加

driver.find_element_by_css_selector(‘#id_value’)

driver.find_element_by_css_selector(‘tag_name#id_value’)

1.3.2 .class方式
两种方式,前面加上tag名称,也可以不加。如果不加tag名称时,点不能省略。

driver.find_element_by_css_selector(‘.class_value’)

driver.find_element_by_css_selector(‘tag_name.class_value’)

有的class_value比较长,而且中间有空格时,不能把空格原样写进去,那样不能识别。这时,空格用点代替,前面要加上tag_name。

driver.find_element_by_css_selector('div.panel.panel-email').click()

1.3.3其他属性方式
两种方式,可以在前面加上tag名称,也可以不加。

driver.find_element_by_css_selector(“[attri_name=’attri_value’]”)

driver.find_element_by_css_selector("input[type='password']").send_keys('我要自學網')

driver.find_element_by_css_selector("[type='password']").send_keys('我要自學網')

1.3.4路径法
两种方式,可以在前面加上tag名称,也可以不加。注意它的层级关系使用大于号“>”。

driver.find_element_by_css_selector("form#loginForm>ul>input[type='password']").send_keys('111222333')



1.4 定位元素高级应用

1. 通过同一父节点下其他元素的唯一性定位法
  对于诊断结论列表,要对某一条诊断结论进行修改,每条诊断结论的修改按钮的元素的属性相同,而ID又是随机生成的。这时要定位到名为“未发现异常”的修改按钮,诊断名称和修改属于同一层级。需要先定位到名称“未发现异常”,然后再定位“未发现异常”的父节点下 title=’修改’的元素。

driver.find_elenment_by_xpath(“//td/div[text()=’未发现异常’]/ancestor::*/td[6]/div/img[@tile=’修改’]”).click()

driver.find_elenment_by_xpath(“//td/div[text()=’未发现异常’]/ancestor::tr/td[6]/div/img[@tile=’修改’]”).click()

ancestor表示所有的父节点、祖父节点。上面第一种表示所有的父节点下能匹配到的。第二种表示父节点为tr的下面。

其他常见的还有:preceding-sibling 选取当前节点之前的所有同级节点,following-sibling 选取当前节点之后的所有同级节点

更多参见:http://www.cnblogs.com/zhaozhan/archive/2009/09/10/1563735.html

 
2. 页面上相同元素只会出现一个的情况,可以用Class属性定位
  诊断结论的输入框有名称、编码、描述,这些输入框的合法性校验一直,输入非法的字符时,弹出额提示框一样,如果用路径定位,需要对每一个输入框写一个路径。他们有一点相同的就是,Class一样。而且同时只有一个出现。这时就可以用Class属性定位。(作为校验合法性用)








你可能感兴趣的:(小结)