zoukankan      html  css  js  c++  java
  • 爬虫之图片懒加载技术及js加密

    图片懒加载

    图片懒加载概念:

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

      网站一般如何实现图片懒加载技术呢?在网页源码中,在img标签中首先会使用一个“伪属性”(通常使用src2,original......)去存放真正的图片链接而并非是直接存放在src属性中。当图片出现到页面的可视化区域中,会动态将伪属性替换成src属性,完成图片的加载。站长素材案例后续分析:通过细致观察页面的结构后发现,网页中图片的链接是存储在了src2这个伪属性中

    案例: 

    1. 抓取站长素材http://sc.chinaz.com/中的图片数据

     import requests
     from urllib import request
     import re
     import os

    #1.检查页面数据是否为动态加载出来的
    #2.获取页面源码数据
    if not os.path.exists('tupian'):
        os.mkdir('tupian')
    
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
    }
    
    url = "http://sc.chinaz.com/tupian/shanshuifengjing.html"
    page_text = requests.get(url=url, headers=headers).text
    # print(page_text)
    
    ex = '<img src2="(.*?)" alt=.*?></a>'
    img_url_list = re.findall(ex, page_text, re.S)
    # print(img_url_list)
    for i in img_url_list:
        img_url = i
        img_url = img_url[:-7] + ".jpg"
        print(img_url)
        img_path = 'tupian/' + i.split('/')[-1].split(".")[0][:-2] + ".jpg"
        print(img_path)
        request.urlretrieve(url=img_url, filename=img_path)
        print(img_path+'下载成功!!!')

    2.煎蛋网爬取图片、

    from urllib import request
    import requests
    import base64
    from lxml import etree
    import os
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    }
    if not os.path.exists('jiandan'):
        os.mkdir('jiandan')
        
    url = 'http://jandan.net/ooxx/page-46#comments'
    page_text = requests.get(url=url,headers=headers).text
    
    #解析scr的密文数据
    #查看页面源码:发现所有图片的src值都是一样的。
    #简单观察会发现每张图片加载都是通过jandan_load_img(this)这个js函数实现的。
    #在该函数后面还有一个class值为img-hash的标签,里面存储的是一组hash值,该值就是加密后的img地址
    #加密就是通过js函数实现的,所以分析js函数,获知加密方式,然后进行解密。
    #通过抓包工具抓取起始url的数据包,在数据包中全局搜索js函数名(jandan_load_img),然后分析该函数实现加密的方式。
    #在该js函数中发现有一个方法调用,该方法就是加密方式,对该方法进行搜索
    #搜索到的方法中会发现base64和md5等字样,md5是不可逆的所以优先考虑使用base64解密
    tree = etree.HTML(page_text)
    src_code_list = tree.xpath('//span[@class="img-hash"]/text()')
    for src_code in src_code_list:
        src = 'https:'+base64.b64decode(src_code).decode()
        img_path = 'jiandan/'+src.split('/')[-1]
        request.urlretrieve(url=src,filename=img_path)
        print(img_path+'下载完毕!!!')

    3.梨视频爬取视屏

    import requests
    from urllib import request
    import re
    import os, time
    from lxml import etree
    import random
    
    headers = {
        'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
        'Connection':'close'
    }
    
    url = 'https://www.pearvideo.com/video_1502773'
    
    
    if not os.path.exists('video'):
        os.mkdir('video')
        
        
    response = requests.get(url,headers)
    response.encoding = 'utf-8'
    text = response.text
    
    tree = etree.HTML(text)
    url = tree.xpath('//*[@id="detailsbd"]/div[1]/script[1]/text()')[0]
    name = tree.xpath('//*[@id="detailsbd"]/div[1]/div[2]/div/div[1]/h1/text()')[0]
    print(name)
    ex = 'srcUrl="(.*?)"'
    url = re.findall(ex,url)[0]
    
    file_data = requests.get(url,headers).content
    
    with open(f"video/{name}",'wb') as f:
        f.write(file_data)
        print('下载成功')
  • 相关阅读:
    eslint 的 env 配置是干嘛使的?
    cookie httpOnly 打勾
    如何定制 antd 的样式(theme)
    剑指 Offer 66. 构建乘积数组
    剑指 Offer 65. 不用加减乘除做加法
    剑指 Offer 62. 圆圈中最后剩下的数字
    剑指 Offer 61. 扑克牌中的顺子
    剑指 Offer 59
    剑指 Offer 58
    剑指 Offer 58
  • 原文地址:https://www.cnblogs.com/clbao/p/10251512.html
Copyright © 2011-2022 走看看