Enseñanza práctica para jugar con datos JSON con Python
Recientemente, muchos amigos que hacen captura de datos me preguntaron, ¿por qué usar Python para tratar con archivos JSON siempre atascado? Es como cocinar sin todas las especias. Hoy, vamos a hablar de cómo hacer que el procesamiento de JSON sea más suave con el arma secreta del proxy IP. En primer lugar, vamos a hablar de la escena: por ejemplo, desea obtener información a granel de los productos básicos de un sitio web, el otro lado de los datos JSON volvió a ocultar el bebé, pero directa difícil fácil de desencadenar anti-escalada, entonces usted necesita para proxy IP para jugar.
importar json
importar peticiones
He aquí un ejemplo usando el servicio proxy de ipipgo
proxy_config = {
"http": "http://username:password@gateway.ipipgo.com:9020",
"https": "http://username:password@gateway.ipipgo.com:9020"
}
response = requests.get('https://api.example.com/products', proxies=proxy_config)
datos = json.loads(respuesta.texto)
print(datos['lista_productos'][0]['precio'])
JSON parsing errores comunes hoja informativa
Voy a enumerar algunos errores típicos que cometen los novatos:
bache | prescripción |
---|---|
La confusión en la codificación da lugar a códigos confusos | Establézcalo de antemano con response.encoding='utf-8' |
Los diccionarios anidados no encuentran el norte | Establecer valores por defecto con el método .get() evita informar de errores |
Explosión de memoria al cargar archivos grandes | Streaming con la biblioteca ijson |
La forma correcta de abrir una IP proxy
Aquellos de ustedes que han utilizado ipipgo saben que hay una cosa maravillosa acerca de su agente - soporte paraConmutación a la carta. Por ejemplo, cuando se trata de datos paginados:
from itertools import ciclo
Preparar múltiples nodos proxy ipipgo
proxy_pool = cycle([
"http://user:pass@node1.ipipgo.com:9020",
"http://user:pass@node2.ipipgo.com:9020"
])
para página en rango(1, 10): proxy_actual = siguiente(pool_proxy)
current_proxy = next(proxy_pool)
response = requests.get(f'https://api.example.com?page={page}',
proxies={"http": proxy_actual})
sesión interactiva de preguntas y respuestas
Q:¿Por qué mi análisis JSON siempre informa de KeyError?
R: El 80% del nombre del campo está mal escrito, primero usa data.keys() para ver el nombre real del campo. Si es un campo dinámico, se recomienda escribirlo con .get('nombre de campo', valor por defecto)
P: ¿Es necesario verificar siempre el proxy de ipipgo?
R: Su familia soporta la persistencia de sesión, y puede reutilizar la conexión después de la primera autenticación, dependiendo del tipo de paquete. Paquete Enterprise con persistencia de sesión por defecto
P: ¿Qué puedo hacer para solucionar el extraño formato de hora que devuelve la API?
R: Utilice el módulo parser de la biblioteca dateutil, que es mucho más flexible que datetime:
from dateutil import parser
timestamp = parser.parse("2023-12-25T08:30:00+08:00")
Juego de actualización: manejo de excepciones en tres ejes
La diferencia entre un conductor veterano y un novato está en el manejo de excepciones. Se recomienda envolver tres capas de try para las peticiones:
probar.
resp = requests.get(url, proxies=proxy_config, timeout=10)
resp.raise_for_status()
except requests.exceptions.ProxyError:
Esto activa el mecanismo de cambio automático de IP de ipipgo.
except json.
JSONDecodeError: print("¡El JSON devuelto no es un JSON correcto!")
except KeyError as e.
print(f "El campo no existe: {str(e)}")
Un último despotrique, usted tiene que mirar en un servicio de proxy como ipipgo con enrutamiento inteligente. Recientemente ha añadido un nuevoasignación dinámica de puertoscon la API para obtener la última lista de proxy, más fiable que escribir una dirección IP muerta. La próxima vez que te encuentres con un atasco de análisis JSON, recuerda comprobar primero si la IP está restringida, y cambiar el canal a uno diferente.