本篇主要介绍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()
若有问题欢迎交流~
print('微信公众号搜索 "猿狮的单身日常" ,Java技术升级、虫师修炼,我们 不见不散!')
print('也可以扫下方二维码哦~')
猿狮的单身日常
网友评论