首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python向urlparse添加头

Python向urlparse添加头
EN

Stack Overflow用户
提问于 2013-07-27 17:32:45
回答 1查看 752关注 0票数 0

似乎没有一种方法可以向urlparse命令添加标头。这实际上会导致Python使用其默认的用户代理,该代理被几个网页阻止。我想要做的基本上等同于:

代码语言:javascript
复制
req = Request(INPUT_URL,headers={'User-Agent':'Browser Agent'})

但是使用urlparse:

代码语言:javascript
复制
parsed = list(urlparse(INPUT_URL))

那么,我如何修改这个urlparse,使其接受头部,或者可用于我创建的请求?感谢您的帮助,谢谢。

另外,对于任何想知道我得到的确切错误的人:

代码语言:javascript
复制
urllib.error.HTTPError: HTTP Error 403: Forbidden

在这里:

代码语言:javascript
复制
urlretrieve(urlunparse(parsed),outpath)
EN

回答 1

Stack Overflow用户

发布于 2013-07-27 17:38:13

Header是请求的一部分,URL也是其中的一部分。当您仅将一个URL传递给urllib.request函数时,Python会为您创建一个请求。

创建一个Request object,将标题添加到该对象,并使用该对象而不是string URL:

代码语言:javascript
复制
request = Request(urlunparse(parsed), headers={'User-Agent': 'My own agent string'})

但是,urlretrieve()在代码中被标记为“旧版API”,不支持使用Request对象。删除一些支持'file://‘urls’的行是很容易的:

代码语言:javascript
复制
import contextlib
import tempfile
from urllib.error import ContentTooShortError

从urllib.request导入from打开

代码语言:javascript
复制
_url_tempfiles = []
def urlretrieve(url, filename=None, reporthook=None, data=None):
    with contextlib.closing(urlopen(url, data)) as fp:
        headers = fp.info()

        # Handle temporary file setup.
        if filename:
            tfp = open(filename, 'wb')
        else:
            tfp = tempfile.NamedTemporaryFile(delete=False)
            filename = tfp.name
            _url_tempfiles.append(filename)

        with tfp:
            result = filename, headers
            bs = 1024*8
            size = -1
            read = 0
            blocknum = 0
            if "content-length" in headers:
                size = int(headers["Content-Length"])

            if reporthook:
                reporthook(blocknum, bs, size)

            while True:
                block = fp.read(bs)
                if not block:
                    break
                read += len(block)
                tfp.write(block)
                blocknum += 1
                if reporthook:
                    reporthook(blocknum, bs, size)

    if size >= 0 and read < size:
        raise ContentTooShortError(
            "retrieval incomplete: got only %i out of %i bytes"
            % (read, size), result)

    return result
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17896320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档