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