zoukankan      html  css  js  c++  java
  • 深入研究urllib和urllib2

    urllib是python自带的一个抓取网页信息一个接口,他最主要的方法是urlopen(),是基于python的open()方法的。下面是主要说明:

    urllib.urlopen('网址'):这里传入urlopen()的参数有特别说要求,要遵循一些网络协议,比如http,ftp,也就是说,在网址的开头必须要有http://这样的说明,如:urllib.urlopen('http://www.baidu.com'),要么就是本地文件,本地文件需要使用file关键字,比如urllib.urlopen('file:hello.py'),注意,这里的hello.py是指的是当前的classpath所指定的内容,如果对hello.py这里有什么疑问那一定是python寻找classpath的顺序不是很清楚了,当然也可以直接写全部路径,urllib.urlopen('file:F:\pythontest\hello.py'),

    import urllib
    f = urllib.urlopen('file:F:\pythontest\hello.py')
    a = f.read()
    print a
    
    如:也能正常执行,只是在某些需求,比如可移植性,还是采用前面一种实现方式的好。

    如果传入的参数正确,比如该网站可以访问,没有特殊情况(比如需要代理,被墙- -等),那么将返回一个类似于文件对象的对象。即上面代码中的f,f对象有的方法一些操作方法,使用dir(f):

    ['__doc__', '__init__', '__iter__', '__module__', '__repr__', 'close', 'fileno', 'fp', 'geturl', 'headers', 'info', 'next', 'read', 'readline', 'readlines', 'url']
    
    使用read()方法会将所有内容读取出来,并且同时f对象类似于先入先出的数据,在使用f.read()将得不到任何数据,也就是说,得到的数据在这个时候如果想在后面进行任何处理操作的话,需要另外定义一个对象来进行存储。如上例中的a。而info(),geturl()方法,也是基于f这个文档对象的,所以,使用

    >>>f.geturl()
     'F://pythontest//hello.py'
    
    接下来是urllib的代理设置:

    import urllib
    proxies = {'http':'http://***.***.***.***:1984'}
    filehandle = urllib.urlopen('http://www.需要代理才能访问的网站.com/',proxies = proxies)
    a = filehandle.read()
    print a
    
    
    以上是最基本代理,即代理访问到该网站,并且能够获得该网站的内容。但是如果遇到需要登录,或者需要cookie等的网站呢?

    查看urllib的源码:

    def urlopen(url, data=None, proxies=None):
        """urlopen(url [, data]) -> open file-like object"""
        global _urlopener
        if proxies is not None:
            opener = FancyURLopener(proxies=proxies)
        elif not _urlopener:
            opener = FancyURLopener()
            _urlopener = opener
        else:
            opener = _urlopener
        if data is None:
            return opener.open(url)
        else:
            return opener.open(url, data)
    
    由上面urllib的urlopen的源码,可以看出,还可以传入一个data参数,data参数也应该是一个字典,因为在使用浏览器向服务器发送数据的时候,我们发送的就是字典类型的数据

    代理支持是python 2.3以后加入的.

    这次先这样,下次记录urllib的urlretrieve方法

  • 相关阅读:
    关于Linux联网的问题
    MapD的数据导出与扩容(利用现有的表)
    系统重启后,MapD报错Thrift的连接被拒绝
    关于Linux系统只读(Ubuntu16.4.1)
    javaBean的依赖注入中构造注入和依赖注入的区别
    Struts2开发中遇到的坑。。。
    通过配置文件设置定时任务,以及时间的选择
    微信小程序开发的movable开发的坑
    spring基础概念
    Hibernate的三种查询方式
  • 原文地址:https://www.cnblogs.com/CLTANG/p/1947201.html
Copyright © 2011-2022 走看看