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ć:
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.
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.
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)
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.
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
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
})
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")
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")
Przed skrobaniem jakiejkolwiek strony internetowej należy wziąć pod uwagę kwestie etyczne i prawne:
Zawsze pamiętaj o zasadach i używaj skrobania stron internetowych do legalnych celów.
Komentarze: 0