ziemenz / Kinopoisk.bundle

10 stars 5 forks source link

В сканере сериалов реализовать забор данных из LOSTFILM.TV #13

Open anvme opened 4 years ago

anvme commented 4 years ago

Если в родительской папке сериала есть тег в конце [LostFilm.tv] (Не зависимо от регистра) парcить lostfilm.tv

Akior commented 4 years ago

Желательно requests организовать с обходом cloudflare ddos protection: https://pypi.org/project/cloudscraper/ И возможностью использовать proxy для обхода блока РКН

ziemenz commented 4 years ago

Можно поподробнее откуда парсить и что?

Akior commented 4 years ago

Ну например сериал ходячие мертвецы: делаем request к https://www.lostfilm.tv/search/?q=%D1%85%D0%BE%D0%B4%D1%8F%D1%87%D0%B8%D0%B5+%D0%BC%D0%B5%D1%80%D1%82%D0%B2%D0%B5%D1%86%D1%8B оттуда вынимаем dif class="row-search" и смотрим href="/series/The_Walking_Dead" Заходим на https://www.lostfilm.tv/series/The_Walking_Dead и снимаем данные Описание: class="text-block description" Заходим на https://www.lostfilm.tv/series/The_Walking_Dead/seasons/ из class="gamma" можно взять название эпизодов

Минимальные данные которые нужны это описание для сериала.

Akior commented 4 years ago

Я накидал базу для запроса сериала и получения сюжета. Мой пример работает через вызов из вне

python3 example.py "%D1%85%D0%BE%D0%B4%D1%8F%D1%87%D0%B8%D0%B5+%D0%BC%D0%B5%D1%80%D1%82%D0%B2%D0%B5%D1%86%D1%8B"

Сама функция

import sys
import re
import requests
import cloudscraper
import traceback
import six
from enum import Enum
from requests import Response
import html
from bs4 import BeautifulSoup

PLUGIN_NAME = 'lostfilm.tv'

url="https://www.lostfilm.tv"
search="/search/?q="
name=(str(sys.argv[1]))

scraper = cloudscraper.create_scraper()

def get_soup(url, parser=None):
    if parser:
        return BeautifulSoup(url, parser)
    else:
        if 'lxml' in sys.modules:              # pragma: no cover
            return BeautifulSoup(url, 'lxml')
        else:
            return BeautifulSoup(url, 'html.parser')
#генерируем url для запроса сериала
download_serials_url=url+search+name
serials_search = scraper.get(download_serials_url)
#формируем html страницу
soup = get_soup(serials_search.text)
#ищем нужный div
serials_class = soup.find('div', class_='row-search')
#вытаскиваем путь для сериала
serials_path = serials_class.find("a", {"class":"no-decoration"})['href']

#формируем ссылку на сериал и запрос
download_caption_url=url+serials_path 
caption_search = scraper.get(download_caption_url) 
#формируем html страницу
soup = get_soup(caption_search.text) 
#ищем нужный div и смотрим сразу текстовые значения
caption_class = soup.find('div', class_='text-block description').text 
#получаем обрезку только информации о сюжете
print(caption_class[caption_class.find('Сюжет'):])
ziemenz commented 4 years ago

Основная проблема в разработке плагинов для PLEX в том, что мы очень ограничены версией Python 2.7 и набором установленных сторонних модулей(модули requests, cloudscraper, BeautifulSoup отсутствуют в окружении PLEX Media Server), теоретически их можно встроить в наш плагин, но из-за этого размер плагина возрастёт и в целом стабильность плагина снизится, а сложность тестирования поднимется. Так же не факт, что он будет работать на разных платформах(Windows, ARM)

ziemenz commented 4 years ago

Названия серий прекрасно тянутся с Кинопоиска или результаты оттуда не устраивают? Или есть еще какой-то контент, который нужно тянуть с Лостфильма?

ziemenz commented 4 years ago

Реализовать можно, но с учётом встраивания прокси это дело может очень затянуться

Akior commented 4 years ago

На самом деле, я попытался вспомнить все разы включения cloudflare protection. Один раз это попало на страницу авторизации, другой на страницу скачивания серии.

В общем можно реализовать и на обычном requests.

anvme commented 4 years ago

Реализовать можно, но с учётом встраивания прокси это дело может очень затянуться

По прокси я там сделал апдейт у амиротина в feature request) Есть отличное бесплатное решение для части юзеров