urlretrieve генерирует ошибку http 404 после нескольких загрузок

#python #web-scraping #beautifulsoup #python-requests

#питон #соскабливание полотна #прекрасный суп #python-запросы #python #очистка веб-страниц #beautifulsoup

Вопрос:

Я пытаюсь загрузить некоторые изображения таким образом:

 from bs4 import BeautifulSoup
import requests

url_ds3_part1 = 'https://darksouls3.wiki.fextralife.com'

url_ds3 = {
"daggers":"https://darksouls3.wiki.fextralife.com/Daggers",
"straight_swords":"https://darksouls3.wiki.fextralife.com/Straight Swords",
"great_swords":"https://darksouls3.wiki.fextralife.com/Greatswords",
"ultra_great_swords":"https://darksouls3.wiki.fextralife.com/Ultra Greatswords",
"curved_swords":"https://darksouls3.wiki.fextralife.com/Curved Swords",
"katanas":"https://darksouls3.wiki.fextralife.com/Katanas",
"curved_great_swords":"https://darksouls3.wiki.fextralife.com/Curved Greatswords",
"piercing_swords":"https://darksouls3.wiki.fextralife.com/Piercing Swords"
}

for url in url_ds3.values():
    content = requests.get(url).content
    soup = BeautifulSoup(content,'lxml') 
    image_tags = soup.findAll('img')
    [urllib.request.urlretrieve(url_ds3_part1 str(image_tag.get('src')), str('images_swords') str(image_tag.get('src'))) for image_tag in image_tags if (('forum' in str(image_tag.get('src'))) == False)
                                                                                                                                                     amp; (('None' in str(image_tag.get('src'))) == False)
                                                                                                                                                     amp; (('avatar' in str(image_tag.get('src'))) == False)
                                                                                                                                                     amp; (('Damage' in str(image_tag.get('src'))) == False)  
                                                                                                                                                     amp; (('Resist' in str(image_tag.get('src'))) == False)
                                                                                                                                                     amp; (('STR' in str(image_tag.get('src'))) == False)  
                                                                                                                                                     amp; (('DEX' in str(image_tag.get('src'))) == False)  
                                                                                                                                                     amp; (('INT' in str(image_tag.get('src'))) == False)  
                                                                                                                                                     amp; (('FTH' in str(image_tag.get('src'))) == False)   
                                                                                                                                                     amp; (('attack' in str(image_tag.get('src'))) == False)    
                                                                                                                                                     amp; (('normal' in str(image_tag.get('src'))) == False)    
    ]
  

Вы можете просто скопировать / вставить код, чтобы воспроизвести ошибку ошибки HHTP 404.
Я вроде как новичок в этом (первый раз, когда я делал очистку), но я подозреваю, что он борется с дубликатами или что-то в этом роде, вроде как борется с разложением этой проблемы?

Заранее спасибо за вашу помощь 🙂

РЕДАКТИРОВАТЬ: Забыл добавить url_ds3_part1 EDIT2: это должно дать вам представление об изображениях, которые я пытаюсь получить:

 for url in url_ds3.values():
    content = requests.get(url).content
    soup = BeautifulSoup(content,'lxml') 
    image_tags = soup.findAll('img')
    [print(url_ds3_part1 str(image_tag.get('src'))) for image_tag in image_tags if (('forum' in str(image_tag.get('src'))) == False)
                                                                                 amp; (('None' in str(image_tag.get('src'))) == False)
                                                                                 amp; (('avatar' in str(image_tag.get('src'))) == False)                   
                                                                                 amp; (('Damage' in str(image_tag.get('src'))) == False)  
                                                                                 amp; (('Resist' in str(image_tag.get('src'))) == False)
                                                                                 amp; (('STR' in str(image_tag.get('src'))) == False)  
                                                                                 amp; (('DEX' in str(image_tag.get('src'))) == False)  
                                                                                 amp; (('INT' in str(image_tag.get('src'))) == False)  
                                                                                 amp; (('FTH' in str(image_tag.get('src'))) == False)   
                                                                                 amp; (('attack' in str(image_tag.get('src'))) == False)    
                                                                                 amp; (('normal' in str(image_tag.get('src'))) == False)    
    ]
  

