
Cuando la IP del proxy se estrella contra datos JSON, ¿cómo se reproduce sin volcarse?
Hermanos que participan en el rastreo entender que cada vez que desde Internet de nuevo a recoger los datos, nueve veces de cada diez son el formato JSON. Esta cosa se ve refrescante, realmente quiere tratar con más problemático que la demolición de muñecas rusas de anidación. Especialmente cuando se utiliza IP proxy para recopilar datos, a menudo se encuentranTipos de datos confusos, errores de codificación, anidamiento demasiado profundoEstas polillas. La semana pasada me encontré con un caso: ipipgo agente residencial dinámico para capturar los datos de una empresa de comercio electrónico, los resultados de la devolución del campo de precio JSON será una cadena de "199 ″, un momento y luego cambiar el número de 199, casi a la base de datos para obtener colapsado.
importar json
from requests import Sesión
configuración del proxy ipipgo (ver aquí para más detalles)
proxy_config = {
"http": "http://user:pass@gateway.ipipgo.com:9020",
"https": "http://user:pass@gateway.ipipgo.com:9020"
}
session = Sesión()
response = session.get('https://api.example.com/products', proxies=proxy_config)
¡Hay un campo de minas enterrado aquí!
raw_data = json.loads(response.text)
Cuatro consejos para domar el salvaje JSON
Primer movimiento:Tipo de datos Barrido. Utilice esta operación soi cuando se encuentre con campos de tipo mixto:
def limpiar_datos(artículo).
Convertir uniformemente los campos de precio a coma flotante
if 'precio' in artículo.
try.
item['precio'] = float(item['precio'])
except.
item['precio'] = 0.0
Mosaico de diccionario anidado
if 'specs' in item.
item.update(item.pop('especificaciones'))
devolver artículo
safe_data = [clean_data(x) for x in raw_data['results']]
Segundo movimiento:Trifecta de captura de excepciones de proxy. Preste especial atención a las fluctuaciones de la red cuando utilice el proxy de ipipgo:
| Tipo de error | estrategia de respuesta |
|---|---|
| Error de conexión | Conmutación automática de nodos proxy |
| Tiempo de espera | Espere 3-5 segundos antes de volver a intentarlo |
| JSONDecodeError | Registrar el contenido de la respuesta original |
Fosos y salvavidas en el mundo real
¡Una vez que he utilizado el proxy de acción corta de ipipgo para capturar datos, me encontré con un extraño JSON - emoji emoticonos en el nombre de la clave! Esta vez no utilice la biblioteca estándar duro, en este programa:
import demjson
from charset_normalizer import detectar
Detectar codificación verdadera
encoding = detect(response.content)['encoding']
dirty_json = response.content.decode(encoding, errors='replace')
Análisis sintáctico con bibliotecas triples
datos = demjson.decode(dirty_json)
Recuerde añadir en la cabecera de la solicitud"Accept-Encoding": "identity"Algunos sitios web devuelven datos comprimidos, que pueden estropearse al retransmitir el proxy.
Tiempo de control de calidad (imprescindible para los novatos)
Q:¿Qué debo hacer si sigo recibiendo JSON mutilado con IP de proxy?
R: El 80% de la transmisión se intercepta en el medio, sugerimos: 1) comprobar si el paquete de tráfico de ipipgo background está agotado 2) añadir "Connection": "keep-alive" en la cabecera de la petición 3) aumentar el timeout a 10 segundos o más
P: ¿Cuál es el truco para tratar con múltiples capas de JSON anidado?
R: Usar jsonpath un puñado de lanzaderas es mucho más guay que escribir múltiples capas de bucles for:
from jsonpath_ng import parse
expr = parse('$..productos[? (@.precio > 100)].sku')
matches = [match.value for match in expr.find(data)]
La jugabilidad oculta del ipipgo
suAgentes de facturación a la cartaEspecialmente adecuado para tratar con grandes cantidades repentinas de datos. Por ejemplo, si de repente quieres analizar un archivo de registro JSON de 10 G, puedes hacerlo:
importar pandas como pd
from concurrent.futures import ThreadPoolExecutor
def parse_chunk(chunk).
with ipipgo.create_session(duration='15min') as session.
return pd.json_normalize(chunk)
Procesamiento de archivos grandes en trozos
resultados = []
with ThreadPoolExecutor(max_workers=5) as executor: for chunk in pd.read(chunk): return pd.json_normalise(chunk)
for chunk in pd.read_json('bigfile.json', lines=True, chunksize=1000)::
results.append(executor.submit(parse_chunk, chunk))
Un último consejo: cuando trabaje con JSON asegúrese deComprobación de esquemas antes del análisis sintácticoSi estás usando el proxy de ipipgo, puedes usar la petición HEAD para sondear la estructura de datos primero y evitar desperdiciar tráfico. Encontrado un problema difícil, recuerde ir a sus documentos para volcar la "guía de procesamiento JSON no estándar", arma salvavidas.

