Задать вопрос
InvictusManeo
@InvictusManeo
P.A.N.D.E.M.I.C.

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

есть спиоск ссылок нужно чтобы он переберал список по 1 ссылке, переходил по ней, затем качал картинки каждый раз с новым именем, я пытался есть несколько вариантов скрипта, кто поможет с ошибкой?
1вар)
import requests
from requests import Session
from bs4 import BeautifulSoup
import re
from multiprocessing.dummy import Pool as ThreadPool

#s = Session()

def get_photo_from_page():
	tut = []
	names = []
	r = requests.get('https://vk.com/uporols_you').text
	soup = BeautifulSoup(r, 'lxml')
	im = soup.find_all('img', class_="ph_img")

	for a in im:
		s = a.get('data-src_big').split('|')[0]
		tut.append(s)

	y = "img%s.jpg"
	for im in [y % i for i in range(1,5)]:
		names.append(im)

	for t, a in tut, names:
		p = requests.get(t)
		out = open(a, "wb")
		out.write(p.content)
		out.close()

def main():
	get_photo_from_page()

if __name__ == '__main__':
	main()


2var)
import requests
from requests import Session
from bs4 import BeautifulSoup
import re
from multiprocessing.dummy import Pool as ThreadPool

#s = Session()

def get_photo_from_page():
	tut = []
	r = requests.get('https://vk.com/uporols_you').text
	soup = BeautifulSoup(r, 'lxml')
	im = soup.find_all('img', class_="ph_img")

	for a in im:
		s = a.get('data-src_big').split('|')[0]
		tut.append(s)

	y = "img%s.jpg"
	for t in tut:
		p = requests.get(t)
		for im in [y % i for i in range(1,5)]:
			out = open(im, "wb")
			out.write(p.content)
			out.close()

def main():
	get_photo_from_page()

if __name__ == '__main__':
	main()

во 2 варианте, он берет все ссылки на фото, и х засовывает в словарь, затем берет последнею ссылку и только последнею и сохраняет ее то кол-во раз сколько указано в цикле
  • Вопрос задан
  • 447 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@javedimka
Хочу сока
import requests
import bs4


tut = []
names = []

r = requests.get('https://vk.com/uporols_you').text
soup = bs4.BeautifulSoup(r, 'lxml')
im = soup.find_all('img', class_='ph_img')

for a in im:
    s = a.get('data-src_big').split('|')[0]
    tut.append(s)

for num, link in enumerate(tut):
    p = requests.get(link)
    out = open("img%s.jpg" % (num), 'wb')
    out.write(p.content)
    out.close()


Все 5 смешных картинок сохранились в папку с именами (img0.jpg, img1.jpg и т.д.)
for num, link in enumerate(tut, start=1): - если надо чтобы начиналось с 1, а не с нуля.

Почему у тебя не работало? Ну в первом случае потому что range(1,5) дает последовательность чисел от единицы до 5, не включая 5, т.е. 1, 2, 3, 4. Получается картинок у тебя 5, а имен 4. Потом в один прекрасный момент в твоем цикле:

for t, a in tut, names:

переменной t был присвоен линк, а переменной а имя присвоено не было, поэтому ты получил ошибку:

ValueError: too many values to unpack (expected 2)

Хардкодить такое вообще странно, можно(не нужно) использовать "in len(range(tut))", а потом когда подскажут про enumerate - использовать enumerate.

Вот только в первый раз код немного другой у тебя был, с генератором прямо в цикле. Теперь понятно почему я посоветовал посмотреть в генератор?

Почему у тебя второй вариант не работал? Ну потому что надо понимать как работают вложенные циклы for в питоне. Чтобы понять, можно запустить такой код в интерпретаторе или терминале
for i in ('a', 'b', 'c', 'd'):
    for x in ('1', '2', '3', '4'):
        print(i + " => " + x)

Ты просто на каждой итераций 4 раза сохранял одну картинку и присваивал ей разные имена, потом на следующем линке делал тоже самое перезаписывая те 4 сохраненные картинки, в итоге все последние 4 сохраненные картинки это одна и та же картинка с последнего линка.

Удачи.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы