从网页上传图片(Upload images from from web-page)

2019-09-30 02:10发布

我想实现一个类似的功能http://www.tineye.com/parse?url=yahoo.com -允许用户从任何网页上传图片。

对我来说最主要的问题是,它需要的网页大的图像数量太多时间。

我(使用卷曲或urllib的)根据未来计划在Django这样做:

  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。 但它仍然需要当有大量的图片太多时间(我调用这个函数一次找到的每个图像)。

那么,如何可以让它运行得更快?

可能是有什么办法不使为每一个图像的请求?

任何帮助将得到高度赞赏。

谢谢!

Answer 1:

我能想到的几个最佳化的:

  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.


Answer 2:

您可以使用诸如通过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


文章来源: Upload images from from web-page