это не проблема с bs4, он делает именно то, что должен, основываясь на полученном html.Если вы посмотрите на html (НЕ IN DEV DEVLS, а скорее res.text
), у него есть src url для первых 3-х, тогда до 11-го элемента будет None, который снова является первым изображением.И вот как HTML-код, страница динамическая.
На самом деле есть лучший способ получить изображения с помощью API.Я также немного изменил код, чтобы немного его прояснить.Я также только проверил это быстро, но, надеюсь, это поможет вам:
import requests
import webbrowser
import math
import os
query=(input("What type of images would you like? "))
req_url = 'https://unsplash.com/napi/search/photos'
params = {
'query': query,
'xp': '',
'per_page': '30',
'page': '1'}
jsonObj = requests.get(req_url, params = params).json()
numb=int(input('There are %s "%s" images.\nHow many images do you want to save? ' %(jsonObj['total'], query)))
pages = list(range(1,math.ceil(numb/30)+1))
max_allowed = 50
fileNames = []
count = 1
for page in pages:
params = {
'query': query,
'xp': '',
'per_page': '30',
'page': page}
jsonObj = requests.get(req_url, params = params).json()
for item in jsonObj['results']:
pic_url = item['urls']['raw']
webbrowser.open(item['urls']['raw'])
valid_ans = False
while valid_ans == False:
ans = input("Do you want to save it? (y/n) ")
if ans.lower() == "y":
name=input("How to name it? ")
fileName=name+".jpg"
fileNames.append(fileName)
print ("Saving " + fileName + " to the hard drive")
with open(os.path.join("wallpapers",fileName), 'wb') as handle:
response = requests.get(pic_url, stream=True)
if not response.ok:
print (response)
for chunk in response.iter_content(100000):
handle.write(chunk)
valid_ans = True
elif ans.lower() == "n":
valid_ans = True
pass
else:
print ('Invalid response.')
count += 1
if count > numb:
print ('Reached your desired number of %s images.' %(numb))
break
if count > max_allowed:
print ('Reached maximum number of %s images allowed.' %(max_allowed))