Собирать материалы из Интернета — это весело, особенно когда вы получаете что-то полезное.

Говоря о полезности, может потребоваться некоторая ручная работа, чтобы получить что-то ценное из Интернета.

Ручная работа трудоемка и трудоемка. Разработчики любят обратное. Автоматизация.

Теперь давайте соберем ценные данные с Reddit и получим посты, рекламирующие бесплатные вещи. Это могут быть бесплатные курсы, бесплатные продукты или что-то еще.

В этом руководстве вы будете использовать свой терминал для получения данных из Reddit. Я объясню, как собирать субреддиты, такие как Udemy, чтобы получать последние купоны, опубликованные пользователями Reddit. Я настроил его так, чтобы вы могли применить его к любому другому субреддиту.

Минимальный пример

Давайте рассмотрим это шаг за шагом и посмотрим, как очистить Reddit.

Во-первых, нужны ли вам учетные данные API для получения такой информации? Нет. Вам нужно только знать желаемую конечную точку. Затем вы используете утилиту командной строки, чтобы получить запрос от этой конечной точки, используя curl или wget.

$ curl -sA 'udemy subreddit scraper' 'https://www.reddit.com/r/udemy/top.json?t=month'

Эта строка возвращает JSON основных данных за последний месяц из субреддита udemy.

Вы можете использовать curl со следующими параметрами:

  • -s скачать в тихом режиме
  • -A чтобы добавить пользовательский агент в виде строки

Получение заголовков сообщений сабреддита

Если вы хотите увидеть иерархию этого формата JSON, используйте программу jq в конце:

$ curl -sA 'udemy subreddit scraper' 'https://www.reddit.com/r/udemy/top.json?t=month' | jq '.'

Давайте будем более конкретными и получим заголовки этих самых популярных сообщений Reddit.

Для этого получите значение ключа title. Он находится внутри родительского data, который является листом дочернего списка хэшей. дочерние элементы буквально являются дочерними элементами родительских данных.

$ curl -sA 'udemy subreddit scraper' 'https://www.reddit.com/r/udemy/top.json?t=month' | jq '.data.children[].data.title'

Получение бесплатных вещей

Теперь давайте отфильтруем заголовок по ключевому слову Free.

Предположим, что бесплатные вещи существуют только в том случае, если автор Reddit явно пишет ключевое слово «Бесплатно» в заголовке:

$ curl -sA 'udemy subreddit scraper' 'https://www.reddit.com/r/udemy/top.json?t=month' | jq '.data.children[].data | select(.title|test("Free")).title'
"Top 30 Udemy Paid Courses For Free With Certificate 19 March 2022"
"Best 50 FreeCourses for 18 March 2022"
"Best 44 Udemy Paid Courses For Free With Certificate 12 March 2022"
"Free Courses for 05 March 2022"
"Hurry up, limited time only ! 40 Free Courses for 04 March 2022"
"Udemy Paid Courses For Free With Certificate 06 March 2022"
"3D modeling for Free"

Здесь вы использовали select для фильтрации определенного значения дочернего элемента title. Вы передали его с помощью функции test для работы с регулярным выражением. Это регулярное выражение включало слово Свободное с любым символом после него.

Но у этой команды есть проблема. У нас нет ни одного результата по заголовку, в котором есть слово БЕСПЛАТНО (с заглавной буквы) или любой вариант этого слова. Например, free, FRee, FRee и FREE не возвращаются этой командой. Поэтому мы можем исправить это, добавив нечувствительный к регистру аргумент "i" в функцию test.

$ curl -sA 'udemy subreddit scraper' 'https://www.reddit.com/r/udemy/top.json?t=month' | jq '.data.children[].data | select(.title|test("free"; "i")).title'
"Top 30 Udemy Paid Courses For Free With Certificate 19 March 2022"
"Top 50 Premium Courses FREE for Wednesday, March 16, 2022"
"Best 50 FreeCourses for 18 March 2022"
"Best 44 Udemy Paid Courses For Free With Certificate 12 March 2022"
"Free Courses for 05 March 2022"
"Hurry up, limited time only ! 40 Free Courses for 04 March 2022"
"Udemy Paid Courses For Free With Certificate 06 March 2022"
"Browse Udemy courses that have gone free Today"
"3D modeling for Free"

Теперь у вас есть больше результатов, содержащих другие варианты. Даже если в этом сабреддите есть бесплатные ключевые слова и любые другие варианты для нашего случая, вы можете это увидеть.

Давайте настроим его и поместим в bash-скрипт:

SUBREDDIT="$1"
curl -sA 'subreddit reader' \
'https://www.reddit.com/r/'${SUBREDDIT}'/top.json?t=month' \
| jq '.data.children[].data | select(.title|test("free"; "i")).title'

У вас есть имя субреддита в качестве аргумента. Сохраните этот скрипт bash, например, как top_free.sh, а затем введите название сабреддита, из которого вы хотите извлечь бесплатные материалы:

$ chmod u+x top_free.sh # give access to that shell script
$ ./top_free.sh udemy   # replace udemy with whatever subreddit you want

Более настраиваемая командная строка

Давайте даже создадим больше настроек в скрипте bash. Добавьте параметр запроса в качестве переменной аргумента, которую вы хотите, вместо жесткого кодирования «бесплатно»:

