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:\爬虫+数据分析\tools\chromedriver.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:\爬虫+数据分析\tools\chromedriver.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:\爬虫+数据分析\tools\chromedriver.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:\learn\python爬虫\爬虫+数据,依赖环境\tools\phantomjs-2.1.1-windows\bin\phantomjs.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')

 

转载于:https://www.cnblogs.com/zwq-/p/10609438.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值