2016-07-13 32 views
0

我试图使用urllib.urlretrieve来抓取this image用urlretrieve将图片作为HTML页面抓取

>>> import urllib 
>>> urllib.urlretrieve('http://i9.mangareader.net/one-piece/3/one-piece-1668214.jpg', 
     path) # path was previously defined 

此代码成功地将文件保存在给定路径中。然而,当我尝试打开该文件,我得到:

Could not load image 'imagename.jpg': 
    Error interpreting JPEG image file (Not a JPEG file: starts with 0x3c 0x21) 

当我在我的bash终端做file imagename.jpg,我得到imagefile.jpg: HTML document, ASCII text

那么如何将这张图像作为JPEG文件进行刮取?

+0

顺便说一下'request'没有问题:http://stackoverflow.com/questions/16694907/how-to-download-large-file-in-python-with-requests-py。 – alecxe

+0

谢谢,我会给它一个镜头。不知道为什么这不起作用,但?我做错了什么,或者我误解了urlretrieve的工作原理? – NJay

+0

谢谢,请求完美。 :) – NJay

回答

0

这是因为托管该映像的服务器的所有者故意阻止来自Python的urllib的访问。这就是为什么它与requests合作。你也可以用纯Python来完成,但是你必须给它一个HTTP User-Agent头,这看起来像urllib以外的东西。例如:

import urllib2 
req = urllib2.Request('http://i9.mangareader.net/one-piece/3/one-piece-1668214.jpg') 
req.add_header('User-Agent', 'Feneric Was Here') 
resp = urllib2.urlopen(req) 
imgdata = resp.read() 
with open(path, 'wb') as outfile: 
    outfile.write(imgdata) 

所以这是多一点卷入,但仍然不是太糟糕。

请注意,该网站的所有者可能是这样做的,因为有些人遭到了辱骂。请不要成为他们中的一员!伟大的力量来自伟大的责任,以及所有这一切。

+0

虐待?怎么会这样?由于过度抓取造成服务器点击太多? – NJay

+0

如果用户使用urllib阻止访问,为什么他没有对请求做同样的事情? – NJay

+0

@NJay,虽然我不能说出这个特定的服务器管理员的动机,但我基于我在其他服务器上看到的一些猜测。 1)过度的抓取可能是热门网站的问题,因为他们通常会为带宽付费(并且有些人已知会在短时间内抓取整个网站); 2)有些地方设置毛毯块试图阻止收获蜘蛛; 3)一些管理员只是复制第三方工具,“防止滥用”,而不会质疑他们做什么或理解更大的情况。 – Feneric