Поиск изображения urllib Python3

Я пишу небольшой скрипт Python для захвата изображений через изображения Google. Мне удалось довести дело до того, что у меня есть URL-адреса изображений, которые я хочу, в удобном списке. Теперь мне просто нужно их схватить...

для каждого URL-адреса изображения я делаю это:

    print("Retrieving:{0}".format(sFinalImageURL))
    sExt = sFinalImageURL.split('.')[-1]
    #u = urllib.request.urlopen(sFinalImageURL)
    try:
        u = urllib.request.urlopen(sFinalImageURL)
    except:
        print("error: cannot retrieve image")
        continue
    raw_data = u.read()
    print("read {0} bytes".format(len(raw_data)))
    u.close()
    global sImagesFolder
    try:
        f = open("{0}/{1}_{2}.{3}".format(sImagesFolder,sImage,i,sExt),'wb')
        f.write(raw_data)
        f.close()
    except:
        print("couldn't write to {0}/{1}_{2}.{3}".format(sImagesFolder,sImage,i,sExt))
    print()

Вот проблемы, с которыми я сталкиваюсь:

попытка открыть некоторые URL-адреса дает мне 403, хотя я могу открывать URL-адреса прямо в своем браузере. Итак, в заголовке HTTP-запроса есть что-то, что не нравится серверу изображений... есть идеи?

Вот некоторые результаты:

Retrieving:http://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Timba%2B1.jpg/220px-Timba%2B1.jpg

error: cannot retrieve image

Retrieving:http://upload.wikimedia.org/wikipedia/commons/thumb/2/26/YellowLabradorLooking_new.jpg/260px-YellowLabradorLooking_new.jpg

error: cannot retrieve image
Retrieving:http://1.bp.blogspot.com/-7SsJ1n3RdoA/Tf07NOgD5nI/AAAAAAAAABo/tl8qLLIU01Y/s1600/english-shepherd-dog-0003.jpg

read 11123 bytes

Retrieving:http://completedogfood.net/wp-content/uploads/2010/07/complete-dog-food.bmp
read 419630 bytes

person Sheena    schedule 08.06.2012    source источник
comment
Можете ли вы предоставить некоторые реальные URL-адреса, с которыми вы работаете?   -  person Oleh Prypin    schedule 08.06.2012
comment
@BlaXpirit: конечно. Я прикрепил часть вывода своей программы к нижней части Q.   -  person Sheena    schedule 08.06.2012
comment
Вы пробовали установить пользовательский агент?   -  person Scharron    schedule 08.06.2012


Ответы (1)


Похоже, Википедия разрешает доступ только к реальным браузерам.
Проблему можно решить, указав строку User-Agent реального браузера, потому что urllib Python по умолчанию отправляет что-то вроде Python-urllib/3.2.

Вот пример, который работает (со строкой User-Agent браузера, который я использую):

url = 'http://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Timba%2B1.jpg/220px-Timba%2B1.jpg'
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/12.04 Chromium/18.0.1025.168 Chrome/18.0.1025.168 Safari/535.19'
u = urllib.request.urlopen(urllib.request.Request(url, headers={'User-Agent': user_agent}))
person Oleh Prypin    schedule 08.06.2012
comment
Не нужно врать и прикидываться браузером. Просто поместите все, что идентифицирует ваш скрипт, в поле пользовательского агента. Не используйте User-Agent по умолчанию, предоставленный вашей клиентской библиотекой, а создайте собственный заголовок, который идентифицирует ваш сценарий или службу и предоставляет некоторые средства связи с вами (например, адрес электронной почты). mediawiki.org/wiki/API:Main_page#Identifying_your_client - person computermacgyver; 07.10.2014