Beim Sammeln der neuesten Schlagzeilen, der Überwachung von Nachrichtentrends und der Durchführung von Stimmungsanalysen zu aktuellen Themen erweist sich das Scraping von Google News als ein unschätzbares Werkzeug. In diesem Artikel führen wir Sie durch den Prozess des Scrapings von Google News mithilfe von Python. Wir werden eine Requests-Bibliothek verwenden, um Seiteninhalte zu erhalten; lxml zum Parsen von HTML-Dokumenten und Extrahieren der benötigten Daten. Am Ende dieses Tutorials werden Sie lernen, wie Sie Schlagzeilen und die dazugehörigen Links aus Google News in ein strukturiertes JSON-Format extrahieren können.
Bevor wir beginnen, stellen Sie sicher, dass Sie Python auf Ihrem System installiert haben. Sie können die erforderlichen Bibliotheken installieren, indem Sie die folgenden Befehle ausführen:
pip install requests
pip install lxml
Diese Bibliotheken ermöglichen es uns, HTTP-Anfragen zu stellen und den HTML-Inhalt der Webseite zu analysieren.
Wir werden die Google News-Seite unter der folgenden URL auslesen:
URL = "https://news.google.com/topics/CAAqKggKIiRDQkFTRlFvSUwyMHZNRGRqTVhZU0JXVnVMVWRDR2dKSlRpZ0FQAQ?hl=en-US&gl=US&ceid=US%3Aen"
Diese Seite enthält mehrere Nachrichten, jede mit einer Hauptüberschrift und verwandten Artikeln. Die XPath-Struktur für diese Artikel ist wie folgt:
Die HTML-Struktur von Google News bleibt über verschiedene Seiten hinweg konsistent, so dass die angegebenen XPath-Elemente universell einsetzbar sind.
Wir beginnen mit dem Abrufen des Inhalts der Google News-Seite mithilfe der Request-Bibliothek. Hier ist der Code zum Abrufen des Seiteninhalts:
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}")
Dieser Code sendet eine GET-Anfrage an die URL von Google News und speichert den HTML-Inhalt der Seite in der Variablen page_content.
Mit dem HTML-Inhalt in der Hand können wir lxml verwenden, um die Seite zu analysieren und die Nachrichtenüberschriften und Links zu extrahieren.
from lxml import html
# Analysieren Sie den HTML-Inhalt
parser = html.fromstring(page_content)
Google News ordnet seine Artikel in bestimmten Containern an. Wir extrahieren diese Container zunächst mit Hilfe von XPath und iterieren dann durch sie, um die einzelnen Schlagzeilen und Links zu extrahieren.
Die Hauptnachrichtenartikel befinden sich unter folgendem XPath:
main_news_elements = parser.xpath('//c-wiz[@jsrenderer="ARwRbe"]')
Wir können nun die ersten 10 gültigen Elemente durchlaufen und die Titel und Links extrahieren:
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:]
# Sicherstellen, dass Daten vorhanden sind, bevor sie an die Liste angehängt werden
if title and link:
news_data.append({
"main_title": title,
"main_link": link,
})
Das Hauptelement "News" hat Unterabschnitte, in denen verwandte Nachrichten enthalten sind. Wir können diese mit einem ähnlichen Ansatz extrahieren:
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
})
Nachdem wir die Daten extrahiert haben, können wir sie zur späteren Verwendung in einer JSON-Datei speichern.
import json
with open('google_news_data.json', 'w') as f:
json.dump(news_data, f, indent=4)
Mit diesem Code wird eine Datei mit dem Namen google_news_data.json erstellt, die alle gescrapten Schlagzeilen und die entsprechenden Links enthält.
Beim Scraping großer Datenmengen, insbesondere von stark frequentierten Websites wie Google News, kann es zu Problemen wie IP-Blockierung oder Ratenbegrenzung kommen. Um dies zu vermeiden, können Sie Proxys verwenden. Proxys ermöglichen es Ihnen, Ihre Anfragen über verschiedene IP-Adressen zu leiten, wodurch es für die Website schwieriger wird, Ihre Scraping-Aktivitäten zu erkennen und zu blockieren.
Für dieses Tutorial können Sie einen Proxy verwenden, indem Sie den Aufruf von requests.get ändern:
proxies = {
"http": "http://your_proxy_ip:port",
"https": "https://your_proxy_ip:port",
}
response = requests.get(url, proxies=proxies)
Wenn Sie mit einem Dienstanbieter arbeiten, der die Proxy-Rotation verwaltet, müssen Sie nur den Dienst in Ihren Anfragen konfigurieren. Der Anbieter übernimmt die Rotation und die Verwaltung des IP-Pools auf seiner Seite.
Manchmal blockieren Websites Anfragen, die nicht die richtigen Header haben, wie z. B. einen User-Agent-String, der die Anfrage als von einem Browser kommend identifiziert. Sie können Ihre Header anpassen, um eine Erkennung zu vermeiden:
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)
Hier ist der vollständige Code, der alle Schritte kombiniert:
import requests
import urllib3
from lxml import html
import json
urllib3.disable_warnings()
# URL und Kopfzeilen
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',
}
# Konfiguration der Proxies (ersetzen Sie diese durch Ihre Proxy-Details)
proxy = 'ip:port'
proxies = {
"http": f"http://{proxy}",
"https": f"https://{proxy}",
}
# Abrufen des Seiteninhalts mit den angegebenen Kopfzeilen und Proxys
response = requests.get(url, headers=headers, proxies=proxies, verify=False)
# Prüfen, ob die Anfrage erfolgreich war
if response.status_code == 200:
page_content = response.content
else:
print(f"Failed to retrieve the page. Status code: {response.status_code}")
exit()
# Parsen des HTML-Inhalts mit lxml
parser = html.fromstring(page_content)
# Auszug aus den wichtigsten Nachrichten und verwandten Artikeln
main_news_elements = parser.xpath('//*[@id="i10-panel"]/c-wiz/c-wiz')
# Initialisierung einer Liste zum Speichern der extrahierten Nachrichtendaten
news_data = []
# Schleife durch jedes Hauptnachrichtenelement
for element in main_news_elements[:10]:
# Extrahieren Sie den Titel und den Link der Hauptnachricht
title = element.xpath('.//c-wiz/div/article/a/text()')
link = element.xpath('.//c-wiz/div/article/a/@href')
# Initialisierung einer Liste mit verwandten Artikeln für diese Hauptnachricht
related_articles = []
# Extrahieren verwandter Nachrichtenelemente innerhalb desselben Blocks
related_news_elements = element.xpath('.//c-wiz/div/div/article')
# Schleife durch jedes verwandte Nachrichtenelement und Extraktion des Titels und des Links
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})
# Anhängen der Hauptnachricht und der zugehörigen Artikel an die Liste 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
# Speichern Sie die extrahierten Daten in einer JSON-Datei
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')
Das Scraping von Google News mit Python und den Bibliotheken requests und lxml ermöglicht eine detaillierte Analyse von Nachrichtentrends. Die Implementierung von Proxies und die Konfiguration von Anfrage-Headern sind entscheidend, um Blockaden zu vermeiden und die Stabilität des Scrapers zu gewährleisten. Ideale Proxys für diesen Zweck sind IPv4- und IPv6-Rechenzentrums-Proxys und ISP-Proxys, die hohe Geschwindigkeiten und niedrige Ping-Werte bieten. Darüber hinaus sind dynamische Proxys für Privatanwender aufgrund ihres hohen Vertrauensfaktors sehr effektiv.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Bemerkungen: 0