为什么我在使用 urllib.request.urlopen 和 requests.get 时得到不同的响应

Why I'm getting different responses when i use urllib.request.urlopen and requests.get

为什么我在使用 urllib.request.urlopen 和 requests.get

时得到不同的响应
import requests
r = requests.get('https://upload.wikimedia.org/wikipedia/commons/1/14/Sunset_Boulevard_%281950_poster%29.jpg')
r.status_code

响应 403

from urllib.request import urlopen
r = urlopen('https://upload.wikimedia.org/wikipedia/commons/1/14/Sunset_Boulevard_%281950_poster%29.jpg')
r.getcode()

响应 200

首先你可以检查 print( r.content ) 看看你从服务器得到了什么。
通常你可以得到一些解释,这有助于发现问题。


对于您的代码,它显示 header User-Agent

有问题

维基百科:User-Agent policy

有些服务器会检查 header User-Agent 以针对不同的 systems/browsers/devices 发送不同的内容。他们还使用它来检测 scripts/bots/spamers/hackers 并阻止它们。

如果我在真实浏览器中使用 header(或至少短 Mozilla/5.0),那么它就可以工作。

import requests

headers = {'User-Agent': 'Mozilla/5.0'}

url = 'https://upload.wikimedia.org/wikipedia/commons/1/14/Sunset_Boulevard_(1950_poster).jpg'
#url = 'https://upload.wikimedia.org/wikipedia/commons/1/14/Sunset_Boulevard_%281950_poster%29.jpg'

r = requests.get(url, headers=headers)

print(r.status_code)
print(r.content[:100])

with open('image.jpg', 'wb') as fh:
    fh.write(r.content)

编辑:

在 运行 代码几次后,即使没有 User-Agent,它也开始为我工作。也许他们出于其他原因检查了它。