python - 为什么这段代码不下载文件而下载器却可以下载成功

标签 python networking

问题始于此链接
https://i1.pixiv.net/img-zip-ugoira/img/2017/04/05/00/24/41/62259492_ugoira600x600.zip

用下载器下载的文件已完成。

enter image description here

我尝试使用python来下载文件

from urllib import request
import sys
request.urlretrieve('https://i1.pixiv.net/img-zip-ugoira/img/2017/04/05/00/24/41/62259492_ugoira600x600.zip', '123.zip')


Traceback (most recent call last):
  File "C:/Users/ssshooter/PycharmProjects/first/111.py", line 3, in <module>
    request.urlretrieve('https://i1.pixiv.net/img-zip-ugoira/img/2017/04/05/00/24/41/62259492_ugoira600x600.zip', '123.zip')
  File "C:\Users\ssshooter\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 248, in urlretrieve
    with contextlib.closing(urlopen(url, data)) as fp:
  File "C:\Users\ssshooter\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\ssshooter\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 532, in open
    response = meth(req, response)
  File "C:\Users\ssshooter\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Users\ssshooter\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 570, in error
    return self._call_chain(*args)
  File "C:\Users\ssshooter\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "C:\Users\ssshooter\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 650, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

这不起作用。

最佳答案

差异是:

  1. 您正在使用不同的 SSL 信息:您的浏览器具有一组内置的证书颁发机构。 Python使用操作系统自带的一套。它们是不同的,如果您访问的网站使用浏览器知道但 Python 不知道的网站,Python 将抛出异常。
  2. 您正在使用不同的用户代理进行访问。您的浏览器告诉服务器它是 Chrome 或 IE 或其他浏览器。 Python 告诉服务器它是 python。无论出于何种原因,服务器可能会认为它不喜欢这样并返回 Forbidden。
  3. 服务器的工作可能比您想象的要困难:虽然看起来请求是针对一个简单文件,但您实际上是在请求资源。您请求的资源可能(尽管在这种情况下不太可能)导致服务器和浏览器之间的多次交互(cookie、javascript 等),这些交互在您的浏览器中成功执行,返回到服务器及其然后交付文件。您的 python 请求没有执行任何操作。
  4. 你的浏览器(可能)有你的Python没有的现有状态。您说您可以使用浏览器访问该文件,但它可能仅在您访问了网站上的其他资源或登录或其他情况下才有效。您的浏览器正在与服务器识别的信息(可能是通过 cookie 的 session_id?)进行通信。您的 python 代码状态没有以前的状态,因此服务器禁止这样做。

本例中是哪一个?你需要调查一下。你能让 wget 或 curl 工作吗?调试浏览器的访问:正在发送哪些 header ,您收到什么回复?

关于python - 为什么这段代码不下载文件而下载器却可以下载成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43280499/

相关文章:

c++ - 使用 Batch,如何确定您是否连接到 WiFi 网络?

java - Network Mapper软件的最佳平台和编程语言

python - 获取数据框中不同 ID 的行值

python - 使用 Smopy 在 Matplotlib 动画中添加额外图形

sockets - 在调用 'socket.read(buffer, offset, count)'之前,数据存储在哪里?

c++ - 用C++将域名从DNS格式转换为NetBIOS格式

linux - netcat 不发送 LAST_ACK

python - 关于Python全局变量

Python:防止 URL 在 Django View 中编码

python - 在环境中不设置密码的情况下恢复PostgreSQL数据库