РЕДАКТИРОВАТЬ 3 :
Временно обошла проблему с попыткой

 for url in url_ds3.values():
    content = requests.get(url).content
    soup = BeautifulSoup(content,'lxml') 
    image_tags = soup.findAll('img')
    try:
        [urllib.request.urlretrieve(url_ds3_part1 str(image_tag.get('src')), str('images_swords') str(image_tag.get('src'))) for image_tag in image_tags if (('forum' in str(image_tag.get('src'))) == False)
                                                                                                                                                          amp; (('None' in str(image_tag.get('src'))) == False)
                                                                                                                                                          amp; (('avatar' in str(image_tag.get('src'))) == False)
                                                                                                                                                          amp; (('Damage' in str(image_tag.get('src'))) == False)  
                                                                                                                                                          amp; (('Resist' in str(image_tag.get('src'))) == False)
                                                                                                                                                          amp; (('STR' in str(image_tag.get('src'))) == False)  
                                                                                                                                                          amp; (('DEX' in str(image_tag.get('src'))) == False)  
                                                                                                                                                          amp; (('INT' in str(image_tag.get('src'))) == False)  
                                                                                                                                                          amp; (('FTH' in str(image_tag.get('src'))) == False)   
                                                                                                                                                          amp; (('attack' in str(image_tag.get('src'))) == False)    
                                                                                                                                                          amp; (('normal' in str(image_tag.get('src'))) == False)    
        ] 
    except:
        pass
  

Комментарии:

1. Какие изображения должен получить скрипт? Только значки, найденные в столбце "Name amp; Icon" ?

2. Извините, я оставил некоторую путаницу в коде, так как забыл определить свою переменную url_ds3_part1, теперь, если вы выполните все, да, вы должны получить значки, но в какой-то момент он перестанет восстанавливать все и выдаст сообщение об ошибке 404

Ответ №1:

При запуске вашего кода кажется, что некоторые URL-адреса являются абсолютными (они начинаются с https:// ), а некоторые нет. Вам нужно проверить это:

 import requests
import urllib.request
from bs4 import BeautifulSoup

url_ds3 = {
"daggers":"https://darksouls3.wiki.fextralife.com/Daggers",
"straight_swords":"https://darksouls3.wiki.fextralife.com/Straight Swords",
"great_swords":"https://darksouls3.wiki.fextralife.com/Greatswords",
"ultra_great_swords":"https://darksouls3.wiki.fextralife.com/Ultra Greatswords",
"curved_swords":"https://darksouls3.wiki.fextralife.com/Curved Swords",
"katanas":"https://darksouls3.wiki.fextralife.com/Katanas",
"curved_great_swords":"https://darksouls3.wiki.fextralife.com/Curved Greatswords",
"piercing_swords":"https://darksouls3.wiki.fextralife.com/Piercing Swords"
}


url_ds3_part1 = 'https://darksouls3.wiki.fextralife.com'

for url in url_ds3.values():
    print(url)

    content = requests.get(url).content
    soup = BeautifulSoup(content,'lxml') 
    image_tags = soup.findAll('img')

    for image_tag in image_tags:
        if ( (('forum' in str(image_tag.get('src'))) == False)
             amp; (('None' in str(image_tag.get('src'))) == False)
             amp; (('avatar' in str(image_tag.get('src'))) == False)
             amp; (('Damage' in str(image_tag.get('src'))) == False)  
             amp; (('Resist' in str(image_tag.get('src'))) == False)
             amp; (('STR' in str(image_tag.get('src'))) == False)  
             amp; (('DEX' in str(image_tag.get('src'))) == False)  
             amp; (('INT' in str(image_tag.get('src'))) == False)  
             amp; (('FTH' in str(image_tag.get('src'))) == False)   
             amp; (('attack' in str(image_tag.get('src'))) == False)    
             amp; (('normal' in str(image_tag.get('src'))) == False) ):

            if image_tag.get('src').startswith('http'):
                u = image_tag['src']
            else:
                u = url_ds3_part1   image_tag['src']

            urllib.request.urlretrieve(u, 'images_swords'   image_tag['src'].replace(url_ds3_part1, ''))