Python网络爬虫实战之八:动态网页爬取案例实战 Selenium + Headless Chrome

96
麦典威
0.4 2018.08.12 15:09* 字数 743

目录:Python网络爬虫实战系列

正文:

一、Headless Chrome

1、什么是 Headless Chrome

Headless Chrome 是 Chrome 浏览器的无界面形态,可以在不打开浏览器的前提下,使用所有 Chrome 支持的特性运行你的程序。相比于现代浏览器,Headless Chrome 更加方便测试 web 应用,获得网站的截图,做爬虫抓取信息等。相比于较早的 PhantomJS,SlimerJS 等,Headless Chrome 则更加贴近浏览器环境。

2、Headless Chrome作用

为了提高selenium脚本的执行速度,我们可能会考虑使用PhantomJS这类的Headless 浏览器,但这些工具对JavaScript支持不好或者对web的支持不好,占用资源多,跟真实浏览器存在一定的差异等等问题。Chrome 浏览器提供的Headless Chrome,简单说我们也可以在不打开chrome GUI的情况在Chrome下执行我们的Selenium脚本,可提升脚本的执行效率。

3、Headless Chrome 对Chrome版本要求

mac和linux环境要求chrome版本是59+,而windows版本的chrome要求是60+。

只要chrome版本符合要求,属于chome浏览器自带的,无需再安装第三方库。

Headless Chrome更详细资料可参考Headless Chrome官方文档

二、Headless Chrome的使用

Selenium + Headless Chrome的使用方法与 Selenium + FhantomJS 类似

快速体验

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get('https://www.baidu.com/')
print('打开浏览器')
print(driver.title)
driver.find_element_by_id('kw').send_keys('测试')
print('关闭')
driver.quit()
print('测试完成')

Selenium + Headless Chrome 实例一

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.set_window_size(1366, 768)
# get方法会一直等到页面加载,然后才会继续程序,通常测试会在这里选择time.sleep(2)
driver.get("http://www.baidu.com/")
# 获取页面名为wraper的id标签的文本内容
data = driver.find_element_by_id('wrapper').text
# 打印数据内容
print(data)
# 把百度设为主页关于百度About  Baidu百度推广
# ©2018 Baidu 使用百度前必读 意见反馈 京ICP证030173号  京公网安备11000002000001号
print(driver.title)  # result: 百度一下,你就知道
# 生成页面快照并保存
driver.save_screenshot(r'D:\DataguruPyhton\PythonSpider\images\baidu.png')
# id="kw"是百度搜索输入框,输入字符串"长城"
driver.find_element_by_id('kw').send_keys(u'长城')
# id="su"是百度搜索按钮,click()是模拟点击
driver.find_element_by_id('su').click()
# 获取新的页面快照
driver.save_screenshot(r'D:\DataguruPyhton\PythonSpider\images\长城.png')
# 打印网页渲染后的源代码
print(driver.page_source)
# 获取当前页面Cookie
print(driver.get_cookies())
driver.quit()

Selenium + Headless Chrome 实例二

from selenium import webdriver
import time
# 调用键盘按键操作需要引入keys包
from selenium.webdriver.common.keys import Keys

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.set_window_size(1366, 768)
# get方法会一直等到页面加载,然后才会继续程序,通常测试会在这里选择time.sleep(2)
driver.get("http://www.baidu.com/")
# id="kw"是百度搜索输入框,输入字符串"情人节"
driver.find_element_by_id('kw').send_keys(u'情人节')
# ctrl+a全选输入框内容
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a')
# ctrl+x剪切输入框内容
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'x')
# 输入框重新输入内容
driver.find_element_by_id('kw').send_keys('鲜花')
# 模拟Enter回车键
driver.find_element_by_id('su').send_keys(Keys.RETURN)
time.sleep(5)
# 清空输入框内容
driver.find_element_by_id('kw').clear()
# 生成新的页面快照
driver.save_screenshot(r'D:\DataguruPyhton\PythonSpider\images\鲜花.png')
# 获取当前url
print(driver.current_url)
driver.quit()

Selenium + Headless Chrome 实例三:爬取包含Ajax的动态网页数据

from selenium import webdriver
import time

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("http://pythonscraping.com/pages/javascript/ajaxDemo.html")
# driver.page_source
time.sleep(3)
print(driver.find_element_by_id("content").text)
driver.close()

完善后的代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("http://pythonscraping.com/pages/javascript/ajaxDemo.html")
try:
    element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "loadedButton")))
finally:
    print(driver.find_element_by_id("content").text)
    driver.close()

Selenium + Headless Chrome 实例四:爬取重定向的动态网页数据

from selenium import webdriver
from selenium.common.exceptions import StaleElementReferenceException
import time


def waitForLoad(driver):
    elem = driver.find_element_by_tag_name("html")
    count = 0
    while True:
        count += 1
        if count > 20:
            print("Timing out after 10 seconds and returning")
            return
        time.sleep(.5)
        try:
            elem == driver.find_element_by_tag_name("html")
        except StaleElementReferenceException:
            return


chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("http://pythonscraping.com/pages/javascript/redirectDemo1.html")
waitForLoad(driver)
print(driver.page_source)

三、本篇文章中的代码,运行环境

  • python 3.6.4
  • selenium 3.8.0
  • goole chrome 68.0.3440.106(正式版本) (64 位)
  • chromedriver.exe
Gupao