ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python从Web爬网URL下载数据文件

2019-11-20 13:56:27  阅读:276  来源: 互联网

标签:beautifulsoup urllib python-requests urllib2 python


我正在尝试开发一个自动化脚本,以将以下数据文件下载到实用程序服务器,然后进行ETL相关处理.寻找pythonic建议.对urllib,urllib2,漂亮的汤,请求,机械化,硒等之间的此类过程的当前最佳选择不熟悉.

The Website

“完全替代每月NPI文件”

The Monthly Data File

文件名(和后续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")

我没想到这个笨拙的政府的内容.网站进行更改,因此尽管我只选择了已抓取的网址列表的第三个元素就足够了.当然,如果我的整个方法都做错了,我欢迎进行更正(数据分析是个人的长处).另外,如果我使用的是过时的库,非Python实践或性能低下的选项,我绝对欢迎更新更好的!

解决方法:

通常,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]中的正则表达式基本上说要查找以“ 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.但是整个方案确实取决于名称的规则性.您可以在正则表达式搜索中添加标志以舍弃字母的大小写,这会使它接受更多.

标签:beautifulsoup,urllib,python-requests,urllib2,python
来源: https://codeday.me/bug/20191120/2044562.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有