L'estrazione di articoli da Medium può essere di estrema importanza per scopi quali la valutazione dei contenuti, la raccolta di dati o il monitoraggio degli autori e delle loro opere. In questo tutorial, impareremo a fare lo scraping di Medium, un sito di articoli per scrittori, utilizzando il linguaggio di programmazione python. Discuteremo come estrarre dati quali il titolo dell'articolo, il nome dell'autore, il nome della pubblicazione e il corpo del testo stesso da un determinato URL di un articolo di Medium.
Per questo tutorial, faremo lo scraping di questo articolo su Medium: "9 Python Built-in Decorators That Optimize Your Code Significantly".
Prima di iniziare, installare le seguenti librerie:
Installateli con i seguenti comandi:
pip install requests
pip install lxml
pip install pandas
Medium utilizza tecniche di rilevamento dei bot per impedire lo scraping non autorizzato. Intestazioni e proxy adeguati sono fondamentali per evitare il rilevamento dei bot e per uno scraping responsabile.
Headers: simulano una richiesta come se provenisse da un browser reale. Includono informazioni come il tipo di browser, i tipi di contenuto accettati e il comportamento della 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',
}
Proxies: I proxy possono mascherare il vostro indirizzo IP, ruotandolo periodicamente per rendere meno probabile il blocco delle richieste da parte di Medium. Ecco un esempio di utilizzo con autenticazione dell'indirizzo 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
)
Ecco come impostare le intestazioni e inviare una richiesta all'URL dell'articolo:
import requests
# Intestazioni per simulare una richiesta reale del browser
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)
Una volta ottenuto il contenuto della pagina, possiamo analizzarlo ed estrarre le informazioni rilevanti.
Useremo lxml per analizzare la risposta HTML ed estrarre elementi specifici. Ecco come fare:
from lxml.html import fromstring
parser = fromstring(response.text)
# Estrarre i dati
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]
Ora creeremo un dizionario per contenere tutti i dati estratti. In questo modo è più facile salvare in un file CSV.
# Salvare i dati in un dizionario
article_data = {
'Title': title,
'Author': author,
'Publication': publication_name,
'Date': publication_date,
'Followers': auth_followers,
'Subtitle': sub_title,
'Content': content,
}
print(article_data)
Infine, salviamo i dati in un file CSV per ulteriori analisi o registrazioni.
import pandas as pd
# Convertire il dizionario in DataFrame e salvare come CSV
df = pd.DataFrame([article_data])
df.to_csv('medium_article_data.csv', index=False)
print("Data saved to medium_article_data.csv")
Ecco il codice completo per lo scraping dei dati degli articoli di Medium:
import requests
from lxml.html import fromstring
import pandas as pd
# Intestazioni per simulare un browser
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'
}
# Richiesta della pagina
url = 'https://medium.com/techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017'
response = requests.get(url, headers=headers, proxies=proxies)
# Parsing della pagina
parser = fromstring(response.text)
# Estrarre i dati
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]
# Salvataggio dei dati
article_data = {
'Title': title,
'Author': author,
'Publication': publication_name,
'Date': publication_date,
'Followers': auth_followers,
'Subtitle': sub_title,
'Content': content,
}
# Salva in CSV
df = pd.DataFrame([article_data])
df.to_csv('medium_article_data.csv', index=False)
print("Data saved to medium_article_data.csv")
Lo scraping di contenuti da Medium deve essere condotto in modo responsabile. Un carico eccessivo di richieste sui server può influire sulle prestazioni del servizio e lo scraping di dati senza autorizzazione può violare i termini di utilizzo del sito web. Controllare sempre il file robots.txt e i termini prima di effettuare lo scraping di qualsiasi sito web.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Commenti: 0