鱼C论坛

 找回密码
 立即注册
查看: 1616|回复: 0

[技术交流] Python网络爬虫连载之三 - 动态网页抓取 selenium下篇

[复制链接]
发表于 2018-1-20 11:49:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 payton24 于 2018-1-23 16:19 编辑

Selenium定位元素对象的方法有八种,归纳起来可以分成三类:
1.对象及其属性:id, name, class_name, tag_name
2.对象的文字链接内容: link_text, partial_link_text
3.使用语言:xpath,css_selector

下面通过定位百度输入框来体验一下6种不同的定位方式:
  <span class="bg s_ipt_wr quickdelete-wrap">
           <span class="soutu-btn"></span>
          <input autocomplete="off" class="s_ipt" id="kw" maxlength="255" name="wd" value=""/>
           <a class="quickdelete" href="javascript:;" id="quickdelete" style="top: 0px; right: 0px; display: none;" title="清空"></a>
  </span>

  1. #通过id方式定位
  2. browser.find_element_by_id("kw").send_keys("selenium")

  3. #通过name方式定位
  4. browser.find_element_by_name("wd").send_keys("selenium")

  5. #通过class name 方式定位
  6. browser.find_element_by_class_name("s_ipt").send_keys("selenium")

  7. #通过tag name方式定位
  8. browser.find_element_by_tag_name("input").send_keys("selenium")   

  9. #通过CSS方式定位
  10. browser.find_element_by_css_selector("#kw").send_keys("selenium")

  11. #通过xphan方式定位
  12. browser.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")
复制代码


前四种比较好寻找,通过<input autocomplete="off" class="s_ipt" id="kw" maxlength="255" name="wd" value=""/>
就可以找到所需资料,但是有时候通过前四种方法可能会找到重复元素,无法确定唯一的定位。

后两种比较复杂,其中CSS方式相对简单,运行效率高。而xpath的定位更为精准,可以覆盖的定位类型更广。
CSS可以参考:
http://www.w3school.com.cn/cssref/css_selectors.asp

这里列出常用的使用方式,例如:
  • #kw                      选择 id="kw" 的元素。
  • .s_ipt                      选择 class="s_ipt" 的元素。
  • [name=wd]            选择 name="wd" 的元素。
  • input[name=wd]   选择 input标签下 name="wd" 的元素。
  • div p                    选择 <div> 元素内部的所有 <p> 元素。
  • div>p                 与div p相同。


实例为:
  1. from selenium import webdriver
  2. import time

  3. browser = webdriver.Firefox()
  4. browser.maximize_window()

  5. browser.get("http://www.baidu.com")
  6. time.sleep(2)

  7. elem = browser.find_element_by_css_selector('#kw')
  8. elem.clear()
  9. elem.send_keys("Python")
  10. browser.find_element_by_id("su").click()
  11. time.sleep(5)
  12. print(browser.title)

  13. elem = browser.find_element_by_css_selector('.s_ipt')
  14. elem.clear()
  15. elem.send_keys("Selenium")
  16. browser.find_element_by_id("su").click()
  17. time.sleep(5)
  18. print(browser.title)

  19. elem = browser.find_element_by_css_selector('[name=wd]')
  20. elem.clear()
  21. elem.send_keys("css")
  22. browser.find_element_by_id("su").click()
  23. time.sleep(5)
  24. print(browser.title)

  25. elem = browser.find_element_by_css_selector('input[name=wd]')
  26. elem.clear()
  27. elem.send_keys("xpath")
  28. browser.find_element_by_id("su").click()
  29. time.sleep(5)
  30. print(browser.title)

  31. browser.quit()
复制代码


xpath的选择方式同样很多,详情可参考下述链接:
http://www.w3school.com.cn/xpath/xpath_syntax.asp

常用方式如下:
  • *                               匹配任何元素
  • //*[@id='kw']             选择 id="kw" 的元素。
  • //*[@class='s_ipt']      选择 class="s_ipt" 的元素。
  • //*[@name='wd']         选择 name="wd" 的元素。
  • //input[@name='wd']  选择 input标签下 name="wd" 的元素。


实例为:
  1. from selenium import webdriver
  2. import time

  3. browser = webdriver.Firefox()
  4. browser.maximize_window()

  5. browser.get("http://www.baidu.com")
  6. time.sleep(2)

  7. elem = browser.find_element_by_xpath("//*[@id='kw']")
  8. elem.clear()
  9. elem.send_keys("Python")
  10. browser.find_element_by_id("su").click()
  11. time.sleep(5)
  12. print(browser.title)

  13. elem = browser.find_element_by_xpath("//*[@class='s_ipt']")
  14. elem.clear()
  15. elem.send_keys("Selenium")
  16. browser.find_element_by_id("su").click()
  17. time.sleep(5)
  18. print(browser.title)

  19. elem = browser.find_element_by_xpath("//*[@name='wd']")
  20. elem.clear()
  21. elem.send_keys("css")
  22. browser.find_element_by_id("su").click()
  23. time.sleep(5)
  24. print(browser.title)

  25. elem = browser.find_element_by_xpath("//input[@name='wd']")
  26. elem.clear()
  27. elem.send_keys("xpath")
  28. browser.find_element_by_id("su").click()
  29. time.sleep(5)
  30. print(browser.title)

  31. browser.quit()
复制代码


还有两个定位方法也说一下:
  • find_element_by_link_text                   #定位文字链接
  • find_element_by_partial_link_text        #定位部分的文字链接


例子:
  1. browser.find_element_by_link_text("贴吧").click()
  2. browser.find_element_by_partial_link_text("贴").click()
复制代码


如果需要选择多个元素,只有7种方法,格式如下:
  • find_elements_by_name
  • find_elements_by_tag_name
  • find_elements_by_class_name
  • find_elements_by_link_text
  • find_elements_by_partial_link_text
  • find_elements_by_xpath
  • find_elements_by_css-selector


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 15:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表