V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
FatGhosta
V2EX  ›  Python

Python菜鸟提问,httplib和urllib2有什么区别??囧

  •  
  •   FatGhosta · 2014-02-10 16:32:42 +08:00 · 8817 次点击
    这是一个创建于 2810 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想从java转Python,Python看了一个特别简单的教程,就想先上手试试。结果就卡了。。。
    想调用github的OPEN API试试,搜了一下httpclient(显然java的名字,勿喷。。。),搜到了httplib。然后就照猫画虎写程序。见下。
    ```python
    #!/usr/bin/python
    #coding=utf8

    import httplib

    try:
    httpClient = httplib.HTTPConnection('https://api.github.com/', 80)
    headers = {"Content-type":"application/json"}
    param = None
    httpClient.request('GET','/', param, headers)
    response = httpClient.getresponse()
    print response.status
    except Exception, e:
    print e
    finally:
    if httpClient:
    httpClient.close()
    ```

    然后运行完了报错[Errno 11004] getaddrinfo failed
    搜了很多,发现没有解决了的,只有改用urllib的。
    这个倒是成功了。。。
    ```python
    #!/usr/bin/python
    #coding=utf8

    import urllib2
    import json

    response = urllib2.urlopen('https://api.github.com/')
    data = json.load(response)
    print data
    ```
    肿么回事。。。
    14 条回复    1970-01-01 08:00:00 +08:00
    zoowii
        1
    zoowii   2014-02-10 16:42:20 +08:00
    建议用requests库
    FatGhosta
        2
    FatGhosta   2014-02-10 16:47:28 +08:00
    @zoowii 嗯!我也看到这个库了。但是我就是想知道,httplib那个代码到底错在哪里了。。。不弄清楚了难受,你懂的。。。
    menqiandenanmu
        3
    menqiandenanmu   2014-02-10 17:20:53 +08:00
    楼主处女座的啊
    FatGhosta
        4
    FatGhosta   2014-02-10 17:22:55 +08:00
    @menqiandenanmu 虽然太阳星座是摩羯!!但是月亮星座是处女!!求别黑!!
    zxc111
        5
    zxc111   2014-02-10 17:24:36 +08:00   ❤️ 1
    写法错了。
    1.httplib 第一步不要带 "http://"
    2.对于 https 协议请用 httplib.HTTPSConnection

    相关例子请参见:
    http://stackoverflow.com/questions/2146383/https-connection-python

    urllib 也是依靠 httplib实现的
    Veelian
        6
    Veelian   2014-02-10 17:25:15 +08:00
    https端口默认是443吧
    robinlovemaggie
        7
    robinlovemaggie   2014-02-10 17:29:39 +08:00
    @FatGhosta 据我所知,httplib对于https是无力的,所以楼主还是不要再难受了……
    http://docs.python.org/2/library/httplib.html
    FatGhosta
        8
    FatGhosta   2014-02-10 17:30:18 +08:00
    @zxc111 谢谢!!!
    lehui99
        9
    lehui99   2014-02-10 17:32:49 +08:00 via Android
    python的urllib相当于java.net.URL,支持各种url的,不仅是http/https,一般使用urllib而不是直接用httplib
    cute
        10
    cute   2014-02-10 17:37:23 +08:00
    httpClient = httplib.HTTPSConnection('api.github.com', 443)
    sd4399340
        11
    sd4399340   2014-02-10 17:48:09 +08:00
    一个原因是:httplib.HTTPConnection()的第一个参数是host,不加http/https的,另外,你用浏览器试试就可以发现,http://api.github.com 是不能访问的,只有 https://api.github.com 才能访问,而https的端口是443,不是80,改成 httplib.HTTPConnection('api.github.com',443) 试试

    httplib比较底层,一般使用的话用urllib和urllib2即可
    zoowii
        12
    zoowii   2014-02-10 18:21:05 +08:00
    @FatGhosta https和http协议不同。httplib太基础了,httplib.HTTPConnection打开https地址当然报错。后面没看
    est
        13
    est   2014-02-10 21:05:59 +08:00
    httplib 是处理HTTP协议的。

    urllib 还可以处理一些其他网址,比如 ftp://,file://,但是用的不多。
    mugongjian
        14
    mugongjian   2014-02-11 17:07:43 +08:00
    urllib 包含处理url的函数:quote,unquote,splitattr,splithost...
    我想这才是urllib这个名字的来历,
    但是这个模块还包含一个通用的urlopen的函数,加上多数人用它来请求http,所有才会对httplib 和urllib 的关系模糊.
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2890 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 04:30 · PVG 12:30 · LAX 21:30 · JFK 00:30
    ♥ Do have faith in what you're doing.