• 爬虫之图片懒加载技术及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('下载成功')
  • 相关阅读:
    课后作业之找水王
    SCRUM第二阶段第十天
    第九周总结
    冲刺一3
    用户项目
    预会热词统计
    冲刺一2
    冲刺一(一阶)1
    第八周总结
    小组合作
  • 原文地址:https://www.cnblogs.com/clbao/p/10251512.html
Copyright © 2020-2023  润新知