| Всё подряд | О жизни | Фотозаметки | Техническое |
Регистрация | Забыл пароль?



Простой, быстрый удобный

Парсим сайт при помощи ChatGPT и Python
Категория: О жизни | (27 июля 2023)
Итак, сегодня нашёл один интересный сайт. Имя называть не буду, но скажу что на нём очень много mod/xm/nsf файлов, которые очень хотелось сохранить.

Но вот проблема. Скачать через софт типа Offline Exporer его невозможно, так как он написан на JS и общение с ним осуществляется через JSON в формате
{"path":"/directory MIDI","size":851106123,"type":"directory","numChildren":3}

Если внутри есть файл, то ответ будет вида:
{"path":"/VGM Rips/1943_Kai_(TurboGrafx-16)/01 Air Battle A (Round 
1).vgz","size":64074,"type":"file","idx":0},{"path":"/VGM Rips/1943_Kai_(TurboGrafx-16)/02 Antiship Battle A
(Round 1-Xu You).vgz",

Запросы идут
site.ru/music/Famicompo/mini0/Cover/04_airou.nsf или
site.ru/music/VGM Rips/1943_Kai_(TurboGrafx-16)/02 Antiship
Battle A (Round 1-Xu You).vgz

Т.е. перед "/VGM Rips/1943_Kai_(TurboGrafx-16)/01 Air Battle A (Round 1).vgz", который в JSON - нужно добавить /music/, чтоб файл скачался.

Вопрос сложный. Я не имел опыта парсинга через JSON.

Обратимся к ChatGPT.
photo-2023-07-27-19-53-32-copy.jpg (82.02 Kb)

Код он нам выдал.
photo-2023-07-27-15-05-47.jpg (130.39 Kb)

Но, запустив его, я свалился в ошибку, что имена файлов слишком длинные для винды. Снова просим ChatGPT переписать его, чтоб он сокращал имена файлов:
snimok2.jpg (107. Kb)

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

snimo4.jpg (32.89 Kb)

И вот у нас полностью рабочий код.
123456.jpg (40.73 Kb)

Таким образом, буквально за полчаса мы распарсили сайт, полностью написанный на JS. Мы конечно теряем имена файлов и папок, но учитывая то, что имена папок там по 40-80 символов, и я не знаю Python - это меньшая из жертв.

Кому надо, юзаем!
import os
import requests

url = "https://site.ru/chip/browse"
params = {"path": "/", "mode": "json"}

session = requests.Session()
response = session.get(url, params=params)
response_json = response.json()

def download_files(response_json, parent_dir=""):
for item in response_json:
item_path = item["path"]
item_type = item["type"]
if item_type == "directory":
dir_name = item_path.split("/")[-1][:6].replace(" ", "_")
dir_path = os.path.join(parent_dir, dir_name)
os.makedirs(dir_path, exist_ok=True)
dir_params = {"path": item_path, "mode": "json"}
dir_response = session.get(url, params=dir_params)
dir_response_json = dir_response.json()
download_files(dir_response_json, parent_dir=dir_path)
elif item_type == "file":
file_name = item_path.split("/")[-1][:6].replace(" ", "_")
file_ext = item_path.split(".")[-1][:3]
file_url = "https://site.ru/music" + item_path
file_path = os.path.join(parent_dir, file_name + "." + file_ext)
i = 2
while os.path.exists(file_path):
# If file already exists, add a number to the file name to make it unique
file_name = item_path.split("/")[-1][:6+i].replace(" ", "_")
file_path = os.path.join(parent_dir, file_name + "." + file_ext)
i += 1
with open(file_path, "wb") as f:
file_response = session.get(file_url)
f.write(file_response.content)
print(f"Downloaded {file_path}")

download_files(response_json)

 Просмотров: 339 | распечатать

Анон, представься пожалуйста. Регистрация занимает от силы 3 секунды.

Разные хренюшки
 Популярные записи
 Свежие комменты
» Ух, мне бы тоже прибраться... (29.03.2020)
// Домашняя серверная на балконе
Автор TwilightSparkle


» Фонарик за 120 рублей за ебея :)

Чип там лютейшее г... (08.10.2018)
// Доделал тут бортовую сеть велосипеда
Автор lionovsky

» Не эстетично.
А контроллер светодиодов паленый кита... (08.10.2018)
// Доделал тут бортовую сеть велосипеда
Автор The_Ivan682

» Listic, ага. Пристёгивать нужно за раму + колесо. ... (09.11.2017)
// А хорошо тут в Питере
Автор lionovsky

 Календарь
« Апрель 2024 »
Пн Вт Ср Чт Пт Сб Вс
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

 Основано Lionovsky в 2009-2010 году