欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python中urllib模块的使用

程序员文章站 2022-05-03 21:42:32
...

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)
相关标签: urllib