Найти - Пользователи
Полная версия: Скачать изображение с сайта, не зная название файла
Начало » Python для новичков » Скачать изображение с сайта, не зная название файла
1 2
utyara3
Привет всем, хочу скачать изображение с сайта, но оно постоянно разное и название соответственно тоже меняется, хочу скачать его через код, но не знаю его названия, помогите
UPD: если его качать, то качать надо с помощью названия, а название разное типо
надеюсь объяснил понятно
xam1816
utyara3
Привет всем, хочу скачать изображение с сайта
какое изображение с какого сайта?
utyara3
xam1816
хыхыхы, ну в общем с prnt.sc/ ты вводишь после / комбинацию букв любую и он выдает скриншот абсолютно рандомный скрин рандомного человека, например prnt.sc/ytr13m и программа создает рандом ссылку переходит и скачивает изображение, у меня проблема с переходом на сайт и скачиванием, сколько пытался на scrapy, requests, Beautiful Soup, не мое это, но научится хочется, спасибо заранее за помощь
py.user.next
Напиши первую функцию, которая просто генерирует ссылку.
Напиши вторую функцию, которая заходит по известной ссылке и скачивает изображение.
Напиши третью функцию, которая сначала вызывает первую функцию и получает из неё ссылку, а потом вызывает вторую функцию, передаёт в неё полученную ссылку и скачивает изображение.
utyara3
py.user.next
Напиши первую функцию, которая просто генерирует ссылку.Напиши вторую функцию, которая заходит по известной ссылке и скачивает изображение.Напиши третью функцию, которая сначала вызывает первую функцию и получает из неё ссылку, а потом вызывает вторую функцию, передаёт в неё полученную ссылку и скачивает изображение.
молодец!! круто подсказал! я написал что не знаю как скачать изображения если ты не знаешь его имени
???
utyara3
нашел скрипт еле как!
 from bs4 import BeautifulSoup
import urllib.request
import random
import string
url_base = 'https://prnt.sc/'
def get_html():
    global url_last3
    url_last3 = str(''.join(random.choice(string.digits + string.ascii_lowercase) for _ in range(3)))
    req = str(url_base + url_first3 + url_last3)
    html = urllib.request.urlopen(req).read()
    return html
def main():
    count = input('How many pictures I must download? ')
    pic_count = int(count)
    global url_first3
    url_first3 = input('Enter first 3 digits: ')
    print('OK! Now I`ll download ' + count + ' pictures with the "' + url_first3 + '" first digits!')
    opener = urllib.request.build_opener()
    opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
    urllib.request.install_opener(opener)
    for counter in range(pic_count):
        html = get_html()
        soup = BeautifulSoup(html, 'html.parser')
        picture_url = soup.find(id='screenshot-image')['src']
        urllib.request.urlretrieve(picture_url, picture_url[40:])
        count = counter + 1
        print (str(count) + '   [' + str(url_first3) + str(url_last3) + '] - [' + picture_url + '] - DONE!')
if __name__ == '__main__':
    main()
py.user.next
utyara3
нашел скрипт еле как!
А тебе не кажется, что он выглядит как-то странновато и что-то как-то немного похож на какое-то говно из папье-маше?

utyara3
  
opener = urllib.request.build_opener()
Давно я не видел этот метод, уже лет десять. Примерно тогда или даже раньше он нужен был, чтобы понять, как бы питоном страницу скачать. Тогда эти средства в питоне были слабо развиты и проводилось много экспериментов всяких.

utyara3
молодец!! круто подсказал!
Так это не для тебя; это для того, кто тебе будет писать нормальный вариант. Сам-то ты не сможешь написать.

utyara3
я написал что не знаю как скачать изображения
Скачать не сложно, сложно будет делать всё остальное - то, что делается до скачивания и после скачивания.

А сейчас ты в чайную кружку с чаем и сахаром налил бульон из борща и капусту положил оттуда же. Это, конечно, можно всё съесть и выпить, но это не чаепитие совсем, даже если тортик рядом поставить. Примерно вот это напоминает этот “твой” скрипт.
xam1816
utyara3
нашел скрипт еле как!
просто написал
 import re
import requests
import random
from string import ascii_lowercase, digits
from bs4 import BeautifulSoup
import os
#
ROOT_URL = r'https://prnt.sc/'
MY_HEADERS = {"user-agent": "Mozilla/5.0 (X11; Linux x86_64)"
                            " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.141"
                            " YaBrowser/22.3.3.889 Yowser/2.5 Safari/537.36",
              }
MY_PATH = '/home/xam/Загрузки/test_folder'
#
def get_random_char_set():
    out = ''
    for _ in range(random.randint(6, 7)):
        out += random.choice(ascii_lowercase+digits)
    return out
#
def get_html(url):
    resp = requests.get(url, headers=MY_HEADERS)
    if resp.ok:
        return resp.content
    else:
        print(resp.status_code)
#
def get_img_src_from_html(html):
    soup = BeautifulSoup(html, 'html.parser')
    search_img = soup.find(id='screenshot-image', src=re.compile(r'https'))
    if search_img:
        return search_img['src']
#
def download_img(path, img_src):
    resp = requests.get(img_src, headers=MY_HEADERS)
    if resp.status_code == 200:
        if resp.headers['content-type'] in ['image/png', 'image/jpeg']:
            with open(os.path.join(path,img_src.rsplit('/', 1)[1]), 'wb') as f:
                f.write(resp.content)
        else:
            print(resp.headers['content-type'])
    else:
        print(f'{img_src} status code:{resp.status_code}')
#
#
def download_several_img(count):
    i = 0
    while i < count:
        char_set = get_random_char_set()
        html = get_html(ROOT_URL+char_set)
        img_src = get_img_src_from_html(html)
        if img_src:
            print(char_set)
            download_img(MY_PATH, img_src)
            i += 1
        else:
            print('*')
#
if __name__ == '__main__':
    download_several_img(3) # загрузит 3 картинки
py.user.next
xam1816
просто написал
Убери print'ы отовсюду. Функции должны делать только return. Когда нужно выводить что-то на экран, это должны делать отдельные выводящие функции, которым что-то там подаётся через аргументы, чтобы они могли сообразить, что выводить. Связано это с тем, что сегодня тебе надо выводить на экран, а завтра этот вывод на экран надо будет разом отключить во всей программе. Обычно это всё прикрепляется к одной маленькой опции в конфигурационном файле программы, где ты, например, поставил “print off” - и по всей программе вывод отключился, где ты написал “log on” - и по всей программе вывод в лог-файл пошёл. Так вот, когда у тебя внутри рабочих функций это всё замешано, ты не сможешь быстро включать и отключать вывод, перенаправлять его, да и просто менять формат вывода, что тоже часто бывает нужно. Часто нужно делать вывод более подробный или менее подробный, добавлять в него какие-то данные или, наоборот, скрывать в нём какие-то данные, чтобы экран не забивать. Всё это регулируется опциями, подаваемыми в программу (через командную строку и/или через файл настроек).

Поэтому рабочие функции должны только работать. Выводящие функции должны только выводить. Связывает их между собой связывающая функция. У каждой функции только её дело. Функция не должна делать сто вещей одновременно. Функция не должна быть Дедом Морозом, который сам танцует, сам поёт, сам подарки раздаёт.


tags: pure function
utyara3
py.user.next
Ого, прости, я не думал что кто то код писать будет, я думал мне просто скажут что использовать, спасибо, что объяснил!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB