17.python爬虫—Selenium

17.1 动态HTML技术

17.python爬虫—Selenium_第1张图片

17.2 Selenium和PhantomJS入门

17.2.1 Selenium

  • Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开 发的,Selenium可以直接运行在浏览器上,它支持所有主流的浏览器 (包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏

17.2.2 PhantomJS

  • PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把 网站加载到内存并执行页面上的JavaScript
  • http://selenium-python-zh.readthedocs.io/en/latest/waits.html

17.2.3 加载网页

  • from selenium import webdriver
  • driver =webdriver.PhantomJS(“c:…/pantomjs.exe”)
  • driver.get(“http://www.baidu.com/”)
  • driver.save_screenshot(“长城.png”)

17.2.4 定位和操作

  • driver.find_element_by_id(“kw”).send_keys(“长城”)
  • driver.find_element_by_id(“su”).click()

17.2.5 查看请求信息

  • driver.page_source
  • driver.get_cookies()
  • driver.current_url

17.2.6 退出

  • driver.close() #退出当前页面
  • driver.quit() #退出浏览器

17.3 页面元素定位

17.3.1 用法

  • find_element_by_id (返回一个)
  • find_elements_by_xpath (返回一个列表)
  • find_elements_by_link_text
  • find_elements_by_partial_link_text
  • find_elements_by_tag_name
  • find_elements_by_class_name
  • find_elements_by_css_selector

17.3.2 注意点

  • find_element 和find_elements的区别:返回一个和返回一个列表
  • by_link_text和by_partial_link_text的区别:全部文本和包含某个文本
  • by_css_selector的用法: #food span.dairy.aged
  • by_xpath中获取属性和文本需要使用get_attribute() 和.text

17.4 Cookie相关用法

  • {cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}
  • driver.delete_cookie(“CookieName”)
  • driver.delete_all_cookies()

17.5 页面等待

  • 为什么需要等待
    • 如果网站采用了动态html技术,那么页面上的部分元素出现时间便不能确定,这个时候就可以设置一个等待时间,强制要求在时间内出现,否则报错
  • 强制等待
    • time.sleep(10)
  • 显式等待(了解)
    • 显式等待指定某个条件,然后设置最长等待时间。如果在这个时间还没有找到元素,那么便会抛出异常了.
    • WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,“myDynamicElement”))
  • 隐式等待(了解)
    • 就是简单地设置一个最大等待时间,单位为秒。
    • driver.implicitly_wait(10)

17.6 Selenium总结

  • 应用场景:
    • 动态html页面请求
    • 登录获取cookies
  • 如何使用
    • 导包并且实例化driver
    • 发送请求
    • 定位获取数据
    • 保存
    • 退出driver
  • Cookies相关方法:
    • get_cookies()
  • 页面等待
    • 强制等待

17.7 实验

In:

pip install selenium

out:

Requirement already satisfied: selenium in d:\programdata\anaconda3\lib\site-packages (3.141.0)
Requirement already satisfied: urllib3 in d:\programdata\anaconda3\lib\site-packages (from selenium) (1.24.2)
Note: you may need to restart the kernel to use updated packages.

In:

from selenium import webdriver

driver和chrome浏览器的版本必须一致,版本号为84.0.4147.89
In:

chrome_driver = "D:\Software\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(executable_path=chrome_driver)

In:

driver.get("http://www.baidu.com")
driver.save_screenshot("baidu.jpg")

out:

D:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py:1031: UserWarning: name used for saved screenshot does not match file type. It should end with a `.png` extension
  "type. It should end with a `.png` extension", UserWarning)
True

In:

driver.find_element_by_id("kw").send_keys("山西")
driver.find_element_by_id("su").click()

In:

driver.page_source #查看源码

out:

'\n\t\t\n\t\t\n\t\t\n\t\t\n        \n        \n        \n        \n\t\t\n\t\t\n的萨芬的萨芬山西_百度搜索\n\n\t\t\n\n\t\t\n