一.图片懒加载

什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import requests

from lxml import etree

if __name__ == "__main__":

     url = 'http://sc.chinaz.com/tupian/gudianmeinvtupian.html'

     headers = {

         'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',

     }

     #获取页面文本数据

     response = requests.get(url=url,headers=headers)

     response.encoding = 'utf-8'

     page_text = response.text

     #解析页面数据(获取页面中的图片链接)

     #创建etree对象

     tree = etree.HTML(page_text)

     div_list = tree.xpath('//div[@id="container"]/div')

     #解析获取图片地址和图片的名称

     for div in div_list:

         image_url = div.xpath('.//img/@src')

         image_name = div.xpath('.//img/@alt')

         print(image_url) #打印图片链接

         print(image_name)#打印图片名称
  • - 运行结果观察发现,我们可以获取图片的名称,但是链接获取的为空,检查后发现xpath表达式也没有问题,究其原因出在了哪里呢?

  • 图片懒加载概念:

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

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

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

  • 站长素材案例后续分析:通过细致观察页面的结构后发现,网页中图片的链接是存储在了src2这个伪属性中

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import requests

from lxml import etree

if __name__ == "__main__":

     url = 'http://sc.chinaz.com/tupian/gudianmeinvtupian.html'

     headers = {

         'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',

     }

     #获取页面文本数据

     response = requests.get(url=url,headers=headers)

     response.encoding = 'utf-8'

     page_text = response.text

     #解析页面数据(获取页面中的图片链接)

     #创建etree对象

     tree = etree.HTML(page_text)

     div_list = tree.xpath('//div[@id="container"]/div')

     #解析获取图片地址和图片的名称

     for div in div_list:

         image_url = div.xpath('.//img/@src'2) #src2伪属性

         image_name = div.xpath('.//img/@alt')

         print(image_url) #打印图片链接

         print(image_name)#打印图片名称

二.selenium

  • 什么是selenium?

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

  • 环境搭建

    • 安装selenum:pip install selenium

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

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

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

  • 效果展示:

from selenium import webdriver

from time import sleep

# 后面是你的浏览器驱动位置,记得前面加r'','r'是防止字符转义的

driver = webdriver.Chrome(r'驱动程序路径')

# 用get打开百度页面

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

# 查找页面的“设置”选项,并进行点击

driver.find_elements_by_link_text('设置')[0].click()

sleep(2)

# # 打开设置后找到“搜索设置”选项,设置为每页显示50条

driver.find_elements_by_link_text('搜索设置')[0].click()

sleep(2)

# 选中每页显示50条

m = driver.find_element_by_id('nr')

sleep(2)

m.find_element_by_xpath('//*[@id="nr"]/option[3]').click()

m.find_element_by_xpath('.//option[3]').click()

sleep(2)

# 点击保存设置

driver.find_elements_by_class_name("prefpanelgo")[0].click()

sleep(2)

# 处理弹出的警告页面   确定accept() 和 取消dismiss()

driver.switch_to_alert().accept()

sleep(2)

# 找到百度的输入框,并输入 美女

driver.find_element_by_id('kw').send_keys('美女')

sleep(2)

# 点击搜索按钮

driver.find_element_by_id('su').click()

sleep(2)

# 在打开的页面中找到“Selenium - 开源中国社区”,并打开这个页面

driver.find_elements_by_link_text('美女_百度图片')[0].click()

sleep(3)

# 关闭浏览器

driver.quit()

代码介绍:

#导包

from selenium import webdriver  

#创建浏览器对象,通过该对象可以操作浏览器

browser = webdriver.Chrome('驱动路径')

#使用浏览器发起指定请求

browser.get(url)

#使用下面的方法,查找指定的元素进行操作即可

    find_element_by_id            根据id找节点

    find_elements_by_name         根据name找

    find_elements_by_xpath        根据xpath查找

    find_elements_by_tag_name     根据标签名找

    find_elements_by_class_name   根据class名字查找

登录示例

from selenium import webdriver
from time import sleep bro = webdriver.Chrome(executable_path='./chromedriver.exe') bro.get('http://xxx.xxx.xx/')
sleep(1)
text = bro.find_element_by_id('user')
text.send_keys('user')
sleep(1)
text = bro.find_element_by_id('password')
text.send_keys('password')
sleep(1)
button = bro.find_element_by_id('submit')
button.click()
sleep(3)
bro.quit()

