Python Загрузка файла данных с URL-адреса, извлеченного из Интернета

Я пытаюсь разработать автоматизированный сценарий для загрузки следующего файла данных на служебный сервер, а затем обработки, связанной с ETL. Ищу питонические предложения. Не знаком с текущими лучшими вариантами для этого типа процесса между urllib, urllib2, красивым супом, запросами, механизацией, селеном и т. д.

Веб-сайт

«Полная замена ежемесячного файла NPI»

Файл данных за месяц

Имя файла (и последующий URL-адрес) меняется ежемесячно.

Вот мой текущий подход:

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")

Я не ожидаю содержания этого неуклюжего правительства. site для изменения, поэтому я думаю, что достаточно просто выбрать 3-й элемент списка очищенных URL-адресов. Конечно, если весь мой подход ошибочен, я приветствую исправление (анализ данных — моя сильная сторона). Кроме того, если я использую устаревшие библиотеки, непитоновские методы или варианты с низкой производительностью, я определенно приветствую все новое и лучшее!


person Pylander    schedule 07.04.2015    source источник


Ответы (1)


В общем, запросы — это самый простой способ получить веб-страницы.

Если имя файла данных соответствует образцу NPPES_Data_Dissemination_<Month>_<year>.zip, что кажется логичным, вы можете запросить его напрямую;

import requests

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

Затем данные находятся в r.text.

Если имя файла данных менее точно, вы можете получить веб-страницу и использовать регулярное выражение для поиска ссылок на 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']

Регулярное выражение в In[4] в основном говорит о поиске строк, начинающихся с «http», содержащих «NPPES» и заканчивающихся на «.zip». Это недостаточно конкретно. Давайте изменим регулярное выражение, как показано ниже;

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']

Это дает нам URL-адреса файла, который мы хотим, а также еженедельные файлы.

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

Давайте отфильтруем еженедельные файлы:

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']

Это URL-адрес, который вы ищете. Но вся эта схема зависит от того, насколько регулярны имена. Вы можете добавить флаги к поиску регулярных выражений, чтобы отбросить регистр букв, что заставит его принимать больше.

person Roland Smith    schedule 07.04.2015
comment
Большое спасибо за вдумчивый и подробный ответ! Из того, что я видел, оказалось, что в настоящее время в большинстве случаев библиотека запросов стала предпочтительнее, чем urllib/красивый суп. Я буду инвестировать в изучение тонкостей запросов в будущем. - person Pylander; 08.04.2015