Python中urllib模块的使用

urllib模块中的方法

urllib.urlopen(url[, data[, proxies]])

创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。参数url表示远程数据的路径,一般是网址;参数data表示以post方式提交到url的数据(玩过web的人应该知道提交数据的两种方式:post与get。

如果你不清楚,也不必太在意,一般情况下很少用到这个参数);参数proxies用于设置代理。urlopen返回 一个类文件对象,他提供了如下方法:

  • read() , readline() , readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样;
  • info():返回一个httplib.HTTPMessage 对象,表示远程服务器返回的头信息; 
    • 其中HTTPMessage 在Python的文档里面是没有具体的解释的,所以可以通过dir得到它的方法。
  • getcode():返回Http状态码。如果是http请求,200表示请求成功完成,404表示网址未找到,诸如此类;
  • geturl():返回请求的url;
# -*- coding: utf-8 -*-
# @Author: HaonanWu
# @Date:   2016-12-23 10:54:10
# @Last Modified by:   HaonanWu
# @Last Modified time: 2016-12-23 11:18:15
import urllib

def print_list(lists):
    for i in lists:
        print i

def demo1(s):
    lines = s.readlines()
    print_list(lines)

def demo2(s):
    print s.getcode()

def demo3(s):
    msg = s.info()
    # print_list(dir(msg)) # 用dir得到对象的所有方法
    # print_list(msg.headers)
    # print msg.getheader('Content-Type')
    # print_list(msg.items())

if __name__ == '__main__':
    url1 = 'https://github.com/Mr-Phoebe' 
    url2 = 'http://blog.csdn.net/u013007900'
    s = urllib.urlopen(url1)
    # demo1(s)
    # demo2(s)
    # demo3(s)
    # 使用代理http proxying :http://www.someproxy.com:3128 
    # proxies = {'http': 'http://www.someproxy.com:3128'}  
    # s = urllib.urlopen(url1, proxies=proxies) 
    # 使用环境变量里的代理
    # s = urllib.urlopen(url1, proxies=None)  
    # s = urllib.urlopen(url1) 
    # 不使用代理
    # s = urllib.urlopen(url1, proxies={})  

urllib.urlretrieve(url[, filename[, reporthook[, data]]])

urlretrieve方法直接将远程数据下载到本地。参数filename指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据)。

参数reporthook是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示当前的下载进度。

参数data指post到服务器的数据。

该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。

下面通过例子来演示一下这个方法的使用。

# -*- coding: utf-8 -*-
# @Author: HaonanWu
# @Date:   2016-12-23 10:54:10
# @Last Modified by:   HaonanWu
# @Last Modified time: 2016-12-23 11:18:15
import urllib

def print_list(lists):
    for i in lists:
        print i

def progress(blk, blk_size, total_size):
# 当服务器没有返回content-length首部时,urlretrieve不知道数据有多大,为total_size传入-1。
    if total_size > 0:
        print 'read %d/%d - %.02f%%' % (blk*blk_size, total_size, (float)(blk_size * blk) * 100 / total_size)
    else:
        print 'read %d blocks (%dbytes)' % (blk,blk*blk_size)

def retrieve(url):
    fname, msg = urllib.urlretrieve(url, 'index.html', reporthook=progress)
    # print fname
    # print_list(msg.items())

if __name__ == '__main__':
    url1 = 'https://github.com/Mr-Phoebe' 
    url2 = 'http://blog.csdn.net/u013007900'
    s = urllib.urlopen(url1)
    retrieve(url1)

urllib.urlcleanup()

清除由于urllib.urlretrieve()所产生的缓存

urllib.quote(url)和urllib.quote_plus(url)

将url数据获取之后,并将其编码,从而适用与URL字符串中,使其能被打印和被web服务器接受。

>>> urllib.quote('http://www.baidu.com')
'http%3A//www.baidu.com'
>>> urllib.quote_plus('http://www.baidu.com')
'http%3A%2F%2Fwww.baidu.com'

urllib.unquote(url)和urllib.unquote_plus(url)

与4的函数相反。

urllib.urlencode(query)

将URL中的键值对以连接符&划分

这里可以与urlopen结合以实现post方法和get方法:

GET方法:

import urllib
params = urllib.urlencode({'spam':1,'eggs':2,'bacon':0})
print params
f = urllib.urlopen("http://python.org/query?%s" % params)
print f.read()

POST方法:

import urllib
parmas = urllib.urlencode({'spam':1,'eggs':2,'bacon':0})
f = urllib.urlopen("http://python.org/query",parmas)
f.read()

实例

# -*- coding: utf-8 -*-
# @Author: HaonanWu
# @Date:   2016-12-23 19:58:48
# @Last Modified by:   HaonanWu
# @Last Modified time: 2016-12-23 21:29:07

import urllib
import datetime

def test_HTTP(url):
    s = urllib.urlopen(url)
    return s.getcode() == 200

def download_stock_data(stock_list):
    for sid in stock_list:
        url = 'http://table.finance.yahoo.com/table.csv?s=' + sid
        fname = sid + '.csv'
        print 'downloading %s form %s' % (fname, url)
        urllib.urlretrieve(url, fname)


def download_stock_data_in_period(stock_list, start, end):
    for sid in stock_list:
        params = {'a': start.month - 1, 'b': start.day, 'c': start.year,
                  'd': end.month - 1, 'e': end.day, 'f': end.year, 's': sid}
        url = 'http://table.finance.yahoo.com/table.csv?'
        qs = urllib.urlencode(params)
        url = url + qs
        if test_HTTP(url):
            fname = '%s_%d%d%d_%d%d%d.csv' % (sid, start.year, start.month, start.day,
                                              end.year, end.month, end.day)
            print 'downloading %s from %s' % (fname, url)
            urllib.urlretrieve(url, fname)
        else:
            print 'download error'

if __name__ == '__main__':
    stock_list = ['300001.sz', '310002.sz']
    # download_stock_data(stock_list)
    end = datetime.date(year=2015, month=12, day=17)
    start = datetime.date(year=2015, month=11, day=17)
    download_stock_data_in_period(stock_list, start, end)

猜你喜欢

转载自blog.csdn.net/jenrey/article/details/81012135