LINUX.ORG.RU

Скачка файлов в python с wget

 , , , ,


1

1

Использую python - 3.7.4

ОС - arch

wget - 1.20.3


Есть небольшая программка, которая парсит json и получает из него url картинки, которые нужно скачать и поместить в папку temp/.

Решил использовать os.system с wget:

image = image["node"]
os.system("wget -q -O temp/{}.jpg {}".format(count, image["display_url"]))

В image[«display_url»] лежит url картинки, которую нужно скачать.

Решение выше работало месяца два или чуть больше, но потом резко все полетело. Python почему-то начал передавать во wget обрезанные ссылки(буквально). Вот что я имею ввиду:

image = image["node"]
s = image["display_url"]
print(s)
print()
os.system("wget -q -O temp/{}.jpg {}".format(count, s))

Вывод данного куска кода:

https://scontent-frx5-1.cdninstagram.com/v/t51.2885-15/e35/75412663_553126615246834_6936495500322459169_n.jpg?_nc_ht=scontent-frx5-1.cdninstagram.com&_nc_cat=110&oh=100064bf37a5758e2a58fc8d4d346018&oe=5E894821

--2019-11-22 18:01:21--  https://scontent-frx5-1.cdninstagram.com/v/t51.2885-15/e35/75412663_553126615246834_6936495500322459169_n.jpg?_nc_ht=scontent-frx5-1.cdninstagram.com
Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt'
Resolving scontent-frx5-1.cdninstagram.com (scontent-frx5-1.cdninstagram.com)... 185.60.216.52, 2a03:2880:f22d:c4:face:b00c:0:43fe
Connecting to scontent-frx5-1.cdninstagram.com (scontent-frx5-1.cdninstagram.com)|185.60.216.52|:443... connected.
GnuTLS: Resource temporarily unavailable, try again.
GnuTLS: Resource temporarily unavailable, try again.
HTTP request sent, awaiting response... 403 Forbidden
2019-11-22 18:01:21 ERROR 403: Forbidden.

Т.е. он берет ссылку(из переменной s, с которой вручную wget спокойно отрабатывает) и обрубает ее до символа &, с которой wget пишет пустые файлы в temp/

Если кто-то хочет проверить как это работает и лень вбивать:

import os

s = "https://scontent-frx5-1.cdninstagram.com/v/t51.2885-15/e35/75412663_553126615246834_6936495500322459169_n.jpg?_nc_ht=scontent-frx5-1.cdninstagram.com&_nc_cat=110&oh=100064bf37a5758e2a58fc8d4d346018&oe=5E894821"
print(s)
os.system("wget -O {}.jpg {}".format(1, s))

Данная ошибка повторяется как на raspberry pi 3(arch), так и на двух других десктопах с ОС arch.

В чем может быть проблема и как ее решить? Этот способ у меня спокойно работал почти три месяца и тут ни с того ни с сего появилась данная проблема, причем на разных системах…



Последнее исправление: wh75per (всего исправлений: 1)

url надо взять в кавычки, например,

os.system('wget -O {}.jpg "{}"'.format(1, s))

Другой вариант как-то так

args = ['wget', '-O', 'filename', url]

ps = Popen(args, stdout=PIPE)
ps.wait()

pawnhearts ★★★★★
()
Последнее исправление: pawnhearts (всего исправлений: 1)
Ответ на: комментарий от pawnhearts

Спасибо большое! Это сработало (:

Меня только смущает тот факт, что оно продолжало работать на протяжении нескольких месяцев, неужели просто из-за того, что не попадались какие-то чувствительные символы?

wh75per
() автор топика
Ответ на: комментарий от wh75per

угу. дело тут не в питоне, а в sh, где & означает запустить процесс в фоне. В шелле надо аргументы заворачивать в кавычки.

pawnhearts ★★★★★
()

Как жаль тебе не попалась ссылка http://example.com/;rm -rf /*

Открой для себя requests:

import requests

with open('out', 'wb') as fd:
    for chunk in requests.get('https://google.com', stream=True).iter_content(chunk_size=65536):
        fd.write(chunk)
slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)
Ответ на: комментарий от slovazap

Ахахахха, ну да, вот это уууф. Даже не подумал об этом, когда писал свой быдлокод :( Спасибо за совет большое, исправил на реквесты

wh75per
() автор топика
Ответ на: комментарий от WitcherGeralt

Например потому что «байндинги» почти под все языки есть? В итоге один инструмент вместо зоопарка.

invy ★★★★★
()
Ответ на: комментарий от invy

Не идиоматичное говно и бойлерплейтинг на всех языках, найс.

WitcherGeralt ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.