为什么我在使用 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
,它也开始为我工作。也许他们出于其他原因检查了它。
为什么我在使用 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
,它也开始为我工作。也许他们出于其他原因检查了它。