【问题标题】:Why is the Python module requests downloading the HTML page instead of a file?为什么 Python 模块请求下载 HTML 页面而不是文件?
【发布时间】:2022-01-21 15:53:28
【问题描述】:

我有一个要使用 Python 下载的 .xlsx 文件。如果我单击以下 URL https://www.science.org/doi/suppl/10.1126/science.aad0501/suppl_file/aad0501_table_s5.xlsx,它会自动下载它而不会出现任何问题。但是,下面的代码

import requests

url = "https://www.science.org/doi/suppl/10.1126/science.aad0501/suppl_file/aad0501_table_s5.xlsx"

with open("this_is_a_test.xlsx", "wb") as f:
    r = requests.get(url)
    f.write(r.content)
    print(r.ok)

输出 True 并下载 HTML 页面而不是 xlsx 文件。更令人沮丧的是,相同的代码之前运行得非常好,但由于某种原因在过去 24 小时内改变了它的行为。


This threadthis thread 讨论了类似的问题,但是在这两种情况下都存在登录障碍,在我的情况下不存在。


编辑 1:执行上面的代码并在我的终端中输入 head this_is_a_test.xlsx 后,这是我得到的输出:

<!DOCTYPE html>
<html lang="en" class="pb-page" data-request-id="fe043004-5c5a-4d2e-a323-cc9b39aa3339"><head data-pb-dropzone="head"><meta name="pbContext" content=";wgroup:string:Publication Websites;page:string:Cookie Absent;website:website:aaas-site" />
<script>AAASdataLayer={"page":{"pageInfo":{"pageTitle":"","pageURL":"https://www.science.org/action/cookieAbsent"},"attributes":{}},"user":{}};if(AAASdataLayer&&AAASdataLayer.user){let match=document.cookie&&document.cookie.match(/(?:^|; )consent=([^;]*)/);if(match){let jsonObj=JSON.parse(decodeURIComponent(match[1]));AAASdataLayer.user.cookieConsent=jsonObj.Marketing?'true':'false';}}</script> <link type="text/css" rel="stylesheet" href="/pb-assets/css/local-1639500397097.css">
<title>AAAS</title>
<meta charset="UTF-8">
<meta name="robots" content="noarchive,noindex,nofollow" />
<meta property="og:title" content="AAAS" />
<meta property="og:type" content="Website" />
<meta property="og:site_name" content="AAAS" />
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1, user-scalable=0" />

编辑 2:好的,显然代码在执行一次时会下载 Excel 文件,但在第二次执行时会改变行为。手动下载(通过单击链接)仍然有效。那么,我想可能还有一种解决方法?

【问题讨论】:

  • 代码在我的情况下工作正常
  • 您是否尝试过再次执行它?
  • 也适用于我,在 Excel 文件中打开,其中包含所有正确的详细信息,如单元格 A1 表 S5。细胞周期基因集。
  • 好的,第二次运行它,我收到一个html页面。可能在服务器上实施了一些措施以避免从同一个 ip 进行多次下载
  • 您可以尝试设置User-Agent,但没有保证。该网站可能有更复杂的规则。 stackoverflow.com/questions/27652543/…

标签: python python-requests download


【解决方案1】:

一个可能的解决方案是添加一个标头 User-Agent

import requests

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}

url = "https://www.science.org/doi/suppl/10.1126/science.aad0501/suppl_file/aad0501_table_s5.xlsx"

with open("this_is_a_test.xlsx", "wb") as f:
    r = requests.get(url, headers=headers)
    f.write(r.content)
    print(r.ok)

【讨论】:

    【解决方案2】:

    你需要用二进制代替。This person 与 urllib2 有类似的问题。只要将二进制输出写入文件,您仍然可以使用请求。

    更多 Pythonic 代码示例:

    import requests
    dls = "https://www.example.com/important.xls"
    resp = requests.get(dls)
    with open('test.xls', 'wb') as output:
        output.write(resp.content)
    



    我试过了,重新创建结果没有任何问题。

    【讨论】:

    • 感谢您的回答。我已经在使用二进制输出,这个例子和问题中的例子几乎一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    相关资源
    最近更新 更多