Загрузка изображений с веб-страницы

Я хочу реализовать функцию, подобную этой http://www.tineye.com/parse?url=yahoo.com – разрешить пользователю загружать изображения с любой веб-страницы.

Основная проблема для меня в том, что для веб-страниц с большим количеством изображений требуется слишком много времени.

Я делаю это в Django (используя curl или urllib) в соответствии со следующей схемой:

  1. Захватите html страницы (занимает около 1 сек для больших страниц):

    file = urllib.urlopen(requested_url) html_string = file.read() 
  2. Разбирайте его с помощью HTML-парсера (BeautifulSoup), ищите теги img и записывайте все src изображений в список. (занимает около 1 сек для больших страниц)

  3. Проверьте размеры всех изображений в моем списке, и если они достаточно большие, верните их в ответ json (занимает очень много времени около 15 секунд, когда на веб-странице около 80 изображений). Вот код функции:

 def get_image_size(uri): file = urllib.urlopen(uri) p = ImageFile.Parser() data = file.read(1024) if not data: return None p.feed(data) if p.image: return p.image.size file.close() #not an image return None 

Как вы можете видеть, я не загружаю полное изображение, чтобы получить его размер, всего 1 килобайт. Но это занимает слишком много времени, когда есть много изображений (я вызываю эту функцию один раз для каждого найденного изображения).

Итак, как я могу заставить его работать быстрее?

Может быть, есть ли способ не делать запрос для каждого изображения?

Любая помощь будет высоко оценена.

Благодаря!

2 Solutions collect form web for “Загрузка изображений с веб-страницы”

я могу придумать немного оптимизаций:

  1. анализировать, когда вы читаете файл из потока
  2. используйте синтаксический анализатор SAX (что будет отлично с точкой выше)
  3. используйте HEAD, чтобы получить размер изображений
  4. используйте очередь для размещения своих изображений, затем используйте несколько потоков для подключения и получения размеров файлов

пример запроса HEAD:

 $ telnet m.onet.pl 80 Trying 213.180.150.45... Connected to m.onet.pl. Escape character is '^]'. HEAD /_m/33fb7563935e11c0cba62f504d91675f,59,29,134-68-525-303-0.jpg HTTP/1.1 host: m.onet.pl HTTP/1.0 200 OK Server: nginx/0.8.53 Date: Sat, 09 Apr 2011 18:32:44 GMT Content-Type: image/jpeg Content-Length: 37545 Last-Modified: Sat, 09 Apr 2011 18:29:22 GMT Expires: Sat, 16 Apr 2011 18:32:44 GMT Cache-Control: max-age=604800 Accept-Ranges: bytes Age: 6575 X-Cache: HIT from emka1.m10r2.onet Via: 1.1 emka1.m10r2.onet:80 (squid) Connection: close Connection closed by foreign host. 

Вы можете использовать атрибут headers файла как объект, возвращаемый urllib2.urlopen (я не знаю об urllib).

Вот тест, который я написал для него. Как вы можете видеть, это довольно быстро, хотя я думаю, что некоторые веб-сайты будут блокировать слишком много повторных запросов.

 |milo|laurie|¥ cat test.py import urllib2 uri = "http://download.thinkbroadband.com/1GB.zip" def get_file_size(uri): file = urllib2.urlopen(uri) content_header, = [header for header in file.headers.headers if header.startswith("Content-Length")] _, str_length = content_header.split(':') length = int(str_length.strip()) return length if __name__ == "__main__": get_file_size(uri) |milo|laurie|¥ time python2 test.py python2 test.py 0.06s user 0.01s system 35% cpu 0.196 total 
  • Переопределение urllib2.HTTPError или urllib.error.HTTPError и чтение ответа HTML в любом случае
  • Выполнение JavaScript в href ссылок с Python
  • Django: добавить изображение в ImageField из URL-адреса изображения
  • Время отклика для urllib в python
  • Python3 urllib.request не будет закрывать соединения немедленно
  • Тестирование прокси-сервера HTTPS в python
  • 'module' не имеет атрибута 'urlencode'
  • Как я могу тестировать модуль, который полагается на urllib2?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.