【问题标题】:Upload images from from web-page从网页上传图片
【发布时间】:2011-08-02 04:50:23
【问题描述】:

我想实现一个类似于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

如您所见,我没有加载完整的图像来获得它的大小,只有 1kb。但是当有很多图像时仍然需要太多时间(我为找到的每张图像调用一次此函数)。

那么我怎样才能让它工作得更快呢?

可能有什么方法可以不对每张图片都提出请求吗?

我们将不胜感激。

谢谢!

【问题讨论】:

  • 只检查 HTTP 响应中的内容长度怎么样?
  • 是的,我想过,但我想只显示取决于宽度和高度的图像(例如超过 100 像素的宽度或高度),而且仅知道内容长度很难做到。

标签: python django curl urllib


【解决方案1】:

您可以使用文件的 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

【讨论】:

    【解决方案2】:

    我能想到几个优化:

    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.
    

    【讨论】:

    • 感谢您提醒我线程!现在让一切都以可接受的速度运行(大约 30 个请求的速度提高了 10 倍)。标记为已接受!
    猜你喜欢
    • 1970-01-01
    • 2016-04-12
    • 2015-08-04
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2010-12-21
    相关资源
    最近更新 更多