Форум сайта python.su
0
Привет всем, хочу скачать изображение с сайта, но оно постоянно разное и название соответственно тоже меняется, хочу скачать его через код, но не знаю его названия, помогите
UPD: если его качать, то качать надо с помощью названия, а название разное типо
надеюсь объяснил понятно
Отредактировано utyara3 (Июнь 7, 2022 21:20:41)
Офлайн
124
utyara3какое изображение с какого сайта?
Привет всем, хочу скачать изображение с сайта
Офлайн
0
xam1816хыхыхы, ну в общем с prnt.sc/ ты вводишь после / комбинацию букв любую и он выдает скриншот абсолютно рандомный скрин рандомного человека, например prnt.sc/ytr13m и программа создает рандом ссылку переходит и скачивает изображение, у меня проблема с переходом на сайт и скачиванием, сколько пытался на scrapy, requests, Beautiful Soup, не мое это, но научится хочется, спасибо заранее за помощь
Офлайн
857
Напиши первую функцию, которая просто генерирует ссылку.
Напиши вторую функцию, которая заходит по известной ссылке и скачивает изображение.
Напиши третью функцию, которая сначала вызывает первую функцию и получает из неё ссылку, а потом вызывает вторую функцию, передаёт в неё полученную ссылку и скачивает изображение.
Офлайн
0
py.user.nextмолодец!! круто подсказал! я написал что не знаю как скачать изображения если ты не знаешь его имени
Напиши первую функцию, которая просто генерирует ссылку.Напиши вторую функцию, которая заходит по известной ссылке и скачивает изображение.Напиши третью функцию, которая сначала вызывает первую функцию и получает из неё ссылку, а потом вызывает вторую функцию, передаёт в неё полученную ссылку и скачивает изображение.
Офлайн
0
нашел скрипт еле как!
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()
Офлайн
857
utyara3А тебе не кажется, что он выглядит как-то странновато и что-то как-то немного похож на какое-то говно из папье-маше?
нашел скрипт еле как!
utyara3Давно я не видел этот метод, уже лет десять. Примерно тогда или даже раньше он нужен был, чтобы понять, как бы питоном страницу скачать. Тогда эти средства в питоне были слабо развиты и проводилось много экспериментов всяких.opener = urllib.request.build_opener()
utyara3Так это не для тебя; это для того, кто тебе будет писать нормальный вариант. Сам-то ты не сможешь написать.
молодец!! круто подсказал!
utyara3Скачать не сложно, сложно будет делать всё остальное - то, что делается до скачивания и после скачивания.
я написал что не знаю как скачать изображения
Отредактировано py.user.next (Июнь 8, 2022 06:17:13)
Офлайн
124
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 картинки
Офлайн
857
xam1816Убери print'ы отовсюду. Функции должны делать только return. Когда нужно выводить что-то на экран, это должны делать отдельные выводящие функции, которым что-то там подаётся через аргументы, чтобы они могли сообразить, что выводить. Связано это с тем, что сегодня тебе надо выводить на экран, а завтра этот вывод на экран надо будет разом отключить во всей программе. Обычно это всё прикрепляется к одной маленькой опции в конфигурационном файле программы, где ты, например, поставил “print off” - и по всей программе вывод отключился, где ты написал “log on” - и по всей программе вывод в лог-файл пошёл. Так вот, когда у тебя внутри рабочих функций это всё замешано, ты не сможешь быстро включать и отключать вывод, перенаправлять его, да и просто менять формат вывода, что тоже часто бывает нужно. Часто нужно делать вывод более подробный или менее подробный, добавлять в него какие-то данные или, наоборот, скрывать в нём какие-то данные, чтобы экран не забивать. Всё это регулируется опциями, подаваемыми в программу (через командную строку и/или через файл настроек).
просто написал
Отредактировано py.user.next (Июнь 9, 2022 02:17:40)
Офлайн
0
py.user.nextОго, прости, я не думал что кто то код писать будет, я думал мне просто скажут что использовать, спасибо, что объяснил!
Офлайн