So kratzen Sie geo-beschränkte Daten, ohne verboten zu werden

Während das Internet oft als kostenlos und offen für alle angesehen wird, werden auf einigen Websites immer noch geografische Beschränkungen platziert.

Manchmal sind die Änderungen subtil, z. B. das automatische Umschalten der Sprachen. In anderen Fällen wird völlig unterschiedliche Inhalte für Menschen aus verschiedenen Ländern oder Regionen (z. B. Netflix) serviert.

An den Extremen sind einige Websites völlig unzugänglich, es sei denn, Ihre IP -Adresse stammt aus einem bestimmten Land. Während all diese Beschränkungen einen richtigen Zweck erfüllen, erschweren sie auch das Web -Scraping erheblich.

Es gibt verschiedene Möglichkeiten, um geografische Einschränkungen beim Schaben zu umgehen, z. B. die Verwendung von Proxys in Ihrem eigenen Schaber oder die Verwendung vorgefertigter Lösungen, die sich um den Ärger kümmern.

Verwenden von Proxys, um Geo-Restriktionen zu umgehen

In der Tat sind Wohngegenden die Art und Weise, wie die meisten Schaber Geo-Restriktionen umgehen. Da Sie eine IP -Adresse von einem Gerät erhalten, das sich physisch in einem Land Ihrer Wahl befindet. Wenn ein Proxy anfordert, von Ihrem Computer zu einer Website zu beantragen, wird der Meinung, dass die wahre Quelle der Anfrage in diesem Land stammt.

Obwohl es zahlreiche andere Proxy -Typen gibt, gelten Wohngegenden für die meisten Web -Scraping -Aufgaben im Allgemeinen als die beste Wahl, insbesondere für solche, die geografische Einschränkungen beinhalten. Rechenzentrale Proxies haben zwar schnell und billig, verfügen über eine begrenzte Reihe von Standorten und sind leichter zu erkennen.

ISP -Proxys würden vollkommen in Ordnung arbeiten, da sie so legitim wie Wohngegenden und so schnell wie Datencenter -Proxies sind, aber eine der teuersten Optionen verfügbar sind. Zusätzlich ist der IPS -Pool normalerweise sehr begrenzt.

Während der Kauf von Proxys direkt von einem Anbieter und der Integration in Ihren Schaber ist definitiv effizient, hat er eine Einschränkung: Sie müssen den Schaber selbst immer noch bauen. Für jedes Scraping -Projekt mit einem angemessenen Umfang ist umfangreiches Programmierkenntnis erforderlich.

Ständige Aktualisierungen der Scraping -Lösung sind auch erforderlich, da geringfügige Änderungen in Layouts, Website -Code oder irgendetwas dazwischen dazu führt, dass sie entweder vollständig brechen oder unsachgemäße Ergebnisse zurückgeben.

Dann gibt es die Kopfschmerzen bei der Analyse und Speicherung von Daten, die beide selbst komplizierte Themen sind.

Während der Kauf von Proxys von einem Anbieter für einige eine gute Lösung sein kann, ist es normalerweise denjenigen reserviert, die einen Schaber selbst bauen können.

Mit Schäfer

Scraperapi verwaltet die gesamte Scraping -Pipeline von Proxies bis hin zur Datenzustellung für die Benutzer. Es ist nicht erforderlich, etwas von Grund auf zu bauen: Sie können anfangen, sobald Sie einen Plan erhalten und einen grundlegenden Code schreiben.

Wir werden Python verwenden, um Anfragen an den Scraperapi -Endpunkt zu senden, um Daten von Websites abzurufen.

Vorbereitung

Erstens benötigen Sie eine IDE wie Pycharm- oder Visual Studio -Code, um Ihren Code auszuführen. Dann sollten Sie sich für ein Konto bei Scraperapi anmelden.

Notiz: Die kostenlose Testversion von Scraperapi reicht aus, um Geotargeting zu testen, da er Zugriff auf alle Premium -Funktionen bietet. Sobald dies abgelaufen ist, benötigen Sie jedoch einen der bezahlten Pläne, es sei denn, das US/EU -Geotargeting reicht für Ihren Anwendungsfall aus.
Sobald Sie alles eingerichtet haben, werden wir die verwenden Anfragen Bibliothek zum Senden von HTTP -Anfragen an den Schaker -Endpunkt. Seit Anfragen Ist eine Bibliothek von Drittanbietern, müssen wir sie zuerst installieren:

Das ist die einzige Bibliothek, die Sie benötigen, da Scraperapi das ganze schwere Heben für Sie durchführt. Alles, was Sie tun müssen, ist mit dem Schreiben von Code zu beginnen und die URLs zu erhalten, die Sie kratzen möchten.

Senden einer einfachen Anfrage

