【问题标题】:How to use URLLib.request to loop through URL's and download images?如何使用 URLLib.request 循环访问 URL 并下载图像?
【发布时间】:2020-06-16 03:30:16
【问题描述】:

我当前的程序是这样的

import os
import urllib.request


baseUrl = "https://website.com/wp-content/upload/xxx/yyy/zzz-%s.jpg"

for i in range(1,48):
    url = baseUrl % i
    urllib.request.urlretrieve(baseUrl, os.path.basename(url))

很久没写过python了,不过我以前用python2.7的时候用urllib2写的。

它应该替换URL中的%s并循环通过1-48,并将所有图像下载到脚本所在的目录。但是我得到了很多错误。

edit : 这是抛出的错误。

Traceback (most recent call last):
  File "download.py", line 9, in <module>
    urllib.request.urlretrieve(url, os.path.basename(url))
  File "C:\Program Files\Python37\lib\urllib\request.py", line 247, in urlretrieve
    with contextlib.closing(urlopen(url, data)) as fp:
  File "C:\Program Files\Python37\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Program Files\Python37\lib\urllib\request.py", line 531, in open
    response = meth(req, response)
  File "C:\Program Files\Python37\lib\urllib\request.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Program Files\Python37\lib\urllib\request.py", line 569, in error
    return self._call_chain(*args)
  File "C:\Program Files\Python37\lib\urllib\request.py", line 503, in _call_chain
    result = func(*args)
  File "C:\Program Files\Python37\lib\urllib\request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

【问题讨论】:

  • 请注意,您将baseUrl 传递到网络调用中。 baseUrl 不是url,它是您的格式字符串,末尾仍然有zzz-%s.jpg

标签: python python-3.x python-3.7 urllib


【解决方案1】:

urllib.request 仅适用于 Python 3,因此您必须在 Python 3 中运行代码。

【讨论】:

  • 是的。我现在在 Python 3.7.4 上运行,但代码不起作用。它说 urllib 没有属性。
【解决方案2】:

尝试使用requests 模块:

import requests
baseUrl = "https://website.com/wp-content/upload/xxx/yyy/zzz-%s.jpg"

for i in range(1,48):
    url = baseUrl % i
    response = requests.get(url)
    my_raw_data = response.content
    with open(os.path.basename(url), 'wb') as my_data:
        my_data.write(my_raw_data)
    my_data.close()

只是添加,您必须在请求中使用url,而不是代码中显示的baseUrl

import os
import urllib.request


baseUrl = "https://website.com/wp-content/upload/xxx/yyy/zzz-%s.jpg"

for i in range(1,48):
    url = baseUrl % i
    #urllib.request.urlretrieve(baseUrl, os.path.basename(url))
    #Use This line :
    urllib.request.urlretrieve(url, os.path.basename(url))

Python 3

中运行它

【讨论】:

    【解决方案3】:

    简单的修复,如果你传递正确的字符串:

     urllib.request.urlretrieve(url, os.path.basename(url))
    

    文档说 urlretrieve 是遗留的遗留物,所以您可能想找到一种不同的方法来做到这一点。

    我发现这种替代方法是从另一个 SO 答案修改而来的:

    import os
    import requests
    baseUrl = "https://website.com/wp-content/upload/xxx/yyy/zzz-%s.jpg"
    for i in range(1,48):
        url = baseUrl % i
        r = requests.get(url)
        open(os.path.basename(url), 'wb').write(r.content)    
    

    【讨论】:

    • 还是不行。我已经用 url 替换了该行中的 baseUrl,但我仍然收到错误。
    • 你知道一种非传统的方法吗?
    • 你没有做太多的研究。 Stack Overflow 有几个关于错误 403 和 urlretrieve 的问题。这是一个:stackoverflow.com/questions/45358126/…
    • 对非传统方法的修改答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2022-01-22
    • 2017-11-27
    相关资源
    最近更新 更多