如何用urllib从网络下载图片

3 投票
1 回答
9067 浏览
提问于 2025-04-17 07:44

我正在尝试用这段代码下载一张图片:

from urllib import urlretrieve
urlretrieve('http://gdimitriou.eu/wp-content/uploads/2008/04/google-image-search.jpg', 
            'google-image-search.jpg')

这段代码成功了。图片下载下来了,可以用任何图片查看软件打开。


不过,下面这段代码就不行。下载的图片只有2KB,无法用任何图片查看软件打开。

from urllib import urlretrieve
urlretrieve('http://upload.wikimedia.org/wikipedia/en/4/44/Zindagi1976.jpg', 
            'Zindagi1976.jpg')

这里是以HTML格式显示的结果。

    ERROR

The requested URL could not be retrieved

While trying to retrieve the URL: http://upload.wikimedia.org/wikipedia/en/4/44/Zindagi1976.jpg

The following error was encountered:

Access Denied.
Access control configuration prevents your request from being allowed at this time. Please contact your service provider if you feel this is incorrect.

Your cache administrator is nobody. 
Generated Mon, 05 Dec 2011 17:19:53 GMT by sq56.wikimedia.org (squid/2.7.STABLE9)

1 个回答

12

如果你使用了下面的代码,你就可以下载图片:

wget http://upload.wikimedia.org/wikipedia/en/4/44/Zindagi1976.jpg

但是如果你用了下面的代码:

from urllib import urlretrieve
urlretrieve('http://upload.wikimedia.org/wikipedia/en/4/44/Zindagi1976.jpg', 
            'Zindagi1976.jpg')

你可能就无法下载图片。这可能是因为维基百科有一些规则(robot.txt),不允许机器人或自动程序(不明的客户端)访问。试着模拟一个浏览器。

要做到这一点,你需要在请求的头部加上以下内容:

('User-agent', 
 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) 
 Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')

你可以这样做

>>> from urllib import FancyURLopener
>>> class MyOpener(FancyURLopener):
...     version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'
... 
>>> myopener = MyOpener()
>>> myopener.retrieve('http://upload.wikimedia.org/wikipedia/en/4/44/Zindagi1976.jpg', 'Zindagi1976.jpg')
('Zindagi1976.jpg', <httplib.HTTPMessage instance at 0x1007bfe18>)

这样可以获取文件

撰写回答