python——批量下載圖片


前言

批量下載網頁上的圖片需要三個步驟:

  1. 獲取網頁的URL
  2. 獲取網頁上圖片的URL
  3. 下載圖片

例子

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[0]=='href':
          if i[1] not in self.all:
            self.all.append(i[1])

def getPageLinks(url):
  doing=[url]
  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[0]=='src':
          if i[1] not in self.all:
            self.all.append(i[1])

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.cnblogs.com/'):
    loadImg(getImgLinks(i))

拋磚引玉

  1. 可以寫一個函數,用於判斷網頁的編碼格式
  2. 網頁的遍歷可以增加一些控制功能:比如只遍歷同一個網站等。
  3. 下載功能可以使用多線程。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM