【问题标题】:Error reading webpage source code using Python使用 Python 读取网页源代码时出错
【发布时间】:2015-06-16 04:45:10
【问题描述】:

我是 Python 新手,我一直在尝试获取页面的源代码,并在 Python 2 和 3 上尝试了几种方法(这里是一个)

import urllib

url = "https://www.google.ca/?gfe_rd=cr&ei=u6d_VbzoMaei8wfE1oHgBw&gws_rd=ssl#q=test"
f = urllib.urlopen(url)
source = f.read()
print source

但我不断收到以下错误:

Traceback (most recent call last):
  File "C:\Python34\openpage.py", line 4, in <module>
    f = urllib.urlopen(url)
  File "C:\Python27\lib\urllib.py", line 87, in urlopen
    return opener.open(url)
  File "C:\Python27\lib\urllib.py", line 213, in open
    return getattr(self, name)(url)
  File "C:\Python27\lib\urllib.py", line 443, in open_https
    h.endheaders(data)
  File "C:\Python27\lib\httplib.py", line 1049, in endheaders
    self._send_output(message_body)
  File "C:\Python27\lib\httplib.py", line 893, in _send_output
    self.send(msg)
  File "C:\Python27\lib\httplib.py", line 855, in send
    self.connect()
  File "C:\Python27\lib\httplib.py", line 1274, in connect
    server_hostname=server_hostname)
  File "C:\Python27\lib\ssl.py", line 352, in wrap_socket
    _context=self)
  File "C:\Python27\lib\ssl.py", line 579, in __init__
    self.do_handshake()
  File "C:\Python27\lib\ssl.py", line 808, in do_handshake
    self._sslobj.do_handshake()
IOError: [Errno socket error] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)

最后一行表明错误来自安全搜索,但我似乎找不到解决方法。

我查看了this 的帖子,但仍然没有成功。

【问题讨论】:

标签: python https


【解决方案1】:

您使用的是安全协议 https。它说

SSL:CERTIFICATE_VERIFY_FAILED

尝试 http 或使用 ssl https://docs.python.org/2/library/ssl.html

url = "http://www.google.ca

【讨论】:

    【解决方案2】:

    这是一个示例代码,您可以在 Python3 上尝试使用 urlparse

    import http.client
    from urllib.parse import urlparse
    url = "https://www.google.ca/?gfe_rd=cr&ei=u6d_VbzoMaei8wfE1oHgBw&gws_rd=ssl#q=test"
    p = urlparse(url)
    conn = http.client.HTTPConnection(p.netloc)
    conn.request('GET', p.path)
    resp = conn.getresponse()
    print('resp= {}'.format(resp.read()))
    

    不过,它会根据您对conn.request() 函数的参数起作用。您可以尝试其他方法类型,例如 HEAD,您的响应会相应改变。

    如果您想测试您的请求是否有效,您可以随时尝试:

    print(resp.status)
    

    在这种情况下,它给出200。状态码列表可用here

    也可以找到其他一些examples

    【讨论】:

    • 感谢您,但是当我将 html 文件另存为网页并在记事本中打开它时,打印出来的信息似乎要少得多。知道为什么它不完整吗?
    • 我认为我的上一条评论可能是一个不同的问题,并希望接受您的回答,所以我单独询问了question
    猜你喜欢
    • 2014-04-06
    • 2012-11-28
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多