beckham79 发表于 2015-4-22 09:21:58

python——批量下载图片

前言
  批量下载网页上的图片需要三个步骤:


[*]获取网页的URL
[*]获取网页上图片的URL
[*]下载图片

例子



from html.parser import HTMLParser
import urllib.request
import os,uuid,sys

#第1步:
class PageLinkParser(HTMLParser):
def __init__(self,strict=False):
HTMLParser.__init__(self,strict)
self.all=[]
def handle_starttag(self,tag,attrs):
if tag=='a':
for i in attrs:
if i=='href':
if i not in self.all:
self.all.append(i)
def getPageLinks(url):
doing=
done=[]
while len(doing)>=1:
x=doing.pop();
done.append(x)
print(x)
try:
f=urllib.request.urlopen(x)
parser=PageLinkParser(strict=False)
parser.feed(f.read().decode('utf-8'))
for i in parser.all:
if i not in done:
#doing.insert(0,i) #在此就不遍历了。
          done.append(i)
parser.all=[]
except:
continue
return done

#第2步:
class ImgLinkParser(HTMLParser):
def __init__(self,strict=False):
HTMLParser.__init__(self,strict)
self.all=[]
def handle_starttag(self,tag,attrs):
if tag=='img':
for i in attrs:
if i=='src':
if i not in self.all:
self.all.append(i)
def getImgLinks(url):
parser=ImgLinkParser(strict=False)
try:
f=urllib.request.urlopen(url)
parser.feed(f.read().decode('utf-8'))#解码格式,根据网页的编码格式而定。
finally:
return parser.all
#第3步:
def loadImg(l):
for i in l:
i=i.strip()
print(i)
try:
f=open(os.path.join(os.getcwd(),uuid.uuid4().hex+'.jpg'),'wb') #防止文件名重复,使用UUID
      f.write(urllib.request.urlopen(i).read())
f.close()
except:
print('error:',i)
continue
#使用
if __name__=='__main__':
for i in getPageLinks('http://www.iyunv.com/'):
loadImg(getImgLinks(i))
抛砖引玉


[*]可以写一个函数,用于判断网页的编码格式
[*]网页的遍历可以增加一些控制功能:比如只遍历同一个网站等。
[*]下载功能可以使用多线程。
  
页: [1]
查看完整版本: python——批量下载图片