Es ist oft am besten, einfach zu beginnen und die Code -Komplexität zu erhöhen, während Sie gehen. Wir werden zunächst eine senden GET Anfrage an eine Website, auf der EU -Benutzer beschränkt werden, um zu überprüfen, was passiert, wenn wir keine Wohnproxies oder Scraperapi verwenden:

import requests
resp = requests.get('https://www.chicagotribune.com/')
print(resp.text)

Wir werden die verwenden Anfragen Bibliothek durchgehend, also müssen wir es importieren. Senden a GET Anfrage ist extrem einfach – rufen Sie das Modul mit dem an GET Methode und in die URL als String (doppelte oder einzelne Zitate erforderlich) als Argument.

Dann benutzen wir einfach unsere resp Objekt als Argument in der print Befehl und einschließen text als Methode.

Sie erhalten eine Fehlermeldung, da der Versuch, eine Antwort von der Chicago Tribune zu erhalten, während eine EU -IP -Adresse verwendet wird, sendet jedes Mal dieselbe Fehlermeldung:

Screenshot einer FehlermeldungScreenshot einer Fehlermeldung

Wenn Sie eine US-IP-Adresse mit einer EU-Locked-Website verwenden würden, erhalten Sie eine ähnliche Antwort. Sie alle unterscheiden sich leicht; Das Endergebnis ist jedoch das gleiche.

import requests
resp = requests.get('https://www.rte.ie/player/')
print(resp.text)

RTE beschränkt die Benutzer nur auf EU. Mit einer US -IP -Adresse erhalten Sie also:

Screenshot von RTE beschränkt die Benutzer nur auf EUScreenshot von RTE beschränkt die Benutzer nur auf EU

Daher ist es erforderlich, dass entweder Scraperapi- oder Wohngegenden Stellvertreter auf einige Websites zugreifen. Senden wir zunächst eine Anfrage über Scraperapi:

