Найти - Пользователи
Полная версия: Парсер сообщений вк на предмет фотографий
Начало » Python проекты » Парсер сообщений вк на предмет фотографий
1
BlackSan
Здравствуйте форумчане, вот решил выложить свой небольшой проект, сразу попрошу не бросаться тапками, хотелось бы конструктивной критики. Python начал осваивать буквально неделю назад и наваял небольшой парсер сообщений вк:

Суть программы заключается в следующем, после запуска вы видите диалог с просьбой вести acces_token вк от страницы сообщения которой будем парсить, затем запрашиваетcя ID пользователя диалог с которым будем парсить, далее происходит парсинг диалога с сохранением из него фотографий.

Чем мотивирован пост :
По большей части данный код был написан для изучения “на практике” и ускоренного впитывания Python'a , по-этому хотел бы узнать ваше мнение о коде: что нравиться, что не нравиться, что можно изменить и как, заранее огромное спасибо

Конкретно хочу получить:
  • Конструктивная критика
  • Поправки по коду
  • Подсказки по улучшению алгоритмов
  • Любые ценные наставления
Код программы:
#Подключаем необходимые модули
import os
import vk
import urllib
import time
import requests
#--------- END ---------#
#Создание папки для фотографии
def mkDirForPh(dirName, co = 0, iF = 1):
    while iF:
        if (dirName in os.listdir()): #если такая папка есть, пробуем добавить - (1) если и такая есть добавляем - (2) и т.д.
            co = co + 1
            dirName = str(withUID) + "(" + str(co) + ")"
        else:# если папки с названием dirName в этой директории нет, создаем ее и переходим в нее
            os.mkdir(dirName) 
            os.chdir(dirName)
            iF = 0
#--------- END ---------#
            
#Поиск ссылки на оригинал изображения
def urlTOP(messAr,url=""): #urlToOriginalPhoto
    if   "photo_2560" in messAr: url = "photo_2560"
    elif "photo_1280" in messAr: url = "photo_1280"
    elif "photo_807"  in messAr: url = "photo_807"
    elif "photo_604"  in messAr: url = "photo_604"
    elif "photo_130"  in messAr: url = "photo_130"
    elif "photo_75"   in messAr: url = "photo_75"
    else: print('error of sizeing')
    url = messAr[url]
    return url
#--------- END ---------#
#Скачивание изображения
def DownloadFile(url):
    local_filename = url.split('/')[-1]
    r = requests.get(url)
    f = open(local_filename, 'wb')
    for chunk in r.iter_content(chunk_size=512 * 1024): 
        if chunk: # filter out keep-alive new chunks
            f.write(chunk)
    f.close()
    return
#--------- END ---------#
#Диалог
def IDC(F = 1): #input dialog check  
    while F:
        if 'token' in globals():#если переменная токена определена
            F = 0
            print('token - Y')
        else:
            temp = input('Введите ваш токен: ')
            if len(temp) > 10 and str(type(temp)) == "<class 'str'>":
                global token
                token = temp
                continue
            else:
                print('Токен введен не правильно!')
                F = 1
                continue
        if 'withUID' in globals():#если переменная withUID определена
            F = 0
            print('ID - Y')
        else:
            temp = input('Введите ID человека, из диалога с которым, вы хотите скачать все фото(пример:947530459) без пробелов и букв ID!: ')
            if len(temp) > 0 and str(type(temp)) == "<class 'str'>":
                global withUID
                withUID = temp
                continue
            else:
                print('ID введен не правильно!' + str(type(temp)))
                F = 1
                continue
#--------- END ---------#
            
IDC()           
#подключаемся к vkAPI
vkAPI = vk.API(access_token=token)
#Достаем сообщения
lm = vkAPI.messages.getHistory(count = 200, user_id=withUID)
# Получаем Имя и Фамилию собеседника
withUsr = vkAPI.users.get(users_ids=withUID)
#Количество сообщений с собеседником
print ("Всего сообщений: "+str(lm['count']))
# Инициализация счетчиков
MPC = 0 #MessParseCounter счетчик для масива lm
SPC = 0 #SavedPhotosCounter счетчик сохраненных сообщений
#создаем папку с именем withUID
mkDirForPh(str(withUID))
#парсим массив сообщений
for i in range(lm['count']): # co - кол-во итераций, lm['count'] - кол-во сообщений всего
    if(MPC > 199):#По скольку сообщения мы вытягиваем по 200 шт, проверяем, какое по счету сообщение мы будем парсить, если MPC > 199 : MPC = 0 и получаем новые 200 сообщений
        lm = vkAPI.messages.getHistory(count = 200, user_id=withUID, offset=i)
        MPC = 0
        time.sleep(0.5)#делаем небольшую паузу
    if 'attachments' in lm['items'][MPC]:  #если в сообщении есть прикрепление
        for j in range(len(lm['items'][MPC]['attachments'])): #парсим прикрепления на предмет фотографий
            if 'photo' in lm['items'][MPC]['attachments'][j]: #если приложение являеться фотографией
                #сохраняем фотографию
                url = urlTOP(lm['items'][MPC]['attachments'][j]['photo'])# получаем URL на картинку
                print("i = " + str(i) + "| j = " + str(j) + "| MPC = " + str(MPC) + "| SPC = \r" + str(SPC)) # дебаг
                DownloadFile(url)#скачиваем файл
                #print (url)
                SPC+=1#инкрементируем счетчик сохраненных фотографий
    #конец for
    MPC+=1 #Инкрементируем счетчик обработанных сообщений
print('Сообщений сканировано:'+ str(i+1) +'\nЗагружено всего фотографий:' + str(SPC))
print('Все скачанные фотографии будут лежать в папке:'+ os.getcwd())
P.S. Код старался комментировать как можно больше
Так-же созрел вопрос, чем лучше компилировать Python?
ayb
1.Прочитать и применять на практике https://www.python.org/dev/peps/pep-0008/
2.Очень много комментариев. Такое большое кол-во только мешает читать код
3.Ни о чем не говорящие имена переменных и функций.

А вообще, скачайте PyCharm и посмотрите свой файл там.
Shaman
#Поиск ссылки на оригинал изображения
def urlTOP(messAr,url=""): #urlToOriginalPhoto
    if   "photo_2560" in messAr: url = "photo_2560"
    elif "photo_1280" in messAr: url = "photo_1280"
    elif "photo_807"  in messAr: url = "photo_807"
    elif "photo_604"  in messAr: url = "photo_604"
    elif "photo_130"  in messAr: url = "photo_130"
    elif "photo_75"   in messAr: url = "photo_75"
    else: print('error of sizeing')
    url = messAr[url]
    return url
Вот это вот не очень хорошо на любом языке.
Jumas_Cola
 import re
messAr = 'wegphoto_78regwrgrehrjt_photo_807_trhrthphoto_1080hbhj'
def urlTOP(messAr): #urlToOriginalPhoto
    url = ''
    if re.findall(r'photo_+[0-9]+', messAr):
        url = re.findall(r'photo_+[0-9]*', messAr)[-1]
    if not url:
        print('error of sizeing')
    return url
print(urlTOP(messAr))

Я бы вот так сделал ту функцию.
Но это не важно, потому что этой теме более трёх лет и об этом все забыли.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB