从网页上传图片



我想实现一个类似于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。但是当有很多图像时,它仍然需要太多的时间(我为找到的每个图像调用这个函数一次)。

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

可能是有什么方法可以不为每个图像发出请求?

任何帮助都将是非常感激的。

谢谢!

我可以想到一些优化:

  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返回的对象。

这是我为它写的一个测试。正如你所看到的,它是相当快的,尽管我想有些网站会阻止太多的重复请求。

|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

相关内容

  • 没有找到相关文章

最新更新