Форум сайта python.su
0
В Питоне новичек, но с недавнего времени решил заняться изучением. Вчера ради интереса решил запустить первый скрипт (скрипт не мой, взял на просторах сети), запустить получилось, все работает, скрипт качает файлы, складывает в нужную папочку… но ругается на файлы, в названии которых присутствуют скобки.
Привожу пару логов:
33655046: 0419(SPX).rar : rar
/bin/sh: 1: Syntax error: “(” unexpected
Traceback (most recent call last):
File “./shareleak.py”, line 109, in <module>
dumper.get_file(id)
File “./shareleak.py”, line 54, in get_file
os.rename('tmp.file', ‘slil_dump/’ + extension + “/” + str(id) +'__'+ filename)
33654972: Новая_папка_(19).rar : rar
/bin/sh: 1: Syntax error: “(” unexpected
Traceback (most recent call last):
File “./shareleak.py”, line 109, in <module>
dumper.get_file(id)
File “./shareleak.py”, line 54, in get_file
os.rename('tmp.file', ‘slil_dump/’ + extension + “/” + str(id) +'__'+ filename)
OSError: No such file or directory
#!/usr/bin/env python # -*- coding: UTF-8 -*- # usage: # ./shareleak.py --site slil.ru --start 33611648 --end 33611600 # ./shareleak.py --site rghost.ru --start 39606500 --end 39604000 from subprocess import Popen, PIPE import urllib2, os import re, argparse,locale #Skip files by extension music = ['mp3','wav','midi','mid', 'm3u', 'm4a','ogg','wma','flac','pls'] video = ['avi','mpg','mp4','3gp','mov','flv','dem','bsp','wmv'] image = ['jpg','png','gif','jpeg','bmp'] bin = ['exe','dll','bin','scr'] font = ['ttf','txd'] skip_extensions = music + video + image + bin + font #allow extensions allow_extensions = ['txt','rar','zip','7z'] class slil: def get_file(self,id): page = urllib2.urlopen("http://slil.ru/" + str(id)).read().decode('cp1251') address = '' for line in page.splitlines(): if line.find('var l1nk=')==-1: continue parts = line.split("'") address = "http://slil.ru" + parts[1] + parts[3] break if len(address) < 3: print str(id) + ': FILE_NOT_FOUND' return filename = address.split('/')[5] extension = os.path.splitext(filename)[1].replace('.','').lower() #if extension not in allow_extensions: # return if extension in skip_extensions: return print(str(id) +': '+filename + ' : '+ extension) if not os.path.exists('slil_dump/'+extension): os.makedirs('slil_dump/'+extension) #use tmp file to fix wget bug args = 'wget ' + address + ' -O tmp.file' Popen(args, stdin=PIPE, stdout=PIPE, shell=True).communicate('') os.rename('tmp.file', 'slil_dump/' + extension + "/" + str(id) +'__'+ filename) def upload_file(self,path): pass class rghost: def get_file(self,id): try: page = urllib2.urlopen("http://rghost.ru/" + str(id)).read() except : return address = '' for line in page.splitlines(): if line.find('http://rghost.ru/download/')==-1: continue address = line.split('"')[1] break if len(address) < 3: print str(id) + ': FILE_NOT_FOUND' return filename = re.findall(r'<h1>(.*?)<small>', page, re.DOTALL)[0].split('>')[1].replace('</a','') extension = os.path.splitext(filename)[1].replace('.','').lower() #if extension not in allow_extensions: # return if extension in skip_extensions: return print(str(id) +': '+filename + ' : '+ extension) if not os.path.exists('rghost_dump/'+extension): os.makedirs('rghost_dump/'+extension) #use tmp file to fix wget bug args = 'wget ' + address + ' -O tmp.file' Popen(args, stdin=PIPE, stdout=PIPE, shell=True).communicate('') os.rename('tmp.file', 'rghost_dump/' + extension + "/" + str(id) +'__'+ filename) def upload_file(self,path): pass if __name__ == "__main__": #locale.setlocale(locale.LC_ALL, "ru_RU.UTF-8"), parser = argparse.ArgumentParser(description="Small file storage dumper. Supports slil.ru, rghost.ru") parser.add_argument('--site', action="store",help='site target slil.ru or rghost.ru', required=True) parser.add_argument('--start', action="store", type=int, help='start number', required=True) parser.add_argument('--end', action="store", type=int, help='end number', required=True) args = parser.parse_args() if args.site == 'slil.ru': dumper = slil() else: dumper = rghost() for id in xrange(args.start,args.end,-1): dumper.get_file(id)
Офлайн
52
Код не смотрел, но если проблема действительно в скобках, кто мешает обычным .replace их заменять на лошадок?
Офлайн
0
fata1ex
Код не смотрел, но если проблема действительно в скобках, кто мешает обычным .replace их заменять на лошадок?
Офлайн
52
Смысл такой:
>>> filename = 'asdaksdjasd_(!aha!)_ajsdfajfsa' >>> filename.replace('(', 'loshadka').replace(')', 'loshadka') 'asdaksdjasd_loshadka!aha!loshadka_ajsdfajfsa'
Офлайн
20
bin/sh “не любит” скобки.
os.rename('tmp.file', 'rghost_dump/' + extension + "/" + str(id) +'__'+ filename)
new_name = 'rghost_dump/' + extension + "/" + str(id) +'__'+ filename os.rename('tmp.file', '"{escape_me}"'.format(escape_me = new_name))
Офлайн
0
EBFE
bin/sh “не любит” скобки.=>os.rename('tmp.file', 'rghost_dump/' + extension + "/" + str(id) +'__'+ filename)new_name = 'rghost_dump/' + extension + "/" + str(id) +'__'+ filename os.rename('tmp.file', '"{escape_me}"'.format(escape_me = new_name))
sudo python ./shareleak2.py –site rghost.ru –start 39698883 –end 39698057
39698882: Новая папка (5).part2.rar : rar
/bin/sh: 1: Syntax error: “(” unexpected
Traceback (most recent call last):
File “./shareleak2.py”, line 110, in <module>
dumper.get_file(id)
File “./shareleak2.py”, line 91, in get_file
os.rename('tmp.file', ‘“{escape_me}”’.format(escape_me = new_name))
OSError: Нет такого файла или каталога
Отредактировано poiklik (Авг. 10, 2012 16:59:55)
Офлайн
14
А почему бы Popen не передавать список вместо строки?
Офлайн
14
odnochlen А почему бы Popen не передавать список вместо строки?
Правильное решение.
Только тогда нужно убрать shell=True: http://asvetlov.blogspot.com/2011/03/subprocess.html
Отредактировано Андрей Светлов (Авг. 10, 2012 19:15:47)
Офлайн
0
Андрей Светлов
> *odnochlen*
А почему бы Popen не передавать список вместо строки?
Правильное решение.
Только тогда нужно убрать *shell=True*: http://asvetlov.blogspot.com/2011/03/subprocess.html
Офлайн
14
Используйте
Popen(['/usr/bin/wget', address, '-O'. 'tmp.file'], stdin=PIPE, stdout=PIPE).wait()
И перед rename сделайте
dirname = ‘slil_dump/’ + extension + “/”
if not os.path.exists(dirname):
os.makedirs(dirname)
Отредактировано Андрей Светлов (Авг. 10, 2012 21:21:59)
Офлайн