Данный скрипт предназначен для парсинга и последующего конвертирования статей из vk.com в fb2-документы. Подтягиваются только статьи, находящиеся в открытом доступе.
Скрипт работает без авторизации, поэтому некоторые статьи могут оказаться недоступны, если вы скармливаете скрипту ссылку на общую страницу со списком всех статей. В этом случае рекомендуется сохранить такую страницу вручную в папку со скриптом.
Скрипт протестирован на Python 3.10.2
Скрипт использует для работы установленный Google Chrome. Если у вас не установлен этот браузер, рекомендую установить его, или перенастроить скрипт под используемый вами браузер.
Скрипт использует множество библиотек. Понимаю, что это забивание гвоздей телескопом, но данные библиотеки позволяли достаточно просто решить некоторые задачи, поэтому были выбраны именно они.
selenium
Нужен для некоторых манипуляций со страницами браузера. В частности, для подгрузки списка статей, если вы передаёте ссылку на страницу со списком статей, или для захвата изображений из статей. Вам потребуется установить selenium, для этого в консоли напишите следующую команду:
pip install seleniumBeautiful Soup 4
Нужен непосредственно для распарсивания захваченных страниц HTML. Вам потребуется его установить, для этого в консоли напишите следующую команду:
pip install bs4requests
Нужен для запроса статей в виде HTML-страниц. В тех случаях, когда используется, он намного экономичнее selenium. Вам так же нужно установить его:
pip install requestsТак же импортируются модули sys, os, time, datetime, random, re, json, base64. Могу ошибаться, но все эти модули уже установлены вместе с Python. Если у вас что-то не заработает, установить эти модули, скорее всего, можно так же, как и предыдущие три.
chromedriver
Если у вас установлен браузер GoogleCrome, вам намного проще будет использовать скрипт. Просто скачайте соответствующий chromedriver со страницы https://chromedriver.chromium.org/downloads и извлеките в папку .gd.
Если скрипт запускать, как самостоятельную программу (файл main.py), по условию if _name__=="__main__": будет автоматически запущена функция main(). В этой функции определяется содержимое переменной url_or_list.
Вы можете поместить в эту переменную url-адрес страницы, на которой размещён список всех статей. Например, для группы «Клуб любителей текстовых игр на QSP» адрес такой страницы выглядит так: https://vk.com/@qsplayer.
def main():
url_or_list="https://vk.com/@qsplayer"
articles = vtf.ArtcilesToFB2(url_or_list, include_images=True)
articles.convert_to_fb2()Либо вы можете поместить в эту переменную список url-адресов на интересующие вас статьи:
def main():
url_or_list=[
"https://vk.com/@qsplayer-qspider-v0130",
"https://vk.com/@qsplayer-qspider-v-0120-svodnaya-statya",
"https://vk.com/@qsplayer-novaya-versiya-qspider-0120",
"https://vk.com/@qsplayer-qspider-versii-0110",
"https://vk.com/@qsplayer-novaya-versiya-qspider-0100",
"https://vk.com/@qsplayer-novaya-versiya-qspider-090",
"https://vk.com/@qsplayer-qspider-pleer-dlya-zapuska-qsp-igr-v-brauzere"
]
articles = vtf.ArtcilesToFB2(url_or_list, include_images=True)
articles.convert_to_fb2()При создании объекта vtf.ArtcilesToFB2 можно передавать параметр include_images (по умолчанию передаётся True), который определяет, нужно ли включать в конечный файл fb2 изображения из статьи. Если передано значение False, вместо изображений в статьях будут только ссылки на эти изображения. Это экономит место на вашем жёстком диске и время, требуемое на работу скрипта.
- Скрипт получает ссылку на страницу со списком статей (извлекает все ссылки на статьи в отдельный список), или список прямых ссылок на статьи, и проходится по всем статьям в этом списке, скачивая их в виде html-страниц в папку
sources(должна находиться радом со скриптом). - Скачанные страницы парсятся, т.е. из них извлекается полностью содержимое статей, при этом генерируется скелет из секций — объектов, вложенных друг в друга, и содержащих распарсенные элементы статьей.
- Распарсенная страница конвертируется в fb2-документ. При этом, если не выставлен параметр
include_image=False, из статей будут подтянуты изображения и сохранены в папкуimages(должна находиться рядом со скриптом) в виде base64-кода, помещённого в обычные текстовые файлы. - Полученные fb2-документы помещаются в папку
articles(должна находиться рядом со скриптом).
Независимо от того, были уже созданы готовые fb2-документы для перечисленных статей, они будут пересозданы вновь, т.е. затрут старые. Изображения в папке images и html-страницы в папке source позволяют не загружать повторно эти данные, если они уже скачаны, что ускоряет работу скрипта при перезапуске из-за возможных ошибок.
Вы можете заметить, что когда вы авторизованы на сайте vk.com, на странице со списком статей присутствует гораздо больше ссылок на статьи, чем если вы открываете ту же страницу, не авторизовавшись.
Поскольку скрипт предполагает работу без авторизации, вы можете заранее подготовить страницу, из которой он будет подтягивать все ссылки на статьи. Делается это следующим образом.
- Открываете страницу со списком статей, например https://vk.com/@qsplayer
- Вручную проматываете всю страницу, пока не появится самая последняя статья.
- Щёлкаете правой кнопкой мыши по любому месту страницы и выбираете пункт "Просмотреть исходный текст страницы"
- В открывшемся окне выделяете весь текст ("
Ctrl+A") и копируете ("Ctrl+C"). - Создаёте новый текстовый файл с кодировкой
utf-8и вставляете в него скопированный текст ("Ctrl+V"). - Сохраняете файл с расширением '
.html' в папке со скриптом. Название файла должно совпадать с названием страницы после символа@. Например, в нашем случае он должен называться "qsplayer.html".
Теперь скрипт будет автоматически подхватывать информацию из этого файла, извлекать из него ссылки на статьи, скачивать и конвертировать эти статьи.
В качестве примеров исходников статей и готовых статей, в папки sources и articles помещены исходники и статьи, скачанные и сгенерированные соответственно скриптом. В папке images находятся изображения в виде base64, сгенерированные в процессе работы скрипта.
Первый релиз. Начал обкатку на разных статьях.
Выявил и устранил:
- Блоки списков не распознавались.
- Неверно подтягивался адрес ссылок — некоторые теги 'a' не содержат атрибут 'href', поэтому их нужно было отсеивать.
- Скорректировано распознавание блоков списков.
- Подправлено распознавание блоков цитат
- Подправлена нумерация списков
- Подправлена обработка не указанных блоков.
- Скрипт реструктурирован для объектной модели, создана кэшкопия для ускорения работы.