Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python从Web抓取URL下载数据文件_Python_Beautifulsoup_Urllib2_Python Requests_Urllib - Fatal编程技术网

Python从Web抓取URL下载数据文件

Python从Web抓取URL下载数据文件,python,beautifulsoup,urllib2,python-requests,urllib,Python,Beautifulsoup,Urllib2,Python Requests,Urllib,我正在尝试开发一个自动化脚本,将以下数据文件下载到实用程序服务器,然后进行ETL相关处理。寻找蟒蛇的建议。不熟悉urllib、urllib2、Beauty soup、requests、mechanize、selenium等之间这种类型流程的当前最佳选项 “完全替换每月NPI文件” 文件名(和后续url)每月更改一次 以下是我目前的做法: from bs4 import BeautifulSoup import urllib import urllib2 soup = BeautifulS

我正在尝试开发一个自动化脚本,将以下数据文件下载到实用程序服务器,然后进行ETL相关处理。寻找蟒蛇的建议。不熟悉urllib、urllib2、Beauty soup、requests、mechanize、selenium等之间这种类型流程的当前最佳选项

“完全替换每月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")
我并不期待这个笨重的政府网站上的内容会发生变化,所以我觉得只要选择第三个元素就足够了。当然,如果我的整个方法是错误的,我欢迎纠正(数据分析是我个人的强项)。此外,如果我使用的是过时的库、非音速的实践或低性能选项,我肯定会欢迎更新和更好的

通常是获取网页的最简单方法

如果数据文件的名称遵循似乎合乎逻辑的模式
NPPES\u data\u disposition\u.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']
[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。但整个方案确实取决于名称的规则性。您可以向正则表达式搜索添加标志,以放弃字母的大小写,这将使它接受更多

感谢您周到详细的回答!从我所看到的情况来看,在当今的大多数情况下,请求库似乎比urllib/Beauty soup更受欢迎。我将投资于学习未来请求的要点。