instalar for español descargar python beautifulsoup urllib2 python-requests urllib
El archivo de datos mensuales

español - python 64 bits for windows



Archivo de datos de descarga de Python desde URL raspada por la web (1)

En general, las solicitudes son la forma más fácil de obtener páginas web.

Si el nombre de los archivos de datos sigue el patrón NPPES_Data_Dissemination_<Month>_<year>.zip , que parece lógico, puede solicitarlo directamente;

import requests url = "http://nppes.viva-it.com/NPPES_Data_Dissemination_{}_{}.zip" r = requests.get(url.format("March", 2015))

Los datos están entonces en r.text .

Si el nombre del archivo de datos es menos cierto, puede obtener la página web y usar una expresión regular para buscar enlaces a archivos zip ;

In [1]: import requests In [2]: r = requests.get(''http://nppes.viva-it.com/NPI_Files.html'') In [3]: import re In [4]: re.findall(''http.*NPPES.*/.zip'', r.text) Out[4]: [''http://nppes.viva-it.com/NPPES_Data_Dissemination_March_2015.zip'', ''http://nppes.viva-it.com/NPPES_Deactivated_NPI_Report_031015.zip'', ''http://nppes.viva-it.com/NPPES_Data_Dissemination_030915_031515_Weekly.zip'', ''http://nppes.viva-it.com/NPPES_Data_Dissemination_031615_032215_Weekly.zip'', ''http://nppes.viva-it.com/NPPES_Data_Dissemination_032315_032915_Weekly.zip'', ''http://nppes.viva-it.com/NPPES_Data_Dissemination_033015_040515_Weekly.zip'', ''http://nppes.viva-it.com/NPPES_Data_Dissemination_100614_101214_Weekly.zip'']

La expresión regular en In [4] básicamente dice encontrar cadenas que comienzan con "http", contienen "NPPES" y terminan con ".zip". Esto no es lo suficientemente específico. Cambiemos la expresión regular como se muestra a continuación;

In [5]: re.findall(''http.*NPPES_Data_Dissemination.*/.zip'', r.text) Out[5]: [''http://nppes.viva-it.com/NPPES_Data_Dissemination_March_2015.zip'', ''http://nppes.viva-it.com/NPPES_Data_Dissemination_030915_031515_Weekly.zip'', ''http://nppes.viva-it.com/NPPES_Data_Dissemination_031615_032215_Weekly.zip'', ''http://nppes.viva-it.com/NPPES_Data_Dissemination_032315_032915_Weekly.zip'', ''http://nppes.viva-it.com/NPPES_Data_Dissemination_033015_040515_Weekly.zip'', ''http://nppes.viva-it.com/NPPES_Data_Dissemination_100614_101214_Weekly.zip'']

Esto nos da las URL del archivo que queremos, pero también los archivos semanales.

In [6]: fileURLS = re.findall(''http.*NPPES_Data_Dissemination.*/.zip'', r.text)

Filtremos los archivos semanales:

In [7]: [f for f in fileURLS if ''Weekly'' not in f] Out[7]: [''http://nppes.viva-it.com/NPPES_Data_Dissemination_March_2015.zip'']

Esta es la URL que buscas. Pero todo este esquema depende de cuán regulares sean los nombres. Puede agregar indicadores a las búsquedas de expresiones regulares para descartar el caso de las letras, que lo haría aceptar más.

Estoy tratando de desarrollar una secuencia de comandos automatizada para descargar el siguiente archivo de datos a un servidor de utilidad y luego a un procesamiento relacionado con ETL. Buscando sugerencias pitónicas. No estoy familiarizado con las mejores opciones actuales para este tipo de proceso entre urllib, urllib2, sopa hermosa, solicitudes, mecanizado, selenio, etc.

El sitio web

"Archivo de NPI mensual de reemplazo completo"

El archivo de datos mensuales

El nombre del archivo (y la URL subsiguiente) cambia mensualmente.

Aquí está mi enfoque actual hasta ahora:

from bs4 import BeautifulSoup import urllib import urllib2 soup = BeautifulSoup(urllib2.urlopen(''http://nppes.viva-it.com/NPI_Files.html'').read()) download_links = [] for link in soup.findAll(href=True): urls = link.get(''href'', ''/'') download_links.append(urls) target_url = download_links[2] urllib.urlretrieve(target_url , "NPI.zip")

No estoy anticipando el contenido de este gobierno torpe. sitio para cambiar, así que pensé que solo seleccionar el tercer elemento de la lista de urls raspados sería suficiente. Por supuesto, si todo mi enfoque es erróneo, doy la bienvenida a la corrección (el análisis de datos es el fuerte personal). Además, si estoy usando bibliotecas desactualizadas, prácticas antiponéticas o opciones de bajo rendimiento, ¡sin dudas recibo las más nuevas y mejores!