【问题标题】:Solving HTTP Error 400: Bad Request with working links in Google Chrome解决 HTTP 错误 400:在 Google Chrome 中使用工作链接的错误请求
【发布时间】:2019-05-09 09:45:01
【问题描述】:

我知道已经以多种形式提出过这个问题,但我似乎找不到我的答案,希望在这里得到一些帮助。 我尝试下载存储在 url 列表后面的文件..

我发现以下功能可以满足我的需求:

import os.path
import urllib.request
import requests

for link in links:
    link = link.strip()
    name = link.rsplit('/', 1)[-1]
    filename = os.path.join('downloads', name)

    if not os.path.isfile(filename):
        print('Downloading: ' + filename)
        try:
            urllib.request.urlretrieve(link, filename)
        except Exception as inst:
            print(inst)
            print('  Encountered unknown error. Continuing.')

我总是收到:HTTP 错误 400:错误请求。

我试图设置用户代理来伪造浏览器访问(我使用谷歌浏览器),但它根本没有帮助。如果在浏览器中复制链接可以工作,因此我想知道如何解决这个问题。

【问题讨论】:

    标签: python request urllib user-agent


    【解决方案1】:

    必须引用空格。我使用quote 函数在您的链接中引用文件名。我还使用rindex 剪切了 url 路径中的最后一部分。应该使用 urlspliturlunsplit 函数来代替字符串操作,但是..我太懒了:D

    import os.path
    import urllib.request
    from urllib.parse import quote
    
    links = ['https://undpgefpims.org/attachments/6222/216410/1717887/1724973/6222_4NC_3BUR_Macedonia_Final ProDoc 30 July 2018.doc', 'https://undpgefpims.org/attachments/6214/216405/1719672/1729436/6214_4NC_Niger_ProDoc  final for DoA.doc']
    
    for link in links:
        link = link.strip()
        name = link.rsplit('/', 1)[-1]
        filename = os.path.join('downloads', name)
    
        if not os.path.isfile(filename):
            print('Downloading: ' + filename)
            try:
                urllib.request.urlretrieve(link[:link.rindex('/') + 1] + quote(link[link.rindex('/') + 1:]), filename)
            except Exception as inst:
                print(inst)
                print('  Encountered unknown error. Continuing.')
    

    【讨论】:

    • 谢谢欧文!就在同一时刻,我发现了我的错误并添加了工作代码作为答案。不过,我真的很感谢你的帮助。
    【解决方案2】:

    我找到了自己问题的答案。

    问题在于 url 包含空格,urllib.request 显然无法正确读取这些空格。解决方法是先把url解析成引号,然后调用引用的url。

    这是所有遇到相同问题的工作代码:

    import os.path
    import urllib.request
    import requests
    import urllib.parse
    
    for link in urls:
        link = link.strip()
        name = link.rsplit('/', 1)[-1]
        filename = os.path.join(name)
        quoted_url = urllib.parse.quote(link, safe=":/")
    
        if not os.path.isfile(filename):
            print('Downloading: ' + filename)
            try:
                urllib.request.urlretrieve(quoted_url, filename)
            except Exception as inst:
                print(inst)
                print('  Encountered unknown error. Continuing.')
    

    【讨论】:

      猜你喜欢
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      相关资源
      最近更新 更多