Kompletny przewodnik po skrobaniu Reddita za pomocą Pythona w 2024 r

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:

  1. 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.

  2. 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.

  3. 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/activate

Nastę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)

Krok 2 – Przejdź do Subreddita

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‘] = posts

Krok 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:

  1. 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.

  2. 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.

  3. 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:

  1. Jasne dane
  2. Prawa własności intelektualnej
  3. Pełnomocnik-sprzedawca
  4. SOAX
  5. Inteligentne proxy
  6. Proxy-tanie
  7. 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ś!

Related Posts