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.
"Archivo de NPI mensual de reemplazo completo"
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!