Это небольшой бокомый проект, который я сделал, чтобы попробовать искажать изображения из нитей Reddit. Есть несколько разных подпудритших, обсуждающих шоу, специально /r/anime
Где пользователи добавляют скриншоты много эпизодов. И я подумал, что будет круто, чтобы увидеть, сколько усилий было бы автоматически сопоставлять список этих скриншотов из нити и отображать их в простой галерее. Результат выглядел так
Осторожность
PRAW Это обертка Python Reddit API, что обеспечивает хороший набор привязки, чтобы поговорить с Reddit.
Чтобы соскрести Reddit, вам нужны учетные данные. Способ выработки учетных данных спрятаны на https://www.reddit.com/prefs/apps Где вы должны зарегистрировать новое «приложение» с Reddit. Подключение так же просто, как
import praw reddit = praw.Reddit(client_id='id', \ client_secret='secret', \ user_agent='useragent', \ username='username', \ password='DevToIsCool')
Пересечение Reddit производится простым на API, например, печатая все комментарии в потоке.
submission = reddit.submission(url="https://reddit.com/r/abcde") for comment in submission.comments.list(): print(comment)
Найти ссылки
99% изображений, которые я искал, отправлены в Imgur, поэтому я просто подобрал на тех. Я использовал регулярное выражение для извлечения ссылок. Я всегда рекомендую использовать инструмент, как Regex101 Это позволяет очень легко отлаживать ваши регулярные выражения, поскольку они могут быть красивыми изгибающими мозгами.
REGEX_TEST = r"((http|https)://i.imgur.com/.+?(jpg|png))" p = re.compile(REGEX_TEST, re.IGNORECASE)
Проверьте, существует ли изображение
Одной из проблем, которые я обнаружил, было мертвые ссылки на изображения, поэтому я создал простой помощник, который проверяет состояние_Code для этой ссылки.
# Check if a link still is exists def checkLinkActive(url): request = requests.head(url) if request.status_code == 200: return True else: return False
Получение миниатюр
Чтобы сохранить пропускную способность и ваши мобильные данные, которые я хотел вернуть меньшую версию изображения. В Imgur Вы можете добавить размер персонажа на URL, чтобы получить его по другому размеру , например, « л «Большой и» S ‘ маленький.
# Add a letter to an imgur url to make a small thumbnail def getImgurThumbnail(url, size): startStr = url[:(len(url)-4)] endStr = url[len(url)-4:] return startStr + size + endStr
Положить все вместе
Положить все эти биты вместе ты получаешь
def getImages(url): submission = reddit.submission(url=url) # Tell API to return all comment in thread, results are # paginated by default submission.comments.replace_more(limit=None) # Create RegEx object for matching images REGEX_TEST = r"((http|https)://i.imgur.com/.+?(jpg|png))" p = re.compile(REGEX_TEST, re.IGNORECASE) imageMatches = [] for comment in submission.comments.list(): matches = p.findall(comment.body) for match in matches: if checkLinkActive(match[0]): imageMatches.append( {"image": match[0], "thumbnail": getImgurThumbnail(match[0], "m")} ) return imageMatches
Пробуя это
Я решил устроить быструю демонстрацию этого, используя функцию Azure для размещения моей новой функции и простой веб-формы, чтобы люди попробовали ее. Просто скопируйте и вставьте URL Reddit и функция вернет любые изображения.
Демо-приложение использует Bulma для взгляда и чувствовать, а немного Jquery для загрузки страницы.
Если вы хотите пойти, Вы можете играть на моем сайте здесь Отказ
Я буду искать в будущей статье при предоставлении поиска шоу имени вместо того, чтобы вставить индивидуальные URL-адреса эпизода. Счастливый reddit scraping!
Оригинал: “https://dev.to/sg3141592/scraping-images-from-reddit-threads-in-python-3pke”