Skip to content

Commit

Permalink
Finder: add searching date for docs
Browse files Browse the repository at this point in the history
  • Loading branch information
DvaMishkiLapa committed Oct 15, 2023
1 parent 4df9eb1 commit 5fe0904
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 38 deletions.
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,14 @@
С помощью данной утилиты возможно скачать данные по ссылкам, которые, так или иначе разбросаны по архиву [VKontakte](https://vk.com/feed).

Информация о поддерживаемых данных, которые можно скачать:
| Тип данных | Поддержка | Примечание | Папка хранения |
| ------------ | :-------: | --------------------------------------------------------------------------------------------- | ------------------- |
| `Сообщения` || Полная поддержка **[*]**, [кроме видео](#41-почему-нет-поддержки-скачивания-видео) | `./output/messages` |
| `Стена` || Все фото со стены скачиваются из `photos` (`Фотографии`) | `./output/photos` |
| `👍->Фото` | ⚠️ | [Только список ссылок в `JSON` файле](#42-почему-нет-поддержки-скачивания-понравившихся-фото) | `-` |
| `Фотографии` || Полная поддержка | `./output/photos` |
| `Файлы` || Полная поддержка **[*]** | `./output/profile` |
| `Музыка` || Архив хранит в себе только название песен, но не ссылки на них | `-` |
| Тип данных | Поддержка | Сохранение по дате | Примечание | Папка хранения |
| ----------- | :-------: | :----------------: | ---------------------------------------------------------------------------------- | ----------------------- |
| `Сообщения` || | Полная поддержка **[*]**, [кроме видео](#41-почему-нет-поддержки-скачивания-видео) | `./output/messages` |
| `Стена` || | Все фото со стены скачиваются из `photos` (`Фото`) | `./output/photos` |
| `👍->Фото` || | Полная поддержка **[*]** | `./output/likes/photos` |
| `Фото` || | Полная поддержка | `./output/photos` |
| `Файлы` || | Полная поддержка **[*]** | `./output/profile` |
| `Музыка` || | В архиве есть только названия песен, но не ссылки | `-` |

**[*]** - [Если включен доступ к `Сookie` файлам.](#31-использование-сookie-файлов-браузера)

Expand Down
47 changes: 39 additions & 8 deletions links_finder.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,37 @@ def get_photos_attachment(self, file_path: str, vk_encoding: str = 'cp1251') ->
return ''

@classmethod
def get_likes_or_doc_attachment(self, file_path: str, vk_encoding: str = 'cp1251') -> List[str] | None:
def get_doc_attachment(self, file_path: str, vk_encoding: str = 'cp1251') -> List[str] | None:
'''
Возвращает все ссылки на вложения из `html` файла документов профиля
`file_path`: путь до файла для чтения
`vk_encoding`: Кодировка `.html` файлов VK. Обычно, `cp1251`
'''
with open(file_path, encoding=vk_encoding) as f:
try:
doc_info = {}
soup = BeautifulSoup(f.read(), 'html.parser')
items = soup.find_all('div', class_='item')
if items:
for el in items:
link = el.find('a', href=str)
if link:
date = el.find('div', class_='item__tertiary')
if date:
date = date.text.strip()
date = '_'.join(date.replace('\n', ' ').split(' ')[0:3])
else:
date = 'no_date'
link_storage = doc_info.setdefault(date, [])
link_storage.append(link['href'])
return doc_info
return ''
except Exception as e:
logger.error(f'Ошибка в файле {file_path}: {e}. Он будет пропущен.')
return ''

@classmethod
def get_likes_attachment(self, file_path: str, vk_encoding: str = 'cp1251') -> List[str] | None:
'''
Возвращает все ссылки на вложения из `html` файла лайкнутых фото профиля
`file_path`: путь до файла для чтения
Expand Down Expand Up @@ -263,7 +293,7 @@ def __get_vk_attachments(self) -> Dict[str, dict]:
if likes_photo_folder:
path = join(self.archive_path, likes_photo_folder)
logger.info(f'📁: {path}')
find_links = list(set(chain(*self.walk_directory(path, self.get_likes_or_doc_attachment, self.core_count))))
find_links = list(set(chain(*self.walk_directory(path, self.get_likes_attachment, self.core_count))))
count_find_link = len(find_links)
likes_photo_links += count_find_link
result['likes/photo'] = {
Expand Down Expand Up @@ -295,12 +325,13 @@ def __get_vk_attachments(self) -> Dict[str, dict]:
dirs = self.get_all_dirs_from_directory(join(self.archive_path, documents_folder))
path = join(self.archive_path, documents_folder, 'documents.html')
logger.info(f'📁: {path}')
find_links = list(set(chain(*self.walk_directory(path, self.get_likes_or_doc_attachment, self.core_count))))
count_find_link = len(find_links)
documents_links += count_find_link
result['profile'] = {
'links': find_links
}
find_links = list(self.walk_directory(path, self.get_doc_attachment, self.core_count))
for el in find_links:
if el:
for date, links in el.items():
links_storage = result['profile'].setdefault(date, [])
links_storage.extend(links)
documents_links += len(links)
logger.info(f'🔍 Количество найденных 🔗 в {documents_folder}: {documents_links}')
all_find_links += documents_links

Expand Down
51 changes: 29 additions & 22 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,30 +170,37 @@ async def profile_handler(info: Dict[str, Any], folder: str, sema: asyncio.Bound
'''
result = {}
full_count = 0
count_by_doc = 0
info_type = 'documents'

logger.debug(f'Начата обработка 🔗 для {info_type}')
path_for_create = join(output_folder, folder, info_type)
tools.create_folder(path_for_create)
logger.debug(f'Создана папка по пути {path_for_create}')
result[info_type] = {}
tasks = [asyncio.ensure_future(
data_downloader.get_info(
url=v,
save_path=path_for_create,
file_name=info['links'].index(v),
sema=sema,
cookies=cookies
)
) for v in info['links']]
count = len(tasks)
full_count += count
logger.debug(f'Задачи на обработку 🔗 созданы, их количество: {count}')
tasks_result = list(filter(lambda link: link, await asyncio.gather(*tasks)))
logger.debug(f'Задачи на обработку 🔗 выполнены, количество валидных данных: {len(tasks_result)}')
for res in tasks_result:
file_info = result[info_type].setdefault(res['file_info'], [])
file_info.append(res['url'])
path_for_doc = join(output_folder, folder, info_type)
logger.debug(f'Создана папка по пути {path_for_doc}')
tools.create_folder(path_for_doc)
for date, links in info.items():
if save_by_date:
storage = result.setdefault(date, {})
path_for_create = join(path_for_doc, date)
tools.create_folder(path_for_create)
logger.debug(f'Создана папка по пути {path_for_create}')
else:
storage = result
path_for_create = path_for_doc
tasks = [asyncio.ensure_future(
data_downloader.get_info(
url=v,
save_path=path_for_create,
file_name=links.index(v),
sema=sema,
cookies=cookies
)
) for v in links]
full_count += len(tasks)
tasks_result = list(filter(lambda link: link, await asyncio.gather(*tasks)))
count_by_doc += len(tasks_result)
for res in tasks_result:
file_info = storage.setdefault(res['file_info'], [])
file_info.append(res['url'])
logger.debug(f'Количество валидных данных, полученных из 🔗: {count_by_doc}')
return result, full_count


Expand Down

0 comments on commit 5fe0904

Please sign in to comment.