zoukankan      html  css  js  c++  java
  • Python爬取mn52网站美女图片以及图片防盗链的解决方法

    防盗链原理

    http标准协议中有专门的字段记录referer
    一来可以追溯上一个入站地址是什么
    二来对于资源文件,可以跟踪到包含显示他的网页地址是什么
    因此所有防盗链方法都是基于这个Referer字段
     
    so:很多网站使用防盗链的方法来设置反爬虫机制,设置这种机制后通过图片路由直接访问会返回403错误,

    其实解决办法很简单,加入header,然后把Referer写入即可!

    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
            'Referer': url
        }

    本文爬取https://www.mn52.com/网站上面的清纯美女图片,代码如下;

    # 需要的库
    import requests
    import re
    import os
    from multiprocessing import Pool
    # 主函数
    def get_img(url):
        # 设置图片存储路径
        path = './mn52/'
        if not os.path.exists(path):
            os.mkdir(path)
        # 请求头,因为图片路由有防盗链设置所以在headers中添加'Referer': url
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
            'Referer': url
        }
        try:
            # 请求主页面路由
            response = requests.get(url=url,headers=headers)
            # print(response.text)
            # 正则提取并遍历获取分页面
            res_paging = re.findall('<div class="picbox">.*?<a href="(.*?)"',response.text,re.S)
            for i in res_paging:
                # 拼接分页面路由
                url_infos = 'https://www.mn52.com' + i
                # 请求分页面路由
                res_details = requests.get(url=url_infos,headers=headers)
                # 遍历获取图片路由
                res_detail = re.findall('<div class="img-wrap">.*?<img .*?rel="(.*?)"/>',res_details.text,re.S)
                for i in res_detail:
                    # 拼接图片路由
                    img_urls = 'https:'+i
                    # 给图片命名
                    filename = i.split('/')[-1]
                    # 判断图片是否已下载
                    if os.path.exists(path+str(filename)):
                        print('图片已存在')
                    else:
                        # 请求图片连接
                        res = requests.get(url=img_urls,headers=headers)
                        # 保存图片
                        with open(path+str(filename),'wb') as f:
                            f.write(res.content)
                            # 打印下载信息
                            print('正在下载:'+img_urls)
        except Exception as e:
            print(e)
    # 程序入口
    if __name__ == '__main__':
        # 构造完整路由
        urls = ['https://www.mn52.com/meihuoxiezhen/list_2_{}.html'.format(i) for i in range(1,94)]
        # 开启多进程
        pool = Pool()
        # 启动程序
        pool.map(get_img,urls)
        print('抓取完成')

    图片比较多,需要一些时间下载,控制台显示的下载过程

    打开文件查看图片是否下载成功

    done

  • 相关阅读:
    计算机基础理论 基本功
    mac 下使用gcc 编译c函数
    技术书籍 读书方法有感
    IntentFilter的相关问题解析
    IOS 学习笔记 2015-04-03 OC-API-文件读写
    (转)iOS中3种正则表达式的使用与比较
    (转)IOS学习笔记-2015-03-29 int、long、long long取值范围
    mysql 游标
    (转) 生活感悟
    IOS 学习笔记 2015-03-27 我理解的OC-代理模式
  • 原文地址:https://www.cnblogs.com/nmsghgnv/p/11311680.html
Copyright © 2011-2022 走看看