• Python网络爬虫之图片懒加载技术、selenium和PhantomJS


    一.图片懒加载

    • 图片懒加载概念:

      • 图片懒加载是一种网页优化技术。图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时间。为了解决这种问题,通过前后端配合,使图片仅在浏览器当前视窗内出现时才加载该图片,达到减少首屏图片请求数的技术就被称为“图片懒加载”。

    • 网站一般如何实现图片懒加载技术呢?

      • 在网页源码中,在img标签中首先会使用一个“伪属性”(通常使用src2,original......)去存放真正的图片链接而并非是直接存放在src属性中。当图片出现到页面的可视化区域中,会动态将伪属性替换成src属性,完成图片的加载。

    案例:

    爬取站长素材高清图片

    通过细致观察页面的结构后发现,网页中图片的链接是存储在了src2这个伪属性中

    #  爬取站长素材中的高清图片
    import requests
    from lxml import etree
    from urllib import request
    import re
    url = "http://sc.chinaz.com/tupian/fengjingtupian.html"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.12 Safari/537.36'
    }
    
    page_text = requests.get(url,headers=headers).text
    
    tree = etree.HTML(page_text)
    # 图片懒加载概念,网页优化技术
    # 当图片被拖动到可视化区域时src2伪属性才会变成真正的属性值,requests请求没有可视话界面要取伪属性
    img_src_list = tree.xpath("//div[@id='container']/div/div/a/img/@src2")
    for src in img_src_list:
        imgName = src.split("/")[-1]
    
        # 请求图片地址,并保存图片
        request.urlretrieve(src,imgName)

    二.selenium

    • 什么是selenium?
      • 是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作。  

    • 环境搭建

      • 安装selenum:pip install selenium

      • 获取某一款浏览器的驱动程序(以谷歌浏览器为例)

        • 谷歌浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html

        • 下载的驱动程序必须和浏览器的版本统一,可以根据http://blog.csdn.net/huilan_same/article/details/51896672中提供的版本映射表进行对应

    编码流程:

    • 导包
    • 创建某一款浏览器对象
    • 制定相关的行为动作

    案例:

    豆瓣top榜

    from selenium import webdriver
    from time import sleep
    bro = webdriver.Chrome(executable_path=r'D:爬虫+数据分析	oolschromedriver.exe')  # 谷歌浏览器驱动路径
    bro.get('https://movie.douban.com/typerank?type_name=%E7%88%B1%E6%83%85&type=13&interval_id=100:90&action=')
    sleep(3)
    bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')  # 页面滚动一屏,让动态数据加载出来
    sleep(3)
    bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    sleep(3)
    bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    #获取浏览器当前的页面源码数据
    page_text = bro.page_source
    
    with open('douban.html','w',encoding='utf-8') as fp:
        fp.write(page_text)
    sleep(3)   
    bro.quit()

    自动登录qq空间:

    # 自动操作浏览器
    bro = webdriver.Chrome(executable_path=r'D:爬虫+数据分析	oolschromedriver.exe')
    bro.get('https://qzone.qq.com/')
    sleep(3)  
    #注意:如果想要通过find系列函数去定位某一个iframe标签下的子标签的话,一定要使用如下操作:
    bro.switch_to.frame('login_frame')#参数表示的是iframe标签的id属性值,,ifram是子标签
    
    bro.find_element_by_id('switcher_plogin').click()  # 单击id为switcher_plogin的页面标签,即点击账号密码登录
    sleep(3)
    
    # 自动输入用户名,密码登录空间
    bro.find_element_by_id('u').send_keys('qq号')
    bro.find_element_by_id('p').send_keys('pwd')
    sleep(3)
    bro.find_element_by_id('login_button').click()
    print(bro.page_source)
    sleep(3)
    bro.quit()

    谷歌无图浏览器

    --获取百度搜索关键字的返回页

    from selenium.webdriver.chrome.options import Options
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    
    # 带上这个参数chrome_options=chrome_options 自动操作浏览器wu界面操作
    bro = webdriver.Chrome(executable_path=r'D:爬虫+数据分析	oolschromedriver.exe',chrome_options=chrome_options)
    sleep(3)
    bro.get('https://www.baidu.com/')
    sleep(3)
    #find系列的函数可以帮助我们定位到相关的标签
    text_input = bro.find_element_by_id('kw')
    #向文本框中录入一个关键字
    text_input.send_keys('中国')
    sleep(3)
    btn = bro.find_element_by_id('su')
    btn.click()
    sleep(3)
    #获取当前浏览器显示的页面源码数据(动态加载的数据)
    page_text = bro.page_source
    print(page_text)
    bro.quit()

    三.phantomJs

    PhantomJS是一款无界面的浏览器,其自动化操作流程和上述操作谷歌浏览器是一致的。由于是无界面的,为了能够展示自动化操作流程,PhantomJS为用户提供了一个截屏的功能,使用save_screenshot函数实现。

    • phantomJs:浏览器(无可视化界面)
    • 使用方便,只需要有对应文件夹就有了环境,无需安装

    ----selenium+phantomjs 就是爬虫终极解决方案:有些网站上的内容信息是通过动态加载js形成的,所以使用普通爬虫程序无法回去动态加载的js内容。例如豆瓣电影中的电影信息是通过下拉操作动态加载更多的电影信息。

    #爬取更多的电影详情数据(豆瓣)
    bro = webdriver.PhantomJS(executable_path=r"F:learnpython爬虫爬虫+数据,依赖环境	oolsphantomjs-2.1.1-windowsinphantomjs.exe")
    bro.get('https://movie.douban.com/typerank?type_name=%E7%88%B1%E6%83%85&type=13&interval_id=100:90&action=')
    sleep(3)
    bro.save_screenshot('./1.png')
    bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    sleep(3)
    bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    sleep(3)
    bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    bro.save_screenshot('./2.png')
  • 相关阅读:
    深入 kernel panic 流程【转】
    HDMI驱动热插拔检测方法
    WFE和WFI的区别
    SMP多核启动
    CPUFreq驱动
    DMA与cache一致性的问题
    深度理解select、poll和epoll
    Memory barrier 简介
    thinkphp的删除操作
    HOST文件配置
  • 原文地址:https://www.cnblogs.com/zwq-/p/10609438.html
Copyright © 2020-2023  润新知