import requests
payload = {'api_key': ‘YOUR-API-KEY-HERE', 'url': 'https://httpbin.org/ip'}
resp = requests.get('https://api.scraperapi.com', params=payload)
print(resp.text)

Beginnen Sie wie immer mit dem Import der erforderlichen Bibliothek (Anfragen in unserem Fall). Definieren Sie dann ein Wörterbuchobjekt, das zwei hat key:value Paare – Der API -Schlüssel (für die Authentifizierung erforderlich) und die URL, die die Website ist, die Sie kratzen möchten.

Wir erstellen dann ein Antwortobjekt, das die von der Website abgerufene Antwort speichert. Sie benötigen zwei Argumente, von denen der erste immer der Schaker -Endpunkt ist, von dem das zweite das Nutzlast -Wörterbuch ist.

Im Moment drucken wir einfach die Antwort. Das Ausführen des Codes sollte einfach die IP -Adresse der Herkunft abrufen und im Standardausgabebildschirm drucken.

Auswahl eines geografischen Ortes

Wir werden jetzt auf Websites umsteigen, die Daten basierend auf dem Standort anzeigen, z. B. das Anzeigen verschiedener Preise, Währungen oder Inhalte im Allgemeinen.

Beginnen wir zunächst einen Ländercode in unserem Scraperapi -Code, um die Chicago Tribune zu besuchen und zu sehen, ob wir eine Antwort erhalten.
Alles was Sie tun müssen, ist eine zusätzliche hinzuzufügen Schlüssel: Wert Kombinieren Sie Ihr Payload -Wörterbuch. Es wird sein country_code als Schlüssel und der Ländercode im 2-Buchstaben ISO 3166-1-Format.

import requests
payload = {'api_key': 'YOUR-API-KEY-HERE', 'url': 'https://www.chicagotribune.com/', 'country_code': us}
resp = requests.get('https://api.scraperapi.com', params=payload)
print(resp.text)

Sie sollten eine große HTML -Antwort erhalten, die viele Daten zeigt. Unser Screenshot wird zu Demonstrationszwecken abgeschnitten:

Screenshot einer großen HTML -ReaktionScreenshot einer großen HTML -Reaktion

Daten mit BeautifulSoup analysieren

Wir werden mit der Installation von BeautifulSoup beginnen:

pip install beautifulsoup4

Jetzt müssen wir einige Änderungen an unserem Code vornehmen:

  • Wir werden den Antworttext (die vollständige HTML -Datei) in ein wunderschönes Objekt einlegen, das zum Parsen verwendet wird.
  • Anschließend wird eine Liste erstellt, um alle Artikel -Titel zu speichern.
  • Für die Ausgabe führen wir eine weitere Schleife aus, die jeden Titel auf einer neuen Zeile druckt.
import requests
from bs4 import BeautifulSoup
payload = {
    "api_key": "YOUR-API-KEY-HERE",
    "url": "https://www.chicagotribune.com/",
    "country_code": "us",
}
resp = requests.get("https://api.scraperapi.com", params=payload)
soup = BeautifulSoup(resp.text, "html.parser")
titles = (
    a.get_text(strip=True)
    for a in soup.select("a.article-title")
)
unique_titles = sorted(set(titles))
for t in unique_titles:
    print

Beachten Sie, dass wir auch a erstellen unique_titles Objekt, das sowohl sortiert als auch in ein Set verwandelt wird (aus einer Liste). Sets in Python speichern keine doppelten Werte. Daher ist dies eine einfache Möglichkeit, doppelte Titel aus unserer ursprünglichen Liste zu entfernen.

Sie sollten eine Antwort erhalten, die ähnlich ist:

Screenshot der ReaktionScreenshot der Reaktion

Schließlich zeigen einige Websites dieselbe Seite mit unterschiedlichen Daten für viele geografische Standorte. Die meisten E -Commerce -Unternehmen tun dies, um die Preise für Benutzer transparenter zu gestalten.

Daten mit Pandas speichern

Sie möchten wahrscheinlich mehr als nur Daten ausdrucken. Andernfalls verlieren Sie alles, nachdem Sie Ihre IDE oder ein anderes Programm geschlossen haben.
Normalerweise die Pandas Die Bibliothek ist mehr als ausreichend für grundlegende Abkratzenprojekte. Beginnen Sie mit der Installation:

Wir werden auch den Standard importieren datetime Bibliothek zum Hinzufügen von Zeitstempeln zu unserer CSV -Datei, was sehr nützlich ist, wenn Sie später dorthin zurückkehren müssen.

import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime
payload = {
    "api_key": "YOUR-API-KEY-HERE",
    "url": "https://www.chicagotribune.com/",
    "country_code": "us",
}
resp = requests.get("https://api.scraperapi.com", params=payload)
soup = BeautifulSoup(resp.text, "html.parser")
titles = (
    a.get_text(strip=True)
    for a in soup.select("a.article-title")
)
unique_titles = sorted(set(titles))
df = pd.DataFrame({"Headline": unique_titles})
today = datetime.now().strftime("%Y-%m-%d")
outfile = f"chicago_tribune_headlines_{today}.csv"
df.to_csv(outfile, index=False, encoding="utf-16")
print(f"✔ Saved {len(df)} headlines → {outfile}")

Das Ausführen des Codes erstellt nun eine CSV -Datei und druckt eine Erfolgsnachricht aus. Der zugrunde liegende Code ist recht einfach – ein Datenrahmen wird erstellt, der mit der Zeile „Überschrift“ beginnt, und dann ist eine andere Zeile einer der Titel.

Um der Datei einen Zeitstempel hinzuzufügen, verwenden wir datetime.now() und wenden Sie es in eine Zeichenfolge mit strftime und geben Sie das Format im Argument an.

Schließlich wird der Datenrahmen in eine CSV -Datei ausgegeben.

Notiz: Wir verwenden „UTF-16“ -Codierung, da „UTF-8“ nicht alle Zeichen richtig übersetzt.

Ihre CSV -Datei sollte ein wenig so aussehen:

Screenshot der CSV -DateiScreenshot der CSV -Datei

Weitere Überlegungen

Das Schaben einer einzelnen Website mit Scraperapi ist für jedes reale Projekt letztendlich etwas zu einfach, obwohl es als großartiger Ausgangspunkt dient. Sie können Ihren Scraping -Code auf zwei primäre Weise verbessern.

Eine davon ist, dass Sie Scraperapi verwenden können, um die Homepage einer Website zu kratzen, alle URLs zu sammeln und so weiterzumachen, um Ihre URL -Liste zu erstellen.

Alternativ können Sie a erstellen list Objekt manuell und geben Sie alle URLs ein, die Sie kratzen möchten, und führen Sie dann eine Schleife über jedes Element als URL aus.

Hier ist der vollständige Codeblock, an dem Sie arbeiten können:

import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime
payload = {
    "api_key": "YOUR-API-KEY-HERE",
    "url": "https://www.chicagotribune.com/",
    "country_code": "us",
}
resp = requests.get("https://api.scraperapi.com", params=payload)
soup = BeautifulSoup(resp.text, "html.parser")
titles = (
    a.get_text(strip=True)
    for a in soup.select("a.article-title")
)
unique_titles = sorted(set(titles))
df = pd.DataFrame({"Headline": unique_titles})
today = datetime.now().strftime("%Y-%m-%d")
outfile = f"chicago_tribune_headlines_{today}.csv"
df.to_csv(outfile, index=False, encoding="utf-16")
print(f"✔ Saved {len(df)} headlines → {outfile}")

Mein Name ist Kadek und ich bin ein Student aus Indonesien und studiere derzeit Informatik in Deutschland. Dieser Blog dient als Plattform, auf der ich mein Wissen zu Themen wie Web Scraping, Screen Scraping, Web Data Mining, Web Harvesting, Web Data Extraction und Web Data Parsing teilen kann.