Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.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 如何从网站自动下载压缩文件_Python_Windows_Python 2.7_Selenium_Selenium Webdriver - Fatal编程技术网

Python 如何从网站自动下载压缩文件

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/

我需要从没有唯一URL地址的网站自动下载压缩文件。数据在下面右侧相关下载下的链接中。我没有任何python或任何脚本的经验,因此我需要一个新手可以使用的工具。我还想知道自动化是否可以包括文件的解压缩

如有任何帮助/建议,我将不胜感激

你应该把和作为你的出发点。我会使用它编写一个脚本,每天运行一次,并检查zip文件链接中的新链接

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再更新一次-太棒了!它工作得很好。谢谢你的帮助。