Jak zeskrobać dane z IMDB za pomocą Pythona

Komentarze: 0

W dzisiejszym świecie wyodrębnianie danych z internetowych platform społecznościowych, takich jak IMDB, może być skuteczną drogą do gromadzenia bardzo potrzebnych informacji związanych z filmami w celach badawczych lub dla przyjemności. W tym samouczku przejdziemy przez skrobanie 250 najlepszych filmów na IMDB za pomocą Pythona i wyodrębnimy szczegóły, takie jak tytuły filmów, streszczenia filmów, oceny, gatunki i inne.

Podczas skrobania stron internetowych, takich jak IMDB, ważne jest, aby symulować zachowanie prawdziwego użytkownika, aby zminimalizować ryzyko wykrycia i zapewnić pomyślne pobieranie danych. Oto kilka strategii, które można zastosować:

  1. Unikaj blokowania adresów IP: Strony internetowe często ograniczają liczbę żądań, które można wykonać z jednego adresu IP, aby zapobiec skrobaniu. Korzystając z serwerów proxy, można rozłożyć żądania na wiele adresów IP, zmniejszając ryzyko ich zablokowania.
  2. Zapewnienie anonimowości: Serwery proxy maskują prawdziwy adres IP użytkownika, co nie tylko pomaga chronić jego prywatność, ale także utrudnia stronom internetowym śledzenie działań związanych ze scrapingiem.
  3. Zgodność z ograniczeniami prędkości: Dystrybucja żądań za pośrednictwem wielu serwerów proxy może pomóc w zarządzaniu częstotliwością zapytań, pozostając w granicach szybkości witryny i zmniejszając prawdopodobieństwo uruchomienia środków zapobiegających skrobaniu.
  4. Omijanie podejrzeń serwera: Włączenie nagłówków naśladujących te z typowej przeglądarki, takich jak User-Agent, może sprawić, że żądania scrapingu będą wyglądać bardziej jak normalne żądania użytkownika. Może to uniemożliwić serwerowi oznaczenie twoich działań jako podejrzanych.

Krok 1: Przygotowanie scrapera

W tym samouczku użyjemy biblioteki żądań Pythona do pobierania treści internetowych, lxml do analizowania HTML i opcjonalnie biblioteki json do obsługi sformatowanych danych w razie potrzeby. Najpierw zainstaluj wymagane biblioteki.

Instalacja bibliotek

Przed rozpoczęciem należy zainstalować niezbędne biblioteki Pythona. Uruchom następujące polecenie w terminalu, aby je zainstalować:


pip install requests lxml

Biblioteki te będą używane do wykonywania żądań HTTP, analizowania zawartości HTML i przetwarzania wyodrębnionych danych.

Konfiguracja nagłówków żądań HTTP

Aby nasze żądania przypominały te z prawdziwej przeglądarki internetowej, kluczowe jest odpowiednie skonfigurowanie nagłówków HTTP. Oto przykład konfiguracji tych nagłówków w skrypcie:


import requests

headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',  # Nagłówek Nie śledź
    'pragma': 'no-cache',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}

response = requests.get('https://www.imdb.com/chart/top/', headers=headers)

Ustawianie serwerów proxy

Serwery proxy są przydatne w przypadku skrobania na dużą skalę. Pomagają one uniknąć zablokowania poprzez dystrybucję żądań na wiele adresów IP. Oto jak można włączyć serwer proxy:


proxies = {
    "http": "http://your_proxy_server",
    "https": "https://your_proxy_server"
}

response = requests.get('https://www.imdb.com/chart/top/', headers=headers, proxies=proxies)

Zastąp "your_proxy_server" rzeczywistymi danymi serwera proxy, do których masz dostęp. Gwarantuje to, że adres IP nie zostanie ujawniony i pomoże uniknąć zablokowania.

Krok 2: Analizowanie zawartości HTML

Po pobraniu zawartości strony internetowej musimy ją przeanalizować, aby wyodrębnić szczegóły filmu. Użyjemy lxml do parsowania HTML i json do obsługi danych strukturalnych:


from lxml.html import fromstring
import json

# Parsowanie odpowiedzi HTML
parser = fromstring(response.text)

# Wyodrębnij dane JSON-LD (dane strukturalne) ze znacznika skryptu
raw_data = parser.xpath('//script[@type="application/ld+json"]/text()')[0]
json_data = json.loads(raw_data)

# Teraz mamy ustrukturyzowane dane filmu w formacie JSON

Krok 3: Wyodrębnianie szczegółów filmu

