当前位置: 首页 > 知识库问答 >
问题:

urllib。使用自定义标题检索URL

皇甫飞跃
2023-03-14

我正在尝试使用urlretrieve检索文件,同时添加自定义头。

检查urllib的代码源时。request我意识到urlopen可以在参数中获取request对象,而不仅仅是一个字符串,从而可以放置我想要的标题。但是,如果我尝试对urlretrieve执行相同的操作,我会得到一个类型错误:预期的字符串或类似字节的对象,正如在另一篇文章中提到的。

我最终所做的是重写我自己的url检索,删除抛出错误的行(该行在我的用例中无关紧要)。

它工作得很好,但我想知道是否有更好/更干净的方法,而不是重写我自己的urlretrieve。如果可以将自定义标题传递给urlopen,则感觉应该可以对urlretrieve执行相同的操作?

共有2个答案

闾丘成双
2023-03-14

urllib。要求urlretrieve()urllib内部使用。要求urlopen()(至少在Python 3中)。因此,您可以使用相同的方法来影响urlopen的行为。

当调用urlope(params)时,它实际上首先查看特殊的全局变量urllib.request._opener,如果它是,那么urlopen将变量设置为默认的开放程序集否则它将保持原样。下一步它将调用urllib.request._opener.open(

开启器。open()包含不同协议的处理程序列表。当开启器打开时。调用open(),然后它将执行以下操作:

  • 从URLurllib创建。要求请求对象(或者如果您直接提供请求它只会使用它)

对于您自己的开场白,您必须执行以下3个步骤:

  1. 创建自己的处理程序

urllib。要求build_opener创建包含自定义处理程序的opener,并添加默认opener(自定义处理程序继承自的处理程序除外)。

因此,要添加自定义标题,您可以编写如下内容:

import urllib.request as req

class MyHTTP(req.HTTPHandler):
    def http_request(self, req):
        req.headers["MyHeader"] = "Content of my header"
        return super().http_request(req)

opener = req.build_opener(MyHTTP())
req.install_opener(opener)

从这一点开始,当您调用urllib.request.urlretrieve()或任何使用urlopens()的东西时,它将用于HTTP通信的处理程序。当您想回到默认处理程序时,您可以调用:

import urllib.request as req   

req.install_opener(req.build_opener())

老实说,我不知道它是否比你的解决方案更好/更干净,但它在urllib中使用了准备好的机制。

赫连正初
2023-03-14

我找到了一种方法,你只需要添加几行额外的代码...

import urllib.request

opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
urllib.request.install_opener(opener)
urllib.request.urlretrieve("type URL here", "path/file_name")

如果你想了解细节,你可以参考python留档:https://docs.python.org/3/library/urllib.request.html

 类似资料:
  • 问题内容: 我正在尝试在导航栏的中心添加自定义视图,并且正在使用以下代码对其进行测试: 我在视图控制器的viewDidLoad方法中进行设置,但是当我运行程序时,导航栏中似乎没有任何变化。 你能帮我吗? 问题答案: 这可行。初始化时给框架

  • 我注意到了这一点。要求urlretrieve(url、fname_和_路径)下载任何小文件需要24秒: 而请求。get(url)下载相同文件的速度要快得多 问题是urllib花24秒下载文件的原因是什么?我该如何解决这个问题,让它更快地工作?

  • 问题内容: 在我的html中,我很好奇使用唯一标识符(例如 保存图片)而不是语义是否正确。例如: 是否优先拥有: 与CSS: 而不是:我目前有: 与CSS: 唯一标识符的使用在语义上是否正确? 问题答案: 最好避免使用自定义标签,因为您永远不知道这些标签何时会标准化,并在将来有特殊用途。 如果要避免使用标头标记,对于您的示例最好的操作如下: 此外: 如果在设计页面时不使用标准html标记,则在禁用

  • 问题内容: 我正在尝试创建一种类似于英语的小型语言来指定任务。基本思想是将陈述分为动词和名词短语,这些动词应适用于它们。我正在使用nltk,但未获得我希望的结果,例如: 在每种情况下,它都未能意识到第一个单词(选择,移动和复制)被用作动词。我知道我可以创建自定义标签和语法来解决此问题,但是与此同时,当很多此类东西不在我的支持范围内时,我犹豫要重新发明轮子。我特别希望可以同时处理非英语语言的解决方案

  • 我试图使用Apache-POI在word(.docx)文档中创建标题。 我有一个模板,其中只包含自定义样式和标题使用自定义样式的例子。 编辑:如果我使用Apache-POI创建自己的风格,它就可以工作....不过,我真的很喜欢使用word文档中的现有样式。

  • 问题内容: 我正在尝试使用Python填写并提交表单,但无法检索结果页面。我已经尝试过机械化和urllib / urllib2方法来发布表单,但是都遇到了问题。 我要检索的表单在这里:http: //zrs.leidenuniv.nl/ul/start.php。该页面以荷兰语显示,但这与我的问题无关。可能值得注意的是,表单操作重定向到http://zrs.leidenuniv.nl/ul/quer