2016-03-22 3 views
-2

Мне нужно автоматизировать загрузку zipped-файлов с веб-сайта, на котором нет уникальных URL-адресов. данные находятся в ссылке ниже под соответствующей загрузкой справа. У меня нет опыта работы с python или скриптом, поэтому мне нужен инструмент, который может использовать новичок. Я также знаю, может ли автоматизация включать распаковку файлов.Как автоматизировать загрузку zip-файла с веб-сайта

Буду признателен за любую помощь/советую.

http://phmsa.dot.gov/pipeline/library/data-stats/distribution-transmission-and-gathering-lng-and-liquid-annual-data

+0

Привет, добро пожаловать в StackOverflow. Вы должны улучшить свой ответ, показать некоторые усилия и предоставить более подробную информацию. Пожалуйста, прочитайте [Как спросить] (http://stackoverflow.com/help/how-to-ask). Тип вопроса, требующий рекомендаций по программному обеспечению, здесь не подходит. Тем не менее, вы можете попробовать посмотреть, работает ли [Flashget] (http://www.flashget.com/). – iled

ответ

1

Вы должны смотреть на BeautifulSoup и requests как ваше стартовое место. Я бы написал сценарий, который будет работать один раз в день и проверять ссылки на 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] 

Это поможет вам список всех почтовых файлов (если предположить, что расширение всегда в нижнем регистре) на этой целевой. Я бы просто сохранил эту информацию в базе данных SQLite или даже просто текстовом файле, который имеет каждый zip-файл в одной строке. Затем, когда вы запускаете скрипт, он будет захватывать ссылки, используя приведенный выше код, открывать базу данных (или текстовый файл) и сравнивать, чтобы увидеть, есть ли что-то новое в нем.

Если он найдет новую ссылку, вы можете скачать ее с помощью замечательной библиотеки requests. Вам нужно будет что-то вроде этого:

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) 

Вот полный пример, который будет просто загрузить все файлы почтового индекса на странице каждый раз, когда вы запускаете его:

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) 

Update # 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 

я заметил в моих тестах, что иногда файл будет не правильно загрузить и я хотел бы получить BadZipFile ошибка, поэтому я добавил код, который будет пробовать 3 раза, прежде чем переходить к следующему загружаемому файлу.

+0

ОК, я смог загрузить и установить Python на свой компьютер, а также «запросы» и «BeautifulSoup». Поскольку я новичок в Python, я установил «PyCharm Edu» для запуска кода. Я попытался запустить оба скрипта с помощью PhyCharmEdu, и я ничего не получил. Мне удалось найти URL-адрес для zip-файлов (см. Ниже). Не могли бы вы показать мне, как загрузить файл автоматически? Кроме того, можно ли разархивировать файл автоматически через скрипт? http://www.phmsa.dot.gov/staticfiles/PHMSA/DownloadableFiles/Pipeline2data/annual_hazardous_liquid_2010_present.zip – Gloria

+0

Я добавил полный пример, который загружает все zip-файлы, но не проверяет, есть ли у вас уже загрузил его. Это должно быть легко добавить. Python имеет модуль zipfile, который должен работать для их распаковки - https://docs.python.org/2/library/zipfile.html –

+0

Майк, Спасибо за скрипт. Он работает отлично. Я просмотрю документ, чтобы распаковать файлы. – Gloria

Смежные вопросы