Strona IMDB Top 250 zawiera ustrukturyzowane dane osadzone w kodzie HTML, do których można łatwo uzyskać dostęp za pomocą XPath i przeanalizować je jako JSON. Wyodrębnimy szczegóły filmu, takie jak nazwa, opis, oceny, gatunki i inne:


movies_details = json_data.get('itemListElement')

# Pętla przez dane filmu
movies_data = []
for movie in movies_details:
    movie_type = movie['item']['@type']
    url = movie['item']['url']
    name = movie['item']['name']
    description = movie['item']['description']
    image = movie['item']['image']
    bestRating = movie['item']['aggregateRating']['bestRating']
    worstRating = movie['item']['aggregateRating']['worstRating']
    ratingValue = movie['item']['aggregateRating']['ratingValue']
    ratingCount = movie['item']['aggregateRating']['ratingCount']
    contentRating = movie['item'].get('contentRating')
    genre = movie['item']['genre']
    duration = movie['item']['duration']
    
    # Dołącz dane każdego filmu do listy
    movies_data.append({
        'movie_type': movie_type,
        'url': url,
        'name': name,
        'description': description,
        'image': image,
        'bestRating': bestRating,
        'worstRating': worstRating,
        'ratingValue': ratingValue,
        'ratingCount': ratingCount,
        'contentRating': contentRating,
        'genre': genre,
        'duration': duration
    })

Krok 4: Przechowywanie danych

Po wyodrębnieniu danych ważne jest, aby zapisać je w formacie łatwym do analizy. W tym przypadku zapiszemy je w pliku CSV przy użyciu biblioteki pandas:


import pandas as pd

# Konwersja listy filmów do pandas DataFrame
df = pd.DataFrame(movies_data)

# Zapisywanie danych w pliku CSV
df.to_csv('imdb_top_250_movies.csv', index=False)

print("IMDB Top 250 movies data saved to imdb_top_250_movies.csv")

Kompletny kod

Oto kompletny kod do skrobania 250 najlepszych filmów IMDB:


import requests
from lxml.html import fromstring
import json
import pandas as pd

# Definiowanie nagłówków dla żądania
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}

# Opcjonalnie można skonfigurować serwery proxy
proxies = {
    "http": "http://your_proxy_server",
    "https": "https://your_proxy_server"
}

# Wyślij prośbę do strony IMDB Top 250
response = requests.get('https://www.imdb.com/chart/top/', headers=headers, proxies=proxies)

# Parsowanie odpowiedzi HTML
parser = fromstring(response.text)

# Wyodrębnianie danych JSON-LD
raw_data = parser.xpath('//script[@type="application/ld+json"]/text()')[0]
json_data = json.loads(raw_data)

# Wyodrębnij szczegóły filmu
movies_details = json_data.get('itemListElement')

movies_data = []
for movie in movies_details:
    movie_type = movie['item']['@type']
    url = movie['item']['url']
    name = movie['item']['name']
    description = movie['item']['description']
    image = movie['item']['image']
    bestRating = movie['item']['aggregateRating']['bestRating']
    worstRating = movie['item']['aggregateRating']['worstRating']
    ratingValue = movie['item']['aggregateRating']['ratingValue']
    ratingCount = movie['item']['aggregateRating']['ratingCount']
    contentRating = movie['item'].get('contentRating')
    genre = movie['item']['genre']
    duration = movie['item']['duration']
    
    movies_data.append({
        'movie_type': movie_type,
        'url': url,
        'name': name,
        'description': description,
        'image': image,
        'bestRating': bestRating,
        'worstRating': worstRating,
        'ratingValue': ratingValue,
        'ratingCount': ratingCount,
        'contentRating': contentRating,
        'genre': genre,
        'duration': duration
    })

# Zapisywanie danych w pliku CSV
df = pd.DataFrame(movies_data)
df.to_csv('imdb_top_250_movies.csv', index=False)
print("IMDB Top 250 movies data saved to imdb_top_250_movies.csv")

Uwagi etyczne

Przed skrobaniem jakiejkolwiek strony internetowej należy wziąć pod uwagę kwestie etyczne i prawne:

  • Przestrzegaj pliku robots.txt: Sprawdź plik robots.txt IMDB, aby zobaczyć, które części witryny są dozwolone do skrobania. Zawsze przestrzegaj zasad witryny.
  • Unikaj przeciążania serwera: Scrapuj dane odpowiedzialnie, ograniczając częstotliwość żądań, aby uniknąć niepotrzebnego obciążania serwera.
  • Przestrzegaj warunków świadczenia usług: Upewnij się, że scraping nie narusza warunków korzystania z usługi IMDB.

Zawsze pamiętaj o zasadach i używaj skrobania stron internetowych do legalnych celów.

Komentarze:

0 komentarze