似乎没有一种方法可以向urlparse命令添加标头。这实际上会导致Python使用其默认的用户代理,该代理被几个网页阻止。我想要做的基本上等同于:
req = Request(INPUT_URL,headers={'User-Agent':'Browser Agent'})但是使用urlparse:
parsed = list(urlparse(INPUT_URL))那么,我如何修改这个urlparse,使其接受头部,或者可用于我创建的请求?感谢您的帮助,谢谢。
另外,对于任何想知道我得到的确切错误的人:
urllib.error.HTTPError: HTTP Error 403: Forbidden在这里:
urlretrieve(urlunparse(parsed),outpath)发布于 2013-07-27 17:38:13
Header是请求的一部分,URL也是其中的一部分。当您仅将一个URL传递给urllib.request函数时,Python会为您创建一个请求。
创建一个Request object,将标题添加到该对象,并使用该对象而不是string URL:
request = Request(urlunparse(parsed), headers={'User-Agent': 'My own agent string'})但是,urlretrieve()在代码中被标记为“旧版API”,不支持使用Request对象。删除一些支持'file://‘urls’的行是很容易的:
import contextlib
import tempfile
from urllib.error import ContentTooShortError从urllib.request导入from打开
_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 resulthttps://stackoverflow.com/questions/17896320
复制相似问题