无法使用 python 下载图片

can't download image with python

尝试使用 python 下载图像 但是只有这张图下载不了
我不知道什么原因导致当我 运行 它时,它就停止了,什么也没有发生 没有图像,没有错误代码...

这是代码,请告诉我原因和解决方案...

import urllib.request

num=404

def down(URL):

    fullname=str(num)+"jpg"
    urllib.request.urlretrieve(URL,fullname)
    im="https://www.thesun.co.uk/wp-content/uploads/2020/09/67d4aff1-ddd0-4036-a111-3c87ddc0387e.jpg"

down(im)

此代码适用于您尝试更改您使用的 url 并查看结果:

import requests

pic_url = "https://www.thesun.co.uk/wp-content/uploads/2020/09/67d4aff1-ddd0-4036-a111-3c87ddc0387e.jpg"
cookies = dict(BCPermissionLevel='PERSONAL')


with open('aa.jpg', 'wb') as handle:
        response = requests.get(pic_url, headers={"User-Agent": "Mozilla/5.0"}, cookies=cookies,stream=True)
        if not response.ok:
            print (response)

        for block in response.iter_content(1024):
            if not block:
                break

            handle.write(block)

@MoetazBrayek 在他们的评论(但不是回答)中所说的是正确的:您正在查询的网站阻止了请求。

网站通常会根据用户代理或引荐来源网址来阻止请求:如果您尝试curl https://www.thesun.co.uk/wp-content/uploads/2020/09/67d4aff1-ddd0-4036-a111-3c87ddc0387e.jpg,您将收到 HTTP 错误(403 访问被拒绝):

❯ curl -I https://www.thesun.co.uk/wp-content/uploads/2020/09/67d4aff1-ddd0-4036-a111-3c87ddc0387e.jpg
HTTP/2 403 

显然 The Sun 想要一个浏览器的用户代理,特别是字符串“mozilla”就足以通过:

❯ curl -I -A mozilla https://www.thesun.co.uk/wp-content/uploads/2020/09/67d4aff1-ddd0-4036-a111-3c87ddc0387e.jpg
HTTP/2 200 

您将不得不切换到 requests 程序包或将您的 url 字符串替换为适当的 urllib.request.Request 对象,以便您可以自定义请求的更多部分。显然 urlretrieve 不支持 Request 对象,因此您还必须使用 urlopen:

req = urllib.request.Request(URL, headers={'User-Agent': 'mozilla'})
res = urllib.request.urlopen(req)
assert res.status == 200
with open(filename, 'wb') as out:
    shutil.copyfileobj(res, out)