Wie man Medium-Artikel mit Python scrapen kann

Bemerkungen: 0

Das Extrahieren von Artikeln aus Medium kann für Zwecke wie die Bewertung von Inhalten, das Sammeln von Daten oder die Überwachung von Autoren und ihren Werken von größter Bedeutung sein. In diesem Tutorial lernen wir, wie man Medium - eine Artikel-Website für Autoren - mit der Programmiersprache Python scrapen kann. Wir werden besprechen, wie Daten wie der Titel des Artikels, der Name des Autors, der Name der Veröffentlichung und der Textkörper selbst aus einer gegebenen Web-URL eines Medium-Artikels extrahiert werden können.

Voraussetzungen

Für dieses Tutorial werden wir diesen Artikel auf Medium auslesen: "9 Python Built-in Decorators That Optimize Your Code Significant".

Bevor Sie beginnen, installieren Sie die folgenden Bibliotheken:

  • Requests: Zum Senden von HTTP-Anfragen an Medium.
  • lxml: Zum Parsen von HTML-Inhalten.
  • Pandas: Zum Speichern der Daten in einer CSV-Datei.

Installieren Sie sie mit den folgenden Befehlen:


pip install requests
pip install lxml 
pip install pandas

Die Bedeutung von Kopfzeilen und Proxys verstehen

Medium setzt Techniken zur Bot-Erkennung ein, um unautorisiertes Scraping zu verhindern. Korrekte Header und Proxys sind entscheidend für die Vermeidung von Bot-Erkennung und für verantwortungsvolles Scraping.

Kopfzeilen: Diese simulieren eine Anfrage, als ob sie von einem echten Browser käme. Sie enthalten Informationen wie den Browsertyp, akzeptierte Inhaltstypen und das Caching-Verhalten.


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',
    'priority': 'u=0, i',
    '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',
}

Proxies: Proxies können Ihre IP-Adresse maskieren, indem sie sie regelmäßig wechseln, um die Wahrscheinlichkeit zu verringern, dass die Anfragen von Medium blockiert werden. Hier ist ein Beispiel für die Verwendung mit IP-Adressen-Authentifizierung:


proxies = {
    'http': 'IP:PORT',
    'https': 'IP:PORT'
}

response = requests.get(
 'https://medium.com/techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017',
    headers=headers,
    proxies=proxies
)

Senden einer Anfrage an Medium

So richten Sie die Kopfzeilen ein und senden eine Anfrage an die URL des Artikels:


import requests

# Header, um eine echte Browser-Anfrage zu simulieren
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',
    'priority': 'u=0, i',
    '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',
}

url = 'https://medium.com/techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017'
response = requests.get(url, headers=headers)

Daten extrahieren

Sobald wir den Seiteninhalt haben, können wir ihn analysieren und relevante Informationen extrahieren.

HTML-Inhalt analysieren

Wir werden lxml verwenden, um die HTML-Antwort zu analysieren und bestimmte Elemente zu extrahieren. So geht's:


from lxml.html import fromstring

parser = fromstring(response.text)

# Daten extrahieren
title = parser.xpath('//h1[@data-testid="storyTitle"]/text()')[0]
author = parser.xpath('//a[@data-testid="authorName"]/text()')[0]
publication_name = parser.xpath('//a[@data-testid="publicationName"]/p/text()')[0]
publication_date = parser.xpath('//span[@data-testid="storyPublishDate"]/text()')[0]
content = '\n '.join(parser.xpath('//div[@class="ci bh ga gb gc gd"]/p/text()'))
auth_followers = parser.xpath('//span[@class="pw-follower-count bf b bg z bk"]/a/text()')[0]
sub_title = parser.xpath('//h2[@id="1de6"]/text()')[0]

Jetzt erstellen wir ein Wörterbuch, das alle extrahierten Daten enthält. Das erleichtert das Speichern in einer CSV-Datei.


# Daten in einem Wörterbuch speichern
article_data = {
    'Title': title,
    'Author': author,
    'Publication': publication_name,
    'Date': publication_date,
    'Followers': auth_followers,
    'Subtitle': sub_title,
    'Content': content,
}

print(article_data)

Speichern von Daten in einer CSV-Datei

Zum Schluss speichern wir die Daten in einer CSV-Datei, um sie weiter zu analysieren oder aufzubewahren.


import pandas as pd

# Wörterbuch in DataFrame umwandeln und als CSV speichern
df = pd.DataFrame([article_data])
df.to_csv('medium_article_data.csv', index=False)
print("Data saved to medium_article_data.csv")

Vollständiger Code

Hier ist der komplette Code zum Scrapen der Medium-Artikeldaten:


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

# Kopfzeilen zur Nachahmung eines Browsers
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',
    'priority': 'u=0, i',
    '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',
}


proxies = {
    'http': 'IP:PORT',
    'https': 'IP:PORT'
}

# Anfordern der Seite
url = 'https://medium.com/techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017'
response = requests.get(url, headers=headers, proxies=proxies)

# Parsen der Seite
parser = fromstring(response.text)

# Daten extrahieren
title = parser.xpath('//h1[@data-testid="storyTitle"]/text()')[0]
author = parser.xpath('//a[@data-testid="authorName"]/text()')[0]
publication_name = parser.xpath('//a[@data-testid="publicationName"]/p/text()')[0]
publication_date = parser.xpath('//span[@data-testid="storyPublishDate"]/text()')[0]
content = '\n '.join(parser.xpath('//div[@class="ci bh ga gb gc gd"]/p/text()'))
auth_followers = parser.xpath('//span[@class="pw-follower-count bf b bg z bk"]/a/text()')[0]
sub_title = parser.xpath('//h2[@id="1de6"]/text()')[0]

# Speichern von Daten
article_data = {
    'Title': title,
    'Author': author,
    'Publication': publication_name,
    'Date': publication_date,
    'Followers': auth_followers,
    'Subtitle': sub_title,
    'Content': content,
}

# In CSV speichern
df = pd.DataFrame([article_data])
df.to_csv('medium_article_data.csv', index=False)
print("Data saved to medium_article_data.csv")

Das Scraping von Inhalten von Medium sollte verantwortungsvoll erfolgen. Eine übermäßige Belastung der Server durch Anfragen kann die Leistung des Dienstes beeinträchtigen, und das Scraping von Daten ohne Erlaubnis kann gegen die Nutzungsbedingungen der Website verstoßen. Überprüfen Sie immer die robots.txt-Datei und die Nutzungsbedingungen, bevor Sie eine Website scrapen.

Bemerkungen:

0 Bemerkungen