Extraire des articles de Medium peut être d'une importance capitale pour des objectifs tels que l'évaluation du contenu, la collecte de données, ou le suivi des auteurs et de leurs travaux. Dans ce tutoriel, nous allons apprendre comment extraire des articles de Medium - un site web d'articles pour les écrivains, en utilisant le langage de programmation Python. Nous verrons comment des données telles que le titre de l'article, le nom de l'auteur, le nom de la publication et le corps du texte lui-même peuvent être extraites d'une URL web donnée d'un article Medium.
Pour ce tutoriel, nous allons scraper cet article sur Medium : "9 Python Built-in Decorators That Optimize Your Code Significantly" (9 décorateurs intégrés à Python qui optimisent votre code de manière significative).
Avant de commencer, installez les bibliothèques suivantes :
Installez-les à l'aide des commandes suivantes :
pip install requests
pip install lxml
pip install pandas
Medium utilise des techniques de détection des robots pour empêcher le scraping non autorisé. Des en-têtes et des proxies appropriés sont essentiels pour éviter la détection des robots et pour un scraping responsable.
En-têtes : ils simulent une demande comme si elle provenait d'un véritable navigateur. Ils contiennent des informations telles que le type de navigateur, les types de contenu acceptés et le comportement de mise en cache.
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',
}
Proxy : Les proxys peuvent masquer votre adresse IP, en la faisant tourner périodiquement pour réduire les risques de blocage des requêtes par Medium. Voici un exemple d'utilisation avec authentification de l'adresse IP :
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
)
Voici comment configurer les en-têtes et envoyer une requête à l'URL de l'article :
import requests
# En-têtes pour simuler une requête réelle du navigateur
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)
Une fois que nous avons le contenu de la page, nous pouvons l'analyser et en extraire les informations pertinentes.
Nous allons utiliser lxml pour analyser la réponse HTML et extraire des éléments spécifiques. Voici comment procéder :
from lxml.html import fromstring
parser = fromstring(response.text)
# Extraire des données
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]
Nous allons maintenant créer un dictionnaire qui contiendra toutes les données extraites. Cela facilite l'enregistrement dans un fichier CSV.
# Enregistrer les données dans un dictionnaire
article_data = {
'Title': title,
'Author': author,
'Publication': publication_name,
'Date': publication_date,
'Followers': auth_followers,
'Subtitle': sub_title,
'Content': content,
}
print(article_data)
Enfin, enregistrons les données dans un fichier CSV en vue d'une analyse ultérieure ou d'un archivage.
import pandas as pd
# Convertir un dictionnaire en DataFrame et l'enregistrer au format CSV
df = pd.DataFrame([article_data])
df.to_csv('medium_article_data.csv', index=False)
print("Data saved to medium_article_data.csv")
Voici le code complet pour récupérer les données des articles Medium :
import requests
from lxml.html import fromstring
import pandas as pd
# En-têtes pour imiter un navigateur
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'
}
# Demande de la page
url = 'https://medium.com/techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017'
response = requests.get(url, headers=headers, proxies=proxies)
# Analyse de la page
parser = fromstring(response.text)
# Extraire des données
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]
# Sauvegarde des données
article_data = {
'Title': title,
'Author': author,
'Publication': publication_name,
'Date': publication_date,
'Followers': auth_followers,
'Subtitle': sub_title,
'Content': content,
}
# Enregistrer au format CSV
df = pd.DataFrame([article_data])
df.to_csv('medium_article_data.csv', index=False)
print("Data saved to medium_article_data.csv")
La récupération de contenu sur Medium doit être effectuée de manière responsable. Une charge de travail excessive sur les serveurs peut affecter les performances du service, et l'extraction de données sans autorisation peut constituer une violation des conditions d'utilisation du site web. Vérifiez toujours le fichier robots.txt et les conditions d'utilisation avant de récupérer du contenu sur un site web.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Commentaires: 0