Per raccogliere i titoli delle notizie più recenti, monitorare le tendenze delle notizie ed eseguire l'analisi del sentiment su argomenti attuali, lo scraping di Google News si rivela uno strumento prezioso. In questo articolo vi guideremo attraverso il processo di scraping di Google News per mezzo di Python. Utilizzeremo una libreria requests per ottenere il contenuto delle pagine; lxml per analizzare i documenti HTML ed estrarre i dati necessari. Alla fine di questo tutorial, imparerete a estrarre i titoli delle notizie e i rispettivi link da Google News in formato JSON strutturato.
Prima di iniziare, assicuratevi di avere installato Python sul vostro sistema. È possibile installare le librerie necessarie eseguendo i seguenti comandi:
pip install requests
pip install lxml
Queste librerie ci permetteranno di effettuare richieste HTTP e di analizzare il contenuto HTML della pagina web.
Faremo lo scraping della pagina di Google News al seguente URL:
URL = "https://news.google.com/topics/CAAqKggKIiRDQkFTRlFvSUwyMHZNRGRqTVhZU0JXVnVMVWRDR2dKSlRpZ0FQAQ?hl=en-US&gl=US&ceid=US%3Aen"
Questa pagina contiene più notizie, ciascuna con un titolo principale e articoli correlati. La struttura XPath di questi articoli è la seguente:
La struttura HTML di Google News rimane coerente tra le diverse pagine, garantendo che gli elementi XPath specificati siano applicabili universalmente.
Inizieremo recuperando il contenuto della pagina di Google News utilizzando la libreria requests. Ecco il codice per recuperare il contenuto della pagina:
import requests
url = "https://news.google.com/topics/CAAqKggKIiRDQkFTRlFvSUwyMHZNRGRqTVhZU0JXVnVMVWRDR2dKSlRpZ0FQAQ?hl=en-US&gl=US&ceid=US%3Aen"
response = requests.get(url)
if response.status_code == 200:
page_content = response.content
else:
print(f"Failed to retrieve the page. Status code: {response.status_code}")
Questo codice invia una richiesta GET all'URL di Google News e memorizza il contenuto HTML della pagina nella variabile page_content.
Con il contenuto HTML in mano, possiamo usare lxml per analizzare la pagina ed estrarre i titoli delle notizie e i link.
from lxml import html
# Analizzare il contenuto HTML
parser = html.fromstring(page_content)
Google News organizza gli articoli in contenitori specifici. Per prima cosa estrarremo questi contenitori usando il loro XPath e poi li itereremo per estrarre i singoli titoli e link delle notizie.
Gli articoli di notizie principali si trovano sotto il seguente XPath:
main_news_elements = parser.xpath('//c-wiz[@jsrenderer="ARwRbe"]')
Ora possiamo scorrere i primi 10 elementi validi ed estrarre i titoli e i link:
news_data = []
for element in main_news_elements[:10]:
title = element.xpath('.//c-wiz/div/article/a/text()')[0]
link = "https://news.google.com" + element.xpath('.//c-wiz/div/article/a/@href')[0][1:]
# Assicurarsi che i dati esistano prima di aggiungerli all'elenco
if title and link:
news_data.append({
"main_title": title,
"main_link": link,
})
L'elemento principale delle notizie ha delle sottosezioni in cui sono presenti notizie correlate. Possiamo estrarle utilizzando un approccio simile:
related_articles = []
related_news_elements = element.xpath('.//c-wiz/div/div/article')
for related_element in related_news_elements:
related_title = related_element.xpath('.//a/text()')[0]
related_link = "https://news.google.com" + related_element.xpath('.//a/@href')[0][1:]
related_articles.append({"title": related_title, "link": related_link})
news_data.append({
"main_title": title,
"main_link": link,
"related_articles": related_articles
})
Dopo aver estratto i dati, possiamo salvarli in un file JSON per utilizzarli in seguito.
import json
with open('google_news_data.json', 'w') as f:
json.dump(news_data, f, indent=4)
Questo codice creerà un file chiamato google_news_data.json contenente tutti i titoli delle notizie scrapate e i loro link corrispondenti.
Quando si scaricano grandi quantità di dati, soprattutto da siti ad alto traffico come Google News, si possono incontrare problemi come il blocco degli IP o la limitazione della velocità. Per evitarli, si possono usare i proxy. I proxy consentono di instradare le richieste attraverso indirizzi IP diversi, rendendo più difficile per il sito web rilevare e bloccare le attività di scraping.
Per questa esercitazione, è possibile utilizzare un proxy modificando la chiamata requests.get:
proxies = {
"http": "http://your_proxy_ip:port",
"https": "https://your_proxy_ip:port",
}
response = requests.get(url, proxies=proxies)
Se si lavora con un fornitore di servizi che gestisce la rotazione dei proxy, è sufficiente configurare il servizio nelle proprie richieste. Il provider si occuperà della rotazione e della gestione del pool di IP.
A volte, i siti web possono bloccare le richieste che non hanno le intestazioni corrette, come una stringa di user-agent che identifica la richiesta come proveniente da un browser. È possibile personalizzare le intestazioni per evitare il rilevamento:
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': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
'sec-ch-ua-arch': '"x86"',
'sec-ch-ua-bitness': '"64"',
'sec-ch-ua-full-version-list': '"Not)A;Brand";v="99.0.0.0", "Google Chrome";v="127.0.6533.72", "Chromium";v="127.0.6533.72"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-model': '""',
'sec-ch-ua-platform': '"Linux"',
'sec-ch-ua-platform-version': '"6.5.0"',
'sec-ch-ua-wow64': '?0',
'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/127.0.0.0 Safari/537.36',
}
response = requests.get(url, headers=headers)
Ecco il codice completo, che combina tutti i passaggi:
import requests
import urllib3
from lxml import html
import json
urllib3.disable_warnings()
# URL e intestazioni
url = "https://news.google.com/topics/CAAqKggKIiRDQkFTRlFvSUwyMHZNRGRqTVhZU0JXVnVMVWRDR2dKSlRpZ0FQAQ?hl=en-US&gl=US&ceid=US%3Aen"
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': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
'sec-ch-ua-arch': '"x86"',
'sec-ch-ua-bitness': '"64"',
'sec-ch-ua-full-version-list': '"Not)A;Brand";v="99.0.0.0", "Google Chrome";v="127.0.6533.72", "Chromium";v="127.0.6533.72"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-model': '""',
'sec-ch-ua-platform': '"Linux"',
'sec-ch-ua-platform-version': '"6.5.0"',
'sec-ch-ua-wow64': '?0',
'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/127.0.0.0 Safari/537.36',
}
# Configurazione dei proxy (sostituire con i dettagli del proxy)
proxy = 'ip:port'
proxies = {
"http": f"http://{proxy}",
"https": f"https://{proxy}",
}
# Recupera il contenuto della pagina con le intestazioni e le deleghe specificate
response = requests.get(url, headers=headers, proxies=proxies, verify=False)
# Controllare se la richiesta è andata a buon fine
if response.status_code == 200:
page_content = response.content
else:
print(f"Failed to retrieve the page. Status code: {response.status_code}")
exit()
# Analizzare il contenuto HTML utilizzando lxml
parser = html.fromstring(page_content)
# Estrarre le notizie principali e gli articoli correlati
main_news_elements = parser.xpath('//*[@id="i10-panel"]/c-wiz/c-wiz')
# Inizializzare un elenco per memorizzare i dati delle notizie estratte
news_data = []
# Eseguire il loop di ogni elemento principale delle notizie
for element in main_news_elements[:10]:
# Estrarre il titolo e il link della notizia principale
title = element.xpath('.//c-wiz/div/article/a/text()')
link = element.xpath('.//c-wiz/div/article/a/@href')
# Inizializza un elenco per memorizzare gli articoli correlati a questa notizia principale.
related_articles = []
# Estrarre elementi di notizie correlate all'interno dello stesso blocco
related_news_elements = element.xpath('.//c-wiz/div/div/article')
# Eseguire il loop di ogni elemento di notizia correlato ed estrarre il titolo e il link
for related_element in related_news_elements:
related_title = related_element.xpath('.//a/text()')[0]
related_link = "https://news.google.com" + related_element.xpath('.//a/@href')[0][1:]
related_articles.append({"title": related_title, "link": related_link})
# Aggiungere la notizia principale e i suoi articoli correlati all'elenco news_data
if title is not None:
news_data.append({
"main_title": title,
"main_link": f'https://news.google.com{link}',
"related_articles": related_articles
})
else:
continue
# Salvare i dati estratti in un file JSON
with open("google_news_data.json", "w") as json_file:
json.dump(news_data, json_file, indent=4)
print('Data extraction complete. Saved to google_news_data.json')
Lo scraping di Google News utilizzando Python, insieme alle librerie requests e lxml, facilita l'analisi dettagliata delle tendenze delle notizie. L'implementazione di proxy e la configurazione delle intestazioni delle richieste sono fondamentali per evitare blocchi e mantenere la stabilità dello scraper. I proxy ideali a questo scopo sono i proxy IPv4 e IPv6 dei centri dati e i proxy degli ISP, che offrono velocità elevate e ping ridotto. Inoltre, i proxy dinamici residenziali sono molto efficaci grazie al loro fattore di fiducia superiore.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Commenti: 0