2016-11-07 5 views
0

У меня есть сценарий на основе от LiteScraper из GitHub, чтобы очистить мемы и гифы из http://ifunny.coPython скребок Именование файлов

Скрипт сохраняет все изображения в папках с меткой времени, например, «ifunny- (метка времени)»

Я соскабливаю от http://ifunny.co/feeds/shuffle, поэтому я получаю случайную страницу с 10 изображениями каждый раз.

Проблема в том, что мне нужно изменить сценарий, чтобы он сохранял все изображения в заданном имени папки.

Я попытался удалить код, который добавляет временную метку, но проблема заключается в том, что каждый раз, когда он получает до 10 изображений и царапины на следующей странице, 10 новых изображений перезаписывают старые изображения.

Сценарий кажется, назвать образы, как «1, 2, 3, 4» ЭСТ

Вот код:

import os 
import time 
from html.parser import HTMLParser 
import urllib.request 

#todo: char support for Windows 
#deal with triple backslash filter 
#recursive parser option 


class LiteScraper(HTMLParser): 
    def __init__(self): 
     HTMLParser.__init__(self) 
     self.lastStartTag="No-Tag" 
     self.lastAttributes=[] 
     self.lastImgUrl="" 
     self.Data=[] 
     self.acceptedTags=["div","p","h","h1","h2","h3","h4","h5","h6","ul","li","a","img"] 
     self.counter=0 
     self.url="" 


     self.SAVE_DIR="" #/Users/stjepanbrkic/Desktop/temp 
     self.Headers=["User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"] 

    def handle_starttag(self,tag,attrs): 
     #print("Encountered a START tag:",tag) 
     self.lastStartTag=tag 
     self.lastAttributes=attrs #unnecesarry, might come in hany 

     if self.lastStartTag=="img": 
      attrs=self.lastAttributes 

      for attribute in attrs: 
       if attribute[0]=="src": 
        self.lastImgUrl=attribute[1] 
        print(attribute[1]) 

        #Allow GIF from iFunny to download 
        for attribute in attrs: 
         if attribute[0]=="data-gif": 
          self.lastImgUrl=attribute[1] 
          print(attribute[1]) 
          #End Gif Code 

      self.handle_picture(self.lastImgUrl) 

    def handle_endtag(self,tag): 
     #print("Encountered a END tag:",tag) 
     pass 

    def handle_data(self,data): 
     data=data.replace("\n"," ") 
     data=data.replace("\t"," ") 
     data=data.replace("\r"," ") 
     if self.lastStartTag in self.acceptedTags: 
      if not data.isspace(): 
       print("Encountered some data:",data) 
       self.Data.append(data) 

     else: 
      print("Encountered filtered data.") #Debug 

    def handle_picture(self,url): 
     print("Bumped into a picture. Downloading it now.") 
     self.counter+=1 
     if url[:2]=="//": 
      url="http:"+url 

     extension=url.split(".") 
     extension="."+extension[-1] 

     try: 
      req=urllib.request.Request(url) 
      req.add_header(self.Headers[0],self.Headers[1]) 
      response=urllib.request.urlopen(req,timeout=10) 
      picdata=response.read() 
      file=open(self.SAVE_DIR+"/pics/"+str(self.counter)+extension,"wb") 
      file.write(picdata) 
      file.close() 
     except Exception as e: 
      print("Something went wrong, sorry.") 


    def start(self,url): 
     self.url=url 
     self.checkSaveDir() 

     try: #wrapped in exception - if there is a problem with url/server 
      req=urllib.request.Request(url) 
      req.add_header(self.Headers[0],self.Headers[1]) 
      response=urllib.request.urlopen(req,timeout=10) 
      siteData=response.read().decode("utf-8") 
      self.feed(siteData) 
     except Exception as e: 
      print(e) 

     self.__init__() #resets the parser/scraper for serial parsing/scraping 
     print("Done!") 

    def checkSaveDir(self): 
     #----windows support 
     if os.name=="nt": 
      container="\ " 
      path=os.path.normpath(__file__) 
      path=path.split(container[0]) 
      path=container[0].join(path[:len(path)-1]) 
      path=path.split(container[0]) 
      path="/".join(path) 
     #no more windows support! :P 
     #for some reason, os.normpath returns path with backslashes 
     #on windows, so they had to be supstituted with fowardslashes. 

     else: 
      path=os.path.normpath(__file__) 
      path=path.split("/") 
      path="/".join(path[:len(path)-1]) 

     foldername=self.url[7:] 
     foldername=foldername.split("/")[0] 

     extension=time.strftime("iFunny")+"-"+time.strftime("%d-%m-%Y") + "-" + time.strftime("%Hh%Mm%Ss") 

     self.SAVE_DIR=path+"/"+foldername+"-"+extension 


     if not os.path.exists(self.SAVE_DIR): 
      os.makedirs(self.SAVE_DIR) 

     if not os.path.exists(self.SAVE_DIR+"/pics"): 
      os.makedirs(self.SAVE_DIR+"/pics") 

     print(self.SAVE_DIR) 

и это то, что я бегу, чтобы использовать скрипт:

Pastebin точка ком/PNwJ9wEJ

Извините за Pastebin, это обыкновение позвольте мне опубликовать мой код ...

Я очень новичок в python, поэтому не знаю, как это исправить. Можно ли это сделать так, чтобы это было сделано?

Page 1: имена изображений (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) Страницы 2 имен изображений: (11, 12, 13 ....)

ответ

0

Каждый раз, когда создается ваш парсер (так для каждой новой страницы), значение counter равно нулю. Вот почему изображения продолжают переписываться.

Одним из вариантов было бы определить, какие имена файлов уже используются.

i = 0 
while os.path.isfile('your_filename_logic_'+str(i)): 
    i += 1 
# Now i is the first number which hasn't been used. 

Но если вы доберетесь до тысяч изображений, это может быть не так быстро, как вы бы хотели.

Вы можете сохранить счетчик в файле после завершения LiteScraper и прочитать его при следующем запуске.

def startMyNewCounter(self): 
    if os.path.isfile('your_filename_logic_' + 'count'): 
     with open('your_filename_logic_'+'count', 'r') as f: 
      self.counter = int(next(f)) 
    else: 
     self.counter = 0 

def saveMyCounter(self): 
    with open('your_filename_logic_'+'count', 'w') as f: 
     f.write(str(self.counter) + '\n') 

Или самый простой ответ: если вы не заботитесь о ваших изображений после того, как программа закрывается, вы можете сделать счетчик глобальной переменной, а не член вашей LiteScraper. Поэтому каждый новый LiteScraper берет верх, где остановился последний.

Смежные вопросы