三.phantomJs

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

import time
# phantomjs路径 path = r'PhantomJS驱动路径' browser = webdriver.PhantomJS(path) # 打开百度
url = 'http://www.baidu.com/' browser.get(url) time.sleep(3)
browser.save_screenshot(r'phantomjs\baidu.png') # 查找input输入框
my_input = browser.find_element_by_id('kw') # 往框里面写文字 my_input.send_keys('美女')
time.sleep(3)
#截屏 browser.save_screenshot(r'phantomjs\meinv.png') # 查找搜索按钮 button = browser.find_elements_by_class_name('s_btn')[0] button.click() time.sleep(3)
browser.save_screenshot(r'phantomjs\show.png') time.sleep(3)
browser.quit()

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

综合操作:需求是尽可能多的爬取豆瓣网中的电影信息

from selenium import webdriver

from time import sleep

import time

if __name__ == '__main__':

    url = 'https://movie.douban.com/typerank?type_name=%E6%81%90%E6%80%96&type=20&interval_id=100:90&action='

    # 发起请求前,可以让url表示的页面动态加载出更多的数据

    path = r'C:\Users\Administrator\Desktop\爬虫授课\day05\ziliao\phantomjs-2.1.1-windows\bin\phantomjs.exe'

    # 创建无界面的浏览器对象

    bro = webdriver.PhantomJS(path)

    # 发起url请求

    bro.get(url)

    time.sleep(3)

    # 截图

    bro.save_screenshot('1.png')

    # 执行js代码(让滚动条向下偏移n个像素(作用:动态加载了更多的电影信息))

    js = 'window.scrollTo(0,document.body.scrollHeight)'

    bro.execute_script(js)  # 该函数可以执行一组字符串形式的js代码

    time.sleep(2)

    bro.execute_script(js)  # 该函数可以执行一组字符串形式的js代码

    time.sleep(2)

    bro.save_screenshot('2.png') 

    time.sleep(2) 

    # 使用爬虫程序爬去当前url中的内容 

    html_source = bro.page_source # 该属性可以获取当前浏览器的当前页的源码(html) 

    with open('./source.html', 'w', encoding='utf-8') as fp: 

        fp.write(html_source) 

    bro.quit()

需求:获取页面更多信息

from selenium import webdriver
from time import sleep
pj_path = r'E:\fmgao\2018高凤明\me\python\kejian\m7\第7模块课件\第7模块课件\01-爬虫课件\5. 动态数据加载爬取\phantomjs-2.1.1-windows\bin\phantomjs.exe'
bro = webdriver.PhantomJS(executable_path=pj_path)
url = 'https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend'
bro.get(url)
sleep(1)
bro.save_screenshot('./1.png')
# 编写js代码,让页面中的滚轮向下滑动
# js='window.scrollTo(0,document.body.scrollHeight)'
# bro.execute_script(js)
# sleep(1)
button = bro.find_elements_by_class_name('more')[0]
button.click()
sleep(1)
button.click()
sleep(1)
bro.save_screenshot('./2.png')
# 获取加载数据之后的页面
page_text = bro.page_source
print('page_text')

四.谷歌无头浏览器

  • 由于PhantomJs最近已经停止了更新和维护,所以推荐大家可以使用谷歌的无头浏览器,是一款无界面的谷歌浏览器。
  • 代码展示:
from selenium import webdriver

from selenium.webdriver.chrome.options import Options

import time

# 创建一个参数对象,用来控制chrome以无界面模式打开

chrome_options = Options()

chrome_options.add_argument('--headless')

chrome_options.add_argument('--disable-gpu')

# 驱动路径

path = r'C:\Users\ZBLi\Desktop\1801\day05\ziliao\chromedriver.exe'

# 创建浏览器对象

browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)

# 上网

url = 'http://www.baidu.com/'

browser.get(url)

time.sleep(3)

browser.save_screenshot('baidu.png')
browser.quit()

selenuim和phantonJs处理网页动态加载数据的爬取的更多相关文章

  1. 爬虫开发6.selenuim和phantonJs处理网页动态加载数据的爬取

    selenuim和phantonJs处理网页动态加载数据的爬取阅读量: 1203 动态数据加载处理 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/ ...

  2. (五)selenuim和phantonJs处理网页动态加载数据的爬取

    selenuim和phantonJs处理网页动态加载数据的爬取 一 图片懒加载 自己理解------就是在打开一个页面的时候,图片数量特别多,图片加载会增加服务器的压力,所以我们在这个时候,就会用到- ...

  3. 爬虫--selenuim和phantonJs处理网页动态加载数据的爬取

    1.谷歌浏览器的使用 下载谷歌浏览器 安装谷歌访问助手 终于用上谷歌浏览器了.....激动 问题:处理页面动态加载数据的爬取 -1.selenium -2.phantomJs 1.selenium 二 ...

  4. 6-----selenuim和phantonJs处理网页动态加载数据的爬取

    动态数据加载处理 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding ...

  5. AppCan学习笔记----关闭页面listview动态加载数据

    AppCan页面关闭 AppCan 的页面是由两个HTML组成,如果要完全关闭的话需要在主HTML eg.index.html中关闭,关闭方法:appcan.window.close(-1); 管道 ...

  6. [JS前端开发] js/jquery控制页面动态加载数据 滑动滚动条自动加载事件

    页面滚动动态加载数据,页面下拉自动加载内容 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样的效果:进入qq空间,向下拉动空 ...

  7. 微信小程序(五) 利用模板动态加载数据

    利用模板动态加载数据,其实是对上一节静态数据替换成动态数据:

  8. mui 动态加载数据出现的问题处理 (silder轮播组件 indexedList索引列表 下拉刷新不能继续加载数据)

    mui-slider 问题:动态给mui的图片轮播添加图片,轮播不滚动. 解决:最后把滚动轮播图片的mui(".mui-slider").slider({interval: 300 ...

  9. ASP.NET MVC动态加载数据

    ASP.NET MVC动态加载数据,一般的做法是使用$.each方法来循环产生tabel: 你可以在html时先写下非动态的部分:  Source Code 上图中,有一行代码: <tbody ...

随机推荐

  1. layout 布局、手风琴accordion、选项卡tabs【转载】

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. Java Bitset

    Bitset创建一种特殊的数组来保存非负整数的值 取值为true和false,初始都是false.Bitset初始化是一个long,65位,增加位数的话只能是64的整数倍. 如果用一个Bitset存储 ...

  3. MySQL 安全整理

    MySQL 安全整理 关闭外网的端口访问. 使用高位的端口号. 如果需要外网访问不给最高的权限. 如果需要外网访问也是绑定客户端. To be continued

  4. TP5 中引入第三方类库

    通过了解tp5的目录结构,我们知道其中有两个目录是纺织扩展类库文件的. extend是放置自定义或者其他类文件的. vendor目录是放置composer类库文件的. 当我们的第三方类库文件是下载的, ...

  5. Appium Desktop Inspector 安卓真机配置(Windows)

    本文是基于 Windows环境 通过Appium Desktop 测试真机,首先要确保测试机已经和电脑正确连接(将手机和电脑通过USB数据线连接,手机打开USB调试) 确认电脑与手机是否连接成功的方法 ...

  6. ASP.NET AJAX入门系列(7):使用客户端脚本对UpdateProgress编程

    在本篇文章中,我们将通过编写JavaScript来使用客户端行为扩展UpdateProgress控件,客户端代码将使用ASP.NET AJAX Library中的PageRequestManager, ...

  7. hadoop行业技术创新解决方案

    如今有很多公司都在努力挖掘他们拥有的大量数据,包括结构化.非结构化.半结构化以及二进制数据等,来探索对数据的深入利用. 大多数公司估计他们只分析了已有数据的12%,剩余88%还没有被充分利用.大量的数 ...

  8. spark-streaming-kafka-0-8 和 0-10的使用区别

    一.spark-streaming-kafka-0-8_2.11-2.0.2.jar 1.pom.xml <!-- https://mvnrepository.com/artifact/org. ...

  9. 排序算法<No.3>【桶排序】

    算法,是永恒的技能,今天继续算法篇,将研究桶排序. 算法思想: 桶排序,其思想非常简单易懂,就是是将一个数据表分割成许多小数据集,每个数据集对应于一个新的集合(也就是所谓的桶bucket),然后每个b ...

  10. eval 日期对象

    js中,eval相当于python中的eval(表达式)和exec(代码)的集合. var d = new Date();    #申明一个新的日期对象,方便之后调用,它的方法getDate();ge ...