我正在尝试开发一个自动脚本,将以下数据文件下载到实用程序服务器,然后再进行ETL处理。寻找pythonic的建议。不熟悉urllib,urllib2,美味汤,请求,机械化,硒等之间此类过程的当前最佳选项。
“完全替换每月NPI文件”
文件名(和后续网址)每月更改一次。
这是我目前的方法:
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")
我不期待这个笨重的政府的内容。要更改的网站,所以我只是选择已删除网址列表的第3个元素就足够了。当然,如果我的整个方法都是错误的,我欢迎更正(数据分析是个人的强项)。此外,如果我使用过时的库,unpythonic实践或低性能选项,我绝对欢迎更新更好!
答案 0 :(得分:3)
一般来说requests是获取网页的最简单方法。
如果数据文件的名称遵循 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]中的正则表达式基本上是为了找到以&#34; http&#34;开头的字符串,包含&#34; NPPES&#34;并以&#34; .zip&#34;结束。 这不够具备意义。让我们改变正则表达式,如下所示;
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']
这是您寻找的网址。但这整个方案确实取决于名称的规律性。您可以向正则表达式搜索添加标记以丢弃字母的大小写,这将使其接受更多。