美文网首页【收集】Python网络爬虫
Python网络爬虫实战之八:动态网页爬取案例实战 Seleni

Python网络爬虫实战之八:动态网页爬取案例实战 Seleni

作者: 27efec53a72d | 来源:发表于2018-08-12 15:09 被阅读166次

    目录: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

    相关文章

      网友评论

        本文标题:Python网络爬虫实战之八:动态网页爬取案例实战 Seleni

        本文链接:https://www.haomeiwen.com/subject/qvmjbftx.html