
Wenn Proxy-IP in JSON-Daten abstürzt, wie spielen Sie es ohne Rollover?
Brüder in Crawling beschäftigt verstehen, dass jedes Mal aus dem Internet zurück zu holen Daten, neun Mal von zehn sind JSON-Format. Dieses Ding sieht erfrischend, wirklich wollen, um mit mehr lästig als der Abriss der russischen Schachtelpuppen beschäftigen. Vor allem bei der Verwendung von Proxy-IP, um Daten zu sammeln, oft angetroffenVerwirrende Datentypen, Kodierungsfehler, zu viel VerschachtelungDiese Motten. Letzte Woche lief ich in einen Fall: ipipgo dynamischen Wohn-Agenten, um die Daten eines E-Commerce-Unternehmens zu fangen, die Ergebnisse der Rückkehr des JSON-Preisfeld wird eine Zeichenfolge von "199 ″, einen Moment und dann ändern Sie die Anzahl der 199, fast an die Datenbank zu bekommen kollabiert.
json importieren
from requests import Session
ipipgo-Proxy-Konfiguration (siehe hier für Highlights)
proxy_config = {
"http": "http://user:pass@gateway.ipipgo.com:9020",
"https": "http://user:pass@gateway.ipipgo.com:9020"
}
session = Sitzung()
Antwort = session.get('https://api.example.com/products', proxies=proxy_config)
Hier verbirgt sich ein Minenfeld!
raw_data = json.loads(response.text)
Vier Tipps zur Zähmung von wildem JSON
Erster Zug:Datentyp Sweep. Verwenden Sie diese soo-Operation, wenn Sie auf Felder gemischten Typs treffen:
def clean_data(item).
Preisfelder einheitlich in Gleitkomma umwandeln
if 'Preis' in Artikel.
try.
item['preis'] = float(item['preis'])
except.
artikel['preis'] = 0.0
Verschachtelte Wörterbuchkacheln
if 'specs' in item.
item.update(item.pop('specs'))
Rückgabe item
safe_data = [clean_data(x) for x in raw_data['results']]
Zweiter Zug:Proxy-Ausnahmeerfassung Trifecta. Achten Sie besonders auf Netzschwankungen, wenn Sie den Proxy von ipipgo verwenden:
| Art des Fehlers | Reaktionsstrategie |
|---|---|
| VerbindungsFehler | Automatische Umschaltung von Proxy-Knoten |
| Zeitüberschreitung | Warten Sie 3-5 Sekunden, bevor Sie es erneut versuchen. |
| JSONDecodeError | Aufzeichnung des Inhalts der ursprünglichen Antwort |
Gruben und Rettungsschwimmer in der realen Welt
Sobald ich den kurzlebigen Proxy von ipipgo zur Datenerfassung verwendet habe, bin ich auf ein seltsames JSON gestoßen - Emoji-Emoticons im Schlüsselnamen! Dieses Mal verwenden Sie nicht die Standardbibliothek hart, auf dieses Programm:
demjson importieren
from charset_normalizer import detect
Echte Kodierung erkennen
encoding = detect(response.content)['encoding']
dirty_json = response.content.decode(encoding, errors='replace')
Parsen mit Triple-Bibliotheken
Daten = demjson.decode(dirty_json)
Vergessen Sie nicht, in der Kopfzeile der Anfrage Folgendes hinzuzufügen"Accept-Encoding": "Identität"Wenn Sie diese Website nutzen möchten, geben einige Websites komprimierte Daten zurück, die bei der Weiterleitung des Proxys durcheinander gebracht werden können.
QA-Zeit (ein Muss für Neulinge)
Q:Was soll ich tun, wenn ich weiterhin verstümmelte JSON mit Proxy-IP erhalte?
A: 80% der Übertragungen werden in der Mitte abgefangen, wir empfehlen: 1) prüfen Sie, ob das Verkehrspaket von ipipgo background aufgebraucht ist 2) fügen Sie "Connection": "keep-alive" in den Request-Header ein 3) erhöhen Sie den Timeout auf 10 Sekunden oder mehr
F: Was ist der Trick beim Umgang mit mehreren Schichten von verschachteltem JSON?
A: Mit jsonpath eine Handvoll Shuttles ist viel cooler als mehrere Schichten von for-Schleifen zu schreiben:
von jsonpath_ng importieren parse
expr = parse('$..Produkte[? (@.preis > 100)].sku')
matches = [match.value for match in expr.find(data)]
Der versteckte Spielverlauf von ipipgo
ihreFakturierer auf AbrufBesonders geeignet für den Umgang mit plötzlich anfallenden großen Datenmengen. Wenn Sie z.B. plötzlich eine 10G JSON-Logdatei parsen wollen, können Sie das tun:
import pandas as pd
from concurrent.futures import ThreadPoolExecutor
def parse_chunk(chunk).
with ipipgo.create_session(duration='15min') as session.
return pd.json_normalize(chunk)
Verarbeitung großer Dateien in Chunks
results = []
with ThreadPoolExecutor(max_workers=5) as executor: for chunk in pd.read(chunk): return pd.json_normalize(chunk)
for chunk in pd.read_json('bigfile.json', lines=True, chunksize=1000):
results.append(executor.submit(parse_chunk, chunk))
Ein letzter Ratschlag: Achten Sie beim Umgang mit JSON darauf, dassSchemaprüfung vor dem ParsenWenn Sie den Proxy von ipipgo verwenden, können Sie mit der HEAD-Anfrage zuerst die Datenstruktur abfragen, um unnötigen Datenverkehr zu vermeiden. Begegnet ein schwieriges Problem, denken Sie daran, auf ihre Dokumente zu gehen, um über die "Nicht-Standard-JSON-Verarbeitung Leitfaden", lebensrettende Waffe drehen.

