Python 如何从网站自动下载压缩文件
我需要从没有唯一URL地址的网站自动下载压缩文件。数据在下面右侧相关下载下的链接中。我没有任何python或任何脚本的经验,因此我需要一个新手可以使用的工具。我还想知道自动化是否可以包括文件的解压缩 如有任何帮助/建议,我将不胜感激 你应该把和作为你的出发点。我会使用它编写一个脚本,每天运行一次,并检查zip文件链接中的新链接Python 如何从网站自动下载压缩文件,python,windows,python-2.7,selenium,selenium-webdriver,Python,Windows,Python 2.7,Selenium,Selenium Webdriver,我需要从没有唯一URL地址的网站自动下载压缩文件。数据在下面右侧相关下载下的链接中。我没有任何python或任何脚本的经验,因此我需要一个新手可以使用的工具。我还想知道自动化是否可以包括文件的解压缩 如有任何帮助/建议,我将不胜感激 你应该把和作为你的出发点。我会使用它编写一个脚本,每天运行一次,并检查zip文件链接中的新链接 import requests from bs4 import BeautifulSoup url = 'http://phmsa.dot.gov/pipeline/
import requests
from bs4 import BeautifulSoup
url = 'http://phmsa.dot.gov/pipeline/library/data-stats/distribution-transmission-and-gathering-lng-and-liquid-annual-data'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
all_hrefs = soup.find_all('a')
all_links = [link.get('href') for link in all_hrefs]
zip_files = [dl for dl in all_links if dl and '.zip' in dl]
这将获得主登录页上所有zip文件的列表(假设扩展名总是小写)。我只想将这些信息保存到一个SQLite数据库中,甚至只是一个纯文本文件,每个zip文件都在一行中。然后,当您运行脚本时,它将使用上面的代码获取链接,打开数据库(或文本文件)并进行比较,以查看其中是否有新内容
如果它找到了一个新的链接,那么你可以使用奇妙的库下载它。你需要这样的东西:
import os
import requests
root = 'http://phmsa.dot.gov/'
download_folder = '/path/to/download/zip/files/'
for zip_file in zip_files:
full_url = root + zip_file
r = requests.get(full_url)
zip_filename = os.path.basename(zip_file)
dl_path = os.path.join(download_folder, zip_filename)
with open(dl_path, 'wb') as z_file:
z_file.write(r.content)
下面是一个完整的示例,每次运行时都会下载页面上的所有zip文件:
import os
import requests
from bs4 import BeautifulSoup
url = 'http://phmsa.dot.gov/pipeline/library/data-stats/distribution-transmission-and-gathering-lng-and-liquid-annual-data'
root = 'http://phmsa.dot.gov/'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
all_hrefs = soup.find_all('a')
all_links = [link.get('href') for link in all_hrefs]
zip_files = [dl for dl in all_links if dl and '.zip' in dl]
download_folder = '/home/mdriscoll/Downloads/zip_files'
if not os.path.exists(download_folder):
os.makedirs(download_folder)
for zip_file in zip_files:
full_url = root + zip_file
r = requests.get(full_url)
zip_filename = os.path.basename(zip_file)
dl_path = os.path.join(download_folder, zip_filename)
with open(dl_path, 'wb') as z_file:
z_file.write(r.content)
更新#2-添加解压缩功能:
import os
import requests
import zipfile
from bs4 import BeautifulSoup
url = 'http://phmsa.dot.gov/pipeline/library/data-stats/distribution-transmission-and-gathering-lng-and-liquid-annual-data'
root = 'http://phmsa.dot.gov/'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
all_hrefs = soup.find_all('a')
all_links = [link.get('href') for link in all_hrefs]
zip_files = [dl for dl in all_links if dl and '.zip' in dl]
download_folder = '/home/mdriscoll/Downloads/zip_files'
if not os.path.exists(download_folder):
os.makedirs(download_folder)
tries = 0
for zip_file in zip_files:
full_url = root + zip_file
zip_filename = os.path.basename(zip_file)
dl_path = os.path.join(download_folder, zip_filename)
if os.path.exists(dl_path):
# you have already downloaded this file, so skip it
continue
while tries < 3:
r = requests.get(full_url)
dl_path = os.path.join(download_folder, zip_filename)
with open(dl_path, 'wb') as z_file:
z_file.write(r.content)
# unzip the file
extract_dir = os.path.splitext(os.path.basename(zip_file))[0]
try:
z = zipfile.ZipFile(dl_path)
z.extractall(os.path.join(download_folder, extract_dir))
break
except zipfile.BadZipfile:
# the file didn't download correctly, so try again
# this is also a good place to log the error
pass
tries += 1
导入操作系统
导入请求
进口拉链
从bs4导入BeautifulSoup
url='1〕http://phmsa.dot.gov/pipeline/library/data-stats/distribution-transmission-and-gathering-lng-and-liquid-annual-data'
根http://phmsa.dot.gov/'
r=请求。获取(url)
soup=BeautifulSoup(r.text'html.parser')
all\u hrefs=soup.find\u all('a'))
所有链接=[link.get('href')表示所有链接中的链接]
zip_文件=[dl代表所有链接中的dl,如果dl和.zip代表dl]
download_folder='/home/mdriscoll/Downloads/zip_files'
如果不存在os.path.(下载文件夹):
os.makedirs(下载\u文件夹)
尝试=0
对于zip_文件中的zip_文件:
完整url=root+zip\u文件
zip\u filename=os.path.basename(zip\u文件)
dl_path=os.path.join(下载文件夹,zip文件名)
如果os.path.存在(dl_路径):
#您已经下载了此文件,请跳过它
持续
而<3时:
r=请求.get(完整url)
dl_path=os.path.join(下载文件夹,zip文件名)
打开(dl_路径,'wb')作为z_文件:
z_file.write(r.content)
#解压缩文件
extract_dir=os.path.splitext(os.path.basename(zip_文件))[0]
尝试:
z=zipfile.zipfile(dl_路径)
z、 extractall(os.path.join(下载\u文件夹,extract\u目录))
打破
除zipfile.BadZipfile外:
#文件下载不正确,请重试
#这也是记录错误的好地方
通过
尝试次数+=1
我在测试中注意到,有时文件无法正确下载,我会得到一个
BadZipFile
错误,因此我添加了一些代码,在继续下载下一个文件之前会尝试3次。您好,欢迎使用StackOverflow。你应该改进你的答案,表现出一些努力,并提供更多细节。请阅读。在这里,询问软件建议的问题类型是不够的。不过,您可以试试看是否符合您的目的。好的,我可以在我的计算机上下载并安装Python以及“请求”和“美化组”。因为我是Python的新手,所以我安装了“PyCharm-Edu”来运行代码。我尝试使用PhyCharmEdu运行这两个脚本,但没有得到任何回报。我能够找到zip文件的URL(见下文)。你能告诉我如何让文件自动下载吗?另外,是否可以通过脚本自动解压缩文件?我添加了一个完整的示例,可以下载所有的zip文件,但不检查您是否已经下载了它。这应该很容易添加。Python有一个zipfile
模块,可以用来解压它们-Mike,谢谢你的脚本。它工作得很好。我将看一看要解压缩文件的文档。用zipfile示例Mike再更新一次-太棒了!它工作得很好。谢谢你的帮助。