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)
上一篇: 分布式锁及三种实现方式
下一篇: SVG 学习