python爬取图片并以二进制方式保存到本地

本篇主要介绍python 爬取图片并以二进制形式保存到本地

这回爬取的是一个写真图片网站,上面有一个365日365枚照片写真
写真图片网站链接

这里写图片描述

明确目标,爬取每一页的20张图片,循环生成没一页的url,爬取一页时生成一个对应的页数的文件夹在本地,将图片以二进制保存下来

1、
那么第一步就是requests获取网页的源码了,接着就是分析图片所在的标签,也就是我们需要的通过正则获取的内容

这里写图片描述

2、
获取图片的网页链接及图片的名称,获取图片网页链接的目的之一是为了保存到本地的时候,建立对应页码的文件夹(因为连接中包含了对应的码数)

#取到每一页URL对应的页码
        page = int(url.split('/')[7])

对每一页的图片在爬取的时候都建立一个文件夹,这里需要注意直接以数字命名的文件夹不能直接放在路径中,需加上一个反斜杠

def mkDir(self,i):
        fileName = str(i)
        path = 'D:\Python\PycharmProject\Enhance\\365\%s'%(fileName)
        E = os.path.exists(path)
        if not E:
            os.makedirs(path)
            print u'创建page'+str(i)+u'成功!'
        else:
            print u'创建page'+str(i)+u'失败!,已存在文件夹'

3、
循环生成url的时候,要获取最大页码数,经过分析最大页码数在第一页中存在,通过正则获取后循环

4、注意爬取时最好设置一下时延,防止对网站造成过大的负担,也可添加IP

唉 直接上代码:

#!/usr/bin/python
# -*- coding:utf-8 -*-
# author:joel 18-6-12

'''
365日365枚
http://sozaing.com/category/photo/365photo/page/1/
'''
import random
import time
import os
import requests
import re

class Spider():
    def getHtml(self,url):
        headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36'
        }
        proxies = [
            {'https': '183.128.243.81:6666'},
             {'https': '121.231.168.5:6666'},
              {'https': '121.231.168.123:6666'},
        ]
        proxy = proxies[random.randint(0,2)]
        r = requests.get(url,headers = headers,proxies = proxy)
        html = r.text
        return html

    def getOnePageData(self,url):
        html = self.getHtml(url)
        pattern = re.compile('<p class="title"><a href="(.*?)">(.*?)</a></p>',re.S)
        result = re.findall(pattern,html)
        pictureList = []
        #取到每一页URL对应的页码
        page = int(url.split('/')[7])
        num = 1
        #创建对应页数的文件夹
        self.mkDir(page)
        for i in result:
            html2 = self.getHtml(i[0])
            pictureLink = re.findall(r'<p class="mar_b_25 center">.*?<img.*?src="(.*?)".*?/>.*?</p>',html2,re.S)
            pictureList.append(pictureLink)
            #将每页的图片按图片名存储(二进制),这里直接用数字365做文件名会出错,所以多加一个斜杠
            pic_path = 'D:\Python\PycharmProject\Enhance\\365\%s\%s.jpg'%(page,i[1])
            E = os.path.exists(pic_path)
            if not E:
                pic = requests.get(pictureLink[0])
                f = open(pic_path,'wb')
                f.write(pic.content)
                f.close
                print u'第'+str(num)+u'张...'
            else:
                print u'文件已存在...'
            num += 1
            time.sleep(4+random.randint(1,10))
        return pictureList

    def mkDir(self,i):
        fileName = str(i)
        path = 'D:\Python\PycharmProject\Enhance\\365\%s'%(fileName)
        E = os.path.exists(path)
        if not E:
            os.makedirs(path)
            print u'创建page'+str(i)+u'成功!'
        else:
            print u'创建page'+str(i)+u'失败!,已存在文件夹'

    def getMore(self):
        html = self.getHtml('http://sozaing.com/category/photo/365photo/page/1/')
        #从第一页中获取最后一页的页码数
        lastPage = re.findall(r"<span class='pages'>Page 1 of (\d+)</span>",html)
        for i in range(1,int(lastPage[0])+1):
            self.url = 'http://sozaing.com/category/photo/365photo/page/{}/'.format(i)
            self.getOnePageData(self.url)

spider = Spider()
spider.getMore()

若有问题欢迎交流~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值