Я пытаюсь загрузить несколько файлов xls с этого ASPX сайта и его папок, используя urlretrieve из модуля urllib.request в Python3.7. Сначала я создаю текстовый файл с URL-адресами с сайта. Затем я перебираю список и прошу сервер извлечь файл xls, в соответствии с этим решением здесь .
Алгоритм начинает загружать файл xls в рабочем каталоге, но после 3 или 4 итераций он взламывается. Загруженные файлы (3 или 4) имеют неправильный размер (все они 7351 КБ, а не 99 КБ или 83 КБ, например). Удивительно, но это последний размер URL в текстовом файле.
Иногда журнал отправляет сообщение с ошибкой 500.
По последнему вопросу моя гипотеза / вопросы:
Ошибка возникает из-за брандмауэра, который предотвращает повторные вызовы на сервер
Возможно, вызовы нарушают асинхронные / асинхронные правила, неизвестные мне. Я использовал time.sleep, чтобы предотвратить ошибку, но она не удалась.
Первая проблема слишком странная и связана со второй.
Вот мой код:
import os
import time
from random import randint
from bs4 import BeautifulSoup
from urllib.parse import urljoin
from urllib.request import urlopen, urlretrieve, quote
url="http://informacioninteligente10.xm.com.co/transacciones/Paginas/HistoricoTransacciones.aspx"
u = urlopen(url)
try:
html = u.read().decode('utf-8')
finally:
u.close()
direcciones = [] #to be populated with urls
soup = BeautifulSoup(html)
for link in soup.select('div[webpartid] a'):
href = link.get('href')
if href.startswith('javascript:'):
continue
filename = href.rsplit('/', 1)[-1]
href = urljoin(url, quote(href))
#try:
# urlretrieve(href, filename)
#except:
# print('Downloading Error')
if any (href.endswith(x) for x in ['.xls','.xlsx','.csv']):
direcciones.append(href)
# "\n" adds a new line
direcciones = '\n'.join(direcciones)
#Save every element in a txt file
with open("file.txt", "w") as output:
output.write(direcciones)
DOWNLOADS_DIR = os.getcwd()
# For every line in the file
for url in open("file.txt"):
time.sleep(randint(0,5))
# Split on the rightmost / and take everything on the right side of that
name = url.rsplit('/', 1)[-1]
# Combine the name and the downloads directory to get the local filename
filename = os.path.join(DOWNLOADS_DIR, name)
filename = filename[:-1] #Quitamos el espacio en blanco al final
# Download the file if it does not exist
if not os.path.isfile(filename):
urlretrieve(href, filename)
Не использую ли я правильный анализатор URL?
Есть идеи? Спасибо!