【发布时间】:2016-12-20 19:58:10
【问题描述】:
情况是: 我正在抓取一个网站,页面的 url 遵循模式:
http://www.pageadress/somestuff/ID-HERE/
没有什么不寻常的。 我有很多我需要刮掉的 id,它们中的大多数都能正常工作。 但是,页面以类似门户的方式运行。在浏览器中,当你输入这样的地址时,你会被重定向到:
http://www.pageadress/somestuff/ID-HERE-title_of_subpage
可能有问题的是,有时该标题可能包含非 ascii 字符(大约 0.01% 的情况),因此(我认为这是问题所在)我得到了例外:
File "/usr/lib/python3.4/urllib/request.py", line 161, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.4/urllib/request.py", line 469, in open
response = meth(req, response)
File "/usr/lib/python3.4/urllib/request.py", line 579, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python3.4/urllib/request.py", line 501, in error
result = self._call_chain(*args)
File "/usr/lib/python3.4/urllib/request.py", line 441, in _call_chain
result = func(*args)
File "/usr/lib/python3.4/urllib/request.py", line 684, in http_error_302
return self.parent.open(new, timeout=req.timeout)
File "/usr/lib/python3.4/urllib/request.py", line 463, in open
response = self._open(req, data)
File "/usr/lib/python3.4/urllib/request.py", line 481, in _open
'_open', req)
File "/usr/lib/python3.4/urllib/request.py", line 441, in _call_chain
result = func(*args)
File "/usr/lib/python3.4/urllib/request.py", line 1210, in http_open
return self.do_open(http.client.HTTPConnection, req)
File "/usr/lib/python3.4/urllib/request.py", line 1182, in do_open
h.request(req.get_method(), req.selector, req.data, headers)
File "/usr/lib/python3.4/http/client.py", line 1088, in request
self._send_request(method, url, body, headers)
File "/usr/lib/python3.4/http/client.py", line 1116, in _send_request
self.putrequest(method, url, **skips)
File "/usr/lib/python3.4/http/client.py", line 973, in putrequest
self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 38-39: ordinal not in range(128).
奇怪的是,我被重定向到的 url 中没有任何 unicode 字符实际上位于 38-39 位置,但还有其他字符。
正在使用的代码:
import socket
import urllib.parse
import urllib.request
socket.setdefaulttimeout(30)
url = "https://www.bettingexpert.com/archive/tip/3207221"
headers = {'User-Agent': 'Mozilla/5.0'}
content = urllib.request.urlopen(urllib.request.Request(url, None, headers)).read().decode('utf-8')
有什么方法可以绕过它,最好不使用其他库?
//哦,python 的辉煌世界,如果我用 ruby 编写的话,我什至不会想到可能会产生 1000 多个问题。
【问题讨论】:
-
您提供的代码不完整(无法执行)。
id的值是多少?实际 URL 的相同问题(此处未提供)。如果您希望其他人能够调试问题,那么您需要提供真实的 URL。 -
您是否尝试使用
urllib.parse.quote(id.__str__())而不是普通的id.__str__()? -
Id 是一个整数@Phillip
-
抱歉,我认为这可能是更普遍的问题。我尝试访问的网址是:
-
@piezol 如果它适合您,请切换到 Python 3.5。他们在那里为您的问题提供了解决方法。问题是 bettingexpert 正式不会在
Location标头中返回有效 URL,因为它没有正确引用ß字符。如果切换不是一个选项,您可以使用另一个库,如requests或安装一个自定义 urllib 打开器来缓解这个问题。参见例如this related question.
标签: python python-3.4 urllib http-status-code-302