【问题标题】:Image scraped as HTML page with urlretrieve使用 urlretrieve 将图像抓取为 HTML 页面
【发布时间】:2016-11-16 17:25:15
【问题描述】:

我正在尝试使用 urllib.urlretrieve 抓取 this image

>>> 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 文件呢?

【问题讨论】:

  • requests 没有问题,顺便说一句:stackoverflow.com/questions/16694907/…
  • 谢谢,我会试一试。知道为什么这不起作用吗?是我做错了什么,还是我误解了 urlretrieve 的工作原理?
  • 谢谢,请求完美运行。 :)

标签: python web-scraping urllib


【解决方案1】:

这是因为托管该图像的服务器的所有者故意阻止来自 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)

因此,绕行要多一些,但还不算太糟糕。

请注意,网站所有者这样做可能是因为有些人辱骂了他们。请不要成为他们中的一员!强大的力量伴随着巨大的责任,以及所有这些。

【讨论】:

  • 滥用?为何如此?由于过度抓取,服务器上的点击次数过多?
  • 如果用户使用 urllib 阻止了访问,为什么他没有对请求做同样的事情?
  • @NJay 虽然我不能说出那个特定服务器管理员的动机,但根据我在其他服务器上看到的情况,我有一些猜测。 1) 过度抓取可能是流行站点的问题,因为它们通常会为带宽付费(并且众所周知,有些人会在短时间内抓取整个站点); 2)一些站点设置了毯子块试图停止收获蜘蛛; 3) 一些管理员只是复制“防止滥用”的第 3 方工具,而不质疑他们的工作或了解更大的情况。
  • 至于为什么请求没有被阻止,可能会因上面的答案而异。对于 1 和 2,请求的使用可能没有内置 urllib 那么多,并且还没有注册为他们的问题。对于 3,可能在编写工具时请求甚至都不存在。
  • 有趣。谢谢! :)
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 2012-11-24
  • 2015-04-05
  • 1970-01-01
  • 2019-07-28
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多