#python #file #web-scraping #python-requests #download
Вопрос:
У меня здесь есть сайт, на котором есть такая структура ссылок
https://example.com/assets/contents/1627347928.mp4
Видеоплеер 00:0000:00
Видеоплеер 00:0000:00
И я хочу использовать python, чтобы получить все ссылки для загрузки, когда я получаю доступ к папке /активы/содержимое/ я получаю ошибку 404, поэтому я не могу видеть все носители для загрузки из этой веб-папки, но я знаю, что все файлы MP4 содержат 10 символов, и все они начинаются с «1627******.mp4»
Могу ли я выполнить ЦИКЛ, чтобы проверить все ссылки с этого веб-сайта и получить все ДЕЙСТВИТЕЛЬНЫЕ ссылки? Спасибо!!!!!!!!!!!! Я новичок в python прямо сейчас!
Я мог бы проверить, есть ли у меня носитель mp4/носитель с этим кодом, я могу видеть заголовки файла, но как сделать цикл, чтобы проверить все ссылки и загрузить автоматически? Или просто покажите мне действительные ссылки? Спасибо!!
import requests
link = 'https://example.com/assets/contents/1627347923.mp4'
r = requests.get(link, stream=True)
print(r.headers)
Комментарии:
1. Откуда вы берете ссылки? html-страница? Опубликуйте конкретную информацию об этом, пожалуйста.
2. У меня здесь нет всех ссылок, и я не могу размещать здесь РЕАЛЬНЫЕ ссылки, потому что это частный контент, но структура ссылок его example.com/assets/contents/1627******.mp4, я хочу сделать цикл из 6 символов с 000000 по 999999 и получить все носители! Теперь понимаешь?
3.
names = [ 1627347923, 1627347924, 1627347925]
составьте список, повторите его и создайте ссылки по мере'https://example.com/assets/contents/{}.mp4'.format(item)
Ответ №1:
Печать, если файл существует или нет
import requests
names = [ 1627347923, 1627347924, 1627347925]
base = 'https://example.com/assets/contents/{}.mp4'
for item in names:
link = base.format(item)
print(link)
r = requests.head(link, allow_redirects=True)
if r.status_code == 200:
print("found {}.mp4".format(item))
#open('{}.mp4'.format(item), 'wb').write(r.content)
else:
print("File no found or error getting headers")
Или попробуйте скачать его
import requests
names = [ 1627347923, 1627347924, 1627347925]
base = 'https://example.com/assets/contents/{}.mp4'
for item in names:
link = base.format(item)
print(link)
# uncomment below to download
#r = requests.get(link, allow_redirects=True)
#open('{}.mp4'.format(item), 'wb').write(r.content)
Комментарии:
1. Хорошо, и если я хочу заполнить массив с 0000000000 до 9999999999, что я делаю?
2. упс, это 1 миллиард цифр. Не уверен, что ты можешь или хочешь это сделать. Это означало бы 1 миллиард запросов на этот сайт
3. извините, только с 1626000000 по 1627999999
4. У вас есть цифры, погуглите, как составить список из этой последовательности. С 11 июля по 3 августа, кстати.
Ответ №2:
да, вы можете запустить цикл, проверить код состояния или, если requests.get() выдает ошибку, вы возвращаетесь и, как таковой, получаете все файлы, но есть некоторые проблемы, которые могут помешать вам выбрать это
- Ваши файлы находятся в формате «1627******.mp4», что означает, что цикл for будет проверять наличие 10^6 записей, если все * являются числами, что неэффективно. Если вы планируете включать символы и специальные символы, это будет крайне неэффективно.
- Что делать, если в будущем у вас будет более 10^6 файлов? Ваш формат должен будет измениться, и поэтому ваш код должен будет измениться.
Гораздо более простым, прямым и эффективным решением было бы иметь место для хранения ваших данных, файл или, лучше, базу данных, где вы можете просто запросить и получить все ваши файлы. Вы можете просто запустить свой запрос, чтобы получить необходимые сведения.
Кроме того, ошибка 404 означает, что страница, на которую вы пытаетесь перейти, не найдена, в вашем случае это, по сути, означает, что она не существует.
Пример кода a/c, чтобы проверить, существует ли ссылка
files = []
links = ["https://www.youtube.com/","https://docs.python.org","https://qewrt.org"]
for i in links:
try:
requests.get(i) // If link doesnt exists, it throws an error, else the link is appended to the files list
files.append(i)
except:
print(i " doesnt exist")
print(files)
Основываясь на этом, в зависимости от вашего состояния, проверьте все файлы, существуют ли они в данном формате:
import requests
file_prefix = 'https://example.com/assets/contents/1627'
file_lists = []
for i in range(10**6):
suffix = (6-len(str(i)))*"0" str(i) ".mp4"
file_name = file_prefix suffix
try:
requests.get(file_name)
file_lists.append(file_name)
except:
continue
for i in file_lists:
print(i)
Комментарии:
1. Шашанка, все ссылки имеют формат 10 символов и все цифры, никогда буквы или специальные символы, я просто хочу, чтобы все действительные ссылки были напечатаны в cmd или txt-файле…
2. Я понимаю это, я говорю, что если в будущем у вас будет больше файлов.
3. Я добавил пример кода, чтобы получить желаемые результаты, но будьте осторожны, это займет время из-за того же объяснения, которое я давал ранее.
Ответ №3:
Основываясь на всех ваших кодах и кодах LMC, я делаю то, что проверяю все файлы MP4 и показываю мне «заголовки», как я могу выбирать ссылки только у того, у кого есть допустимый файл mp4, такой как ссылка
import requests
file_prefix = 'https://example.com/assets/contents/1627'
file_lists = []
for i in range(10**6):
suffix = (6-len(str(i)))*"0" str(i) ".mp4"
file_name = file_prefix suffix
try:
requests.get(file_name)
file_lists.append(file_name)
r = requests.get(file_name, stream=True)
print(file_name)
print(r.headers)
except:
continue
for i in file_lists:
print(i)