Reddit to kopalnia cennych danych dla firm, badaczy i programistów, którzy chcą gromadzić spostrzeżenia i szkolić modele sztucznej inteligencji. Jednak w 2023 roku Reddit pokrzyżował plany wielu osób, wprowadzając znaczne opłaty za dostęp do API. Na szczęście skrobanie sieci stanowi skuteczną alternatywę, która jest bardziej opłacalna i elastyczna. W tym szczegółowym przewodniku przeprowadzimy Cię przez proces pobierania danych z Reddita za pomocą Pythona i Selenium.
Po co Scrape Reddit w 2024 roku?
W kwietniu 2023 r. Reddit ogłosił, że zacznie pobierać wysokie opłaty za dostęp do API – 0,24 dolara za 1000 połączeń. Ta zmiana natychmiast sprawiła, że interfejs API stał się zbyt kosztowny w większości przypadków użycia. Wiele aplikacji, takich jak Apollo, które korzystały z interfejsu API, zostało zmuszonych do zamknięcia.
Jednak ogromna ilość przydatnych danych na Reddicie nie zniknęła nagle ani nie straciła na wartości. Ludzie nadal potrzebują do niego dostępu do analityki biznesowej, badań naukowych, szkolenia dużych modeli językowych i nie tylko. Skanowanie sieci jest obecnie najbardziej opłacalną i atrakcyjną metodą uzyskiwania tych danych na dużą skalę.
Oto niektóre z kluczowych zalet skrobania Reddita w porównaniu z korzystaniem z oficjalnego API:
Oszczędności – Scraping umożliwia gromadzenie danych Reddit bez płacenia wygórowanych opłat za API. Jedyne koszty dotyczą własnych zasobów obliczeniowych.
Większa elastyczność – dzięki skrobaniu możesz precyzyjnie kierować dokładnie te dane, których potrzebujesz, zamiast ograniczać się ograniczeniami interfejsu API. Dostosuj swój skrobak, aby ciągnął wybrane pola.
Dostęp do większej ilości danych – interfejsy API często ograniczają zakres dostępnych danych. Podczas scrapowania możesz uzyskać dostęp do wszelkich publicznych danych w witrynie, w tym informacji, które nie są przekazywane oficjalnymi kanałami.
Zatem w świecie post-API w roku 2024 przeglądanie stron internetowych będzie mądrym wyborem w zakresie gromadzenia danych z Reddita. Zagłębmy się w szczegóły techniczne, jak to zrobić w Pythonie!
Narzędzia potrzebne do zeskrobania Reddita
Aby skorzystać z tego samouczka, upewnij się, że masz następujące elementy:
- Zainstalowany Python 3.7+
- Python IDE (PyCharm, VS Code itp.)
- Przeglądarka internetowa Chrome
- ChromeDriver dla Selenium
Będziemy używać biblioteki Python Selenium do automatyzacji przeglądarki Chrome i pobierania danych z Reddita. Selen jest idealny, ponieważ może renderować dynamiczną zawartość JavaScript, która jest powszechna na stronach Reddit.
Będziesz także chciał skonfigurować środowisko wirtualne do zarządzania zależnościami dla projektu skrobania Reddit. Zrób to uruchamiając:
python -m venv env
source env/bin/activateNastępnie zainstaluj niezbędne pakiety Pythona:
pip install selenium webdriver-managerŚwietnie, wszystko gotowe! Zacznijmy budować skrobak Reddit.
Samouczek skrobania Reddit krok po kroku
Jako przykład pobierzemy dane z subreddita r/technology. Możesz jednak łatwo dostosować ten kod, aby pobierać posty i informacje z dowolnego publicznego subreddita.
Krok 1 – Skonfiguruj Selenium
Najpierw zaimportuj wymagane moduły Selenium i skonfiguruj Chrome tak, aby działał w trybie bezgłowym. Spowoduje to ukrycie interfejsu użytkownika przeglądarki, co oszczędza zasoby.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
options = Options()
options.headless = True
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()),
options=options)Podaj adres URL subreddita, który chcesz zeskrobać. W tym przypadku zajmiemy się najpopularniejszymi postami z ostatniego tygodnia na temat r/technologii.
url = "https://www.reddit.com/r/technology/top/?t=week"
driver.get(url)Krok 3 – Zeskrob metadane Subreddita
U góry strony subreddita znajdują się przydatne metadane. Zeskrobmy nazwę, opis, datę utworzenia i liczbę członków.
subreddit = {}
subreddit[‘name‘] = driver.find_element(By.TAG_NAME, ‘h1‘).text
subreddit[‘description‘] = driver.find_element(By.XPATH,
"//div[@data-testid=‘DescriptionComment‘]").text
subreddit[‘created‘] = driver.find_element(By.XPATH,
"//span[contains(text(), ‘Created‘)]/following-sibling::span").text
subreddit[‘members‘] = driver.find_element(By.XPATH,
"//div[@id=‘MembershipButton‘]//span[@class=‘_vaFo96phV6L5Hltvwcox‘]").text Krok 4 – Zeskrob dane pocztowe
Następnie zbierzmy dane o każdym z poszczególnych postów w subreddicie. Otrzymamy tytuł, autora, liczbę głosów pozytywnych, liczbę komentarzy i docelowy adres URL najpopularniejszych postów.
Sprawdź kod HTML, aby znaleźć elementy zawierające te dane. Reddit utrudnia to, używając losowo generowanych klas CSS. Ale możemy niezawodnie wybierać elementy, używając atrybutów semantycznych, takich jakdata-testid.
posts = []
post_elems = driver.find_elements(By.CSS_SELECTOR,
‘[data-testid="post-container"]‘)
for post in post_elems:
post_data = {}
post_data[‘title‘] = post.find_element(By.TAG_NAME, ‘h3‘).text
post_data[‘author‘] = post.find_element(By.CSS_SELECTOR,
‘[data-testid="post_author_link"]‘).text
post_data[‘upvotes‘] = post.find_element(By.XPATH,
"//div[@data-click-id=‘upvote‘]/following-sibling::div").text
post_data[‘comments‘] = post.find_element(By.XPATH,
"//a[@data-click-id=‘comments‘]/span").text
post_data[‘url‘] = post.find_element(By.CSS_SELECTOR,
‘[data-testid="outbound-link"]‘).get_attribute(‘href‘)
posts.append(post_data)Dodaj dane tego wpisu do słownika subreddita:
subreddit[‘posts‘] = postsKrok 5 – Wyprowadź zeskrobane dane
Na koniec zapisz zeskrobane dane subreddita w pliku JSON, aby móc je łatwo wykorzystać w innych aplikacjach. Ładnie wydrukuj JSON, aby był bardziej czytelny dla człowieka.
import json
with open(‘subreddit_data.json‘, ‘w‘) as f:
json.dump(subreddit, f, indent=4)Składanie tego wszystkiego razem
Oto kompletny skrypt Pythona do pobierania danych z subreddita Reddita:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import json
options = Options()
options.headless = True
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()),
options=options)
url = "https://www.reddit.com/r/technology/top/?t=week"
driver.get(url)
subreddit = {}
subreddit[‘name‘] = driver.find_element(By.TAG_NAME, ‘h1‘).text
subreddit[‘description‘] = driver.find_element(By.XPATH, "//div[@data-testid=‘DescriptionComment‘]").text
subreddit[‘created‘] = driver.find_element(By.XPATH, "//span[contains(text(), ‘Created‘)]/following-sibling::span").text
subreddit[‘members‘] = driver.find_element(By.XPATH, "//div[@id=‘MembershipButton‘]//span[@class=‘_vaFo96phV6L5Hltvwcox‘]").text
posts = []
post_elems = driver.find_elements(By.CSS_SELECTOR, ‘[data-testid="post-container"]‘)
for post in post_elems:
post_data = {}
post_data[‘title‘] = post.find_element(By.TAG_NAME, ‘h3‘).text
post_data[‘author‘] = post.find_element(By.CSS_SELECTOR, ‘[data-testid="post_author_link"]‘).text
post_data[‘upvotes‘] = post.find_element(By.XPATH, "//div[@data-click-id=‘upvote‘]/following-sibling::div").text
post_data[‘comments‘] = post.find_element(By.XPATH, "//a[@data-click-id=‘comments‘]/span").text
post_data[‘url‘] = post.find_element(By.CSS_SELECTOR, ‘[data-testid="outbound-link"]‘).get_attribute(‘href‘)
posts.append(post_data)
subreddit[‘posts‘] = posts
with open(‘subreddit_data.json‘, ‘w‘) as f:
json.dump(subreddit, f, indent=4)
driver.quit()Uruchom ten skrypt, a otrzymasz ładnie sformatowany pliksubreddit_data.jsonplik zawierający wszystkie zeskrobane dane Reddita. Możesz teraz analizować dane według własnego uznania!
Zaawansowane techniki skrobania Reddita na dużą skalę
Powyższy podstawowy skrypt działa dobrze w przypadku zeskrobywania pojedynczego subreddita. Jeśli jednak musisz zebrać dane Reddit na większą skalę, możesz napotkać pewne wyzwania:
Ograniczanie szybkości i bany IP – Reddit ograniczy lub zablokuje Twoje IP, jeśli zbyt szybko wykonasz zbyt wiele żądań. Może to spowodować zatrzymanie skrobania.
CAPTCHA i inne środki zapobiegające botom – Reddit stosuje różne zabezpieczenia, aby zatrzymać boty i skrobaki. Mogą zostać wyświetlone kody CAPTCHA, które uniemożliwiają dalsze skrobanie.
Niskie prędkości zgarniania – Selen jest niezawodny, ale stosunkowo powolny w porównaniu do innych metod zgarniania. Pobieranie dużych subredditów może być czasochłonne.
Aby zeskrobać dane Reddit na dużą skalę, musisz rozwiązać te problemy. Oto kilka wskazówek:
- Używaj rotacyjnych serwerów proxy, aby uniknąć limitów stawek i zakazów. Serwery proxy umożliwiają wysyłanie żądań z wielu różnych adresów IP. Automatyzacja rotacji serwerów proxy pozwala na ciągłe przeglądanie bez napotykania przeszkód.
Szukaj szybkich, bezpiecznych i etycznych serwerów proxy od renomowanych dostawców. Na podstawie przeprowadzonych przeze mnie recenzji i testów porównawczych przedstawiam niektóre z najlepszych usług proxy do rozważenia:
- Jasne dane
- Prawa własności intelektualnej
- Pełnomocnik-sprzedawca
- SOAX
- Inteligentne proxy
- Proxy-tanie
- HydraProxy
Obsługuj CAPTCHA automatycznie, korzystając z usługi takiej jak 2Captcha lub Anticaptcha. Te niedrogie usługi działają za pośrednictwem interfejsu API, aby rozwiązać kody CAPTCHA za Ciebie, dzięki czemu możesz kontynuować skrobanie.
Zoptymalizuj prędkość i wydajność zgarniania, uruchamiając wiele zgarniaczy równolegle. Możesz wdrożyć skrobak Reddit na platformie takiej jak Docker Swarm lub Kubernetes, aby uruchamiać wiele instancji jednocześnie i szybciej zbierać dane.
Alternatywnie możesz użyć specjalnie zaprojektowanego narzędzia do skrobania, takiego jak przeglądarka skrobania firmy Bright Data. Automatycznie obsługuje CAPTCHA i środki zapobiegające skrobaniu, jednocześnie umożliwiając skrobanie szybciej niż Selenium.
Podsumowanie
Skrobanie sieci jest obecnie najpopularniejszą metodą gromadzenia danych Reddit, ponieważ interfejs API staje się zbyt kosztowny. Dzięki skryptowi Pythona i technikom opisanym w tym przewodniku jesteś dobrze przygotowany do niezawodnego i wydajnego pobierania dużych ilości cennych danych z Reddita.
Pamiętaj, zawsze zachowuj szacunek podczas skrobania i unikaj przeciążania serwerów Reddita zbyt dużą liczbą żądań na raz. Użyj serwerów proxy i dostosuj swój współczynnik skrobania, aby być dobrym obywatelem.
Jeśli chcesz pominąć trudny proces samodzielnego skrobania Reddit, możesz także kupić gotowe zestawy danych Reddit z różnych źródeł online. Jednak zbudowanie własnego skrobaka zapewnia maksymalną elastyczność i najświeższe dane.
Teraz masz wszystko, czego potrzebujesz, aby wykorzystać bogactwo danych na Reddicie w swoich projektach biznesowych, badawczych lub programistycznych. Więc na co czekasz? Zacznij skrobać Reddita za pomocą Pythona już dziś!