SUBREDDIT="$1"
QUERY="${2:-free}"
curl -sA 'subreddit reader' \
'https://www.reddit.com/r/'${SUBREDDIT}'/top.json?t=month' \
| jq '.data.children[].data | select(.title|test("'"${QUERY}"'"; "i")) | .title'

Расширение параметра ${2:-free} означает, что запрос будет вторым параметром. Если он равен нулю, запрос будет назначен слову бесплатно.

Давайте сохраним этот bash-скрипт как top_stuff.sh и посмотрим заголовки, в которых есть ключевое слово courses:

$ chmod u+x top_stuff.sh
$ ./top_stuff.sh udemy courses
"Winning at Udemy: What the most successful courses have in common"
"Top 30 Udemy Paid Courses For Free With Certificate 19 March 2022"
"Top 50 Premium Courses FREE for Wednesday, March 16, 2022"
"Best 50 FreeCourses for 18 March 2022"
"Best 44 Udemy Paid Courses For Free With Certificate 12 March 2022"
"Free Courses for 05 March 2022"
"https://www.reddit.com/r/Udemy/comments/t793wh/free_courses_for_05_march_2022/"
"Hurry up, limited time only ! 40 Free Courses for 04 March 2022"
"Best Courses for 10 March 2022"
"40 Courses for 09 March 2022 added Today Wednesday March 9, 2022 Don't miss out on these exciting offers"
"Best Courses for 07 March 2022"
"Udemy Paid Courses For Free With Certificate 06 March 2022"
"Browse Udemy courses that have gone free Today"
"Do all courses go on sale at some point, or can some Sellers request not to be included in sales?"

Получение заголовков и URL-адресов

Теперь у нас есть желаемые названия. Почему бы нам не вернуть URL-адрес каждого заголовка, чтобы мы могли щелкнуть по нему и просмотреть этот пост и комментарии в сабреддите?

SUBREDDIT="$1"
QUERY="${2:-free}"
curl -sA 'subreddit reader' \
'https://www.reddit.com/r/'${SUBREDDIT}'/top.json?t=month' \
| jq '.data.children[].data | select(.title|test("'"${QUERY}"'"; "i")) | {title, url} | .[]'

Здесь вы только что добавили оба дочерних элемента: title и url, используя Object Construction в jq документации.

Когда вы снова запустите эту команду, вы получите:

"Winning at Udemy: What the most successful courses have in common"
"https://www.reddit.com/r/Udemy/comments/tgj25n/winning_at_udemy_what_the_most_successful_courses/"
"Top 30 Udemy Paid Courses For Free With Certificate 19 March 2022"
"https://www.reddit.com/r/Udemy/comments/thu0er/top_30_udemy_paid_courses_for_free_with/"
"Top 50 Premium Courses FREE for Wednesday, March 16, 2022"
"https://www.reddit.com/r/Udemy/comments/tfev3o/top_50_premium_courses_free_for_wednesday_march/"
"Best 50 FreeCourses for 18 March 2022"
"https://www.reddit.com/r/Udemy/comments/tgybkw/best_50_freecourses_for_18_march_2022/"
"Best 44 Udemy Paid Courses For Free With Certificate 12 March 2022"
"https://www.reddit.com/r/Udemy/comments/tcf5x6/best_44_udemy_paid_courses_for_free_with/"
"Free Courses for 05 March 2022"
"https://www.reddit.com/r/Udemy/comments/t793wh/free_courses_for_05_march_2022/"
"Hurry up, limited time only ! 40 Free Courses for 04 March 2022"
"https://www.reddit.com/r/Udemy/comments/t6fzna/hurry_up_limited_time_only_40_free_courses_for_04/"
"Best Courses for 10 March 2022"
"https://www.reddit.com/r/Udemy/comments/tavdbg/best_courses_for_10_march_2022/"
"40 Courses for 09 March 2022 added Today Wednesday March 9, 2022 Don't miss out on these exciting offers"
"https://www.reddit.com/r/Udemy/comments/ta4lct/40_courses_for_09_march_2022_added_today/"
"Best Courses for 07 March 2022"
"https://www.reddit.com/r/Udemy/comments/t8mesy/best_courses_for_07_march_2022/"
"Udemy Paid Courses For Free With Certificate 06 March 2022"
"https://www.reddit.com/r/Udemy/comments/t7xruf/udemy_paid_courses_for_free_with_certificate_06/"
"Browse Udemy courses that have gone free Today"
"https://www.reddit.com/r/Udemy/comments/te3f97/browse_udemy_courses_that_have_gone_free_today/"
"Do all courses go on sale at some point, or can some Sellers request not to be included in sales?"
"https://www.reddit.com/r/Udemy/comments/t4a0d6/do_all_courses_go_on_sale_at_some_point_or_can/"

Последние мысли

В этом уроке вы увидели, как собирать лучшие ежемесячные бесплатные материалы из любого сабреддита. Вы получили заголовок этого сообщения и URL-адрес, чтобы иметь возможность просматривать его и участвовать в сообществе, если хотите.

Мы также делаем его обобщенным, чтобы включить любое ключевое слово, которое вы хотите найти, в желаемом субреддите.

Пожалуйста, дайте мне знать, если у вас есть дополнительные вопросы! или если вы хотите больше парсинга постов, просто прокомментируйте ниже!

Наслаждаться!

Вас может заинтересовать этот урок, в котором я использовал jq