如何用python批量下载数据_使用Python批量下载数据

这次依旧是,不过下载的是Australian Bureau of Statistics的数据,都是xls的表格,网址为:http://www.abs.gov.au。网页打开左边有棵树目录,里面记录的澳大利亚的行政区名,然后后面有个get data 的链接,不过这棵树是动态加载的,客户端没法获取到全部的内容,像我这种从来没有做过网络编程的,脸html都看不懂的人,更不懂ajax了。笨人有笨方法,于是就把树全部点开,然后把网页的源代码保存下来,整理了一个txt文件,内容和下面的类似:

New South Wales - Get Data
一共有1665行,格式都和上面的类似。可以看到get data的链接是/ausstats/abs@nrp.nsf/lookup/1Main+Features12006-2010,然后就是从上面的字符串中提取get data的链接,获取连接后,使用urllib获取url地址的html内容。

然后再从获取的html中查找xls的下载地址,知道xls的下载地址,使用urlretrieve函数保存到本地即可。整个代码72行,如下:

# -*- coding:gb2312 -*-

# 有问题请联系我 liminlu0314@gmail.com

import sys

import urllib

import re

#从读取的html中解析下载地址

def ParserXlsUrl(content):

iPost = content.find('%2Exls&')

if iPost == -1:

return ''

strTemp = content[iPost-100:iPost+300]

iPos = strTemp.find('<')

strTemp = strTemp[:iPos+7]

#/AUSSTATS/freenrp.nsf/log?openagent&Region%5F1%2Exls&1&2006%2D2010%20National%20Regional%20Profile&CCAA9316217A9E75CA25793B001332FA&0&2006%2D2010&04%2E11%2E2011&Latest

return 'http://www.abs.gov.au' + strTemp

#从读进来的字符串解析url

def Save2Xls(lines):

iPos = lines.find('>')

strTmp = lines[iPos+1:]

iPos = strTmp.find('<')

strName = strTmp[:iPos] #取出Name

iPos = strTmp.find('"')

strTmp = strTmp[iPos+1:]

iPos = strTmp.find('"')

strTmp = strTmp[:iPos]

#/ausstats/abs@nrp.nsf/lookup/1Main+Features12006-2010

iPos = strTmp.find('lookup/')

strTmp = strTmp[iPos+7:]

iPos = strTmp.find('Main+')

strIdCode = strTmp[:iPos]

strStart = 'http://www.abs.gov.au/AUSSTATS/abs@nrp.nsf/DetailsPage/'

strMid = '2006-2010?OpenDocument&tabname=Details&prodno='

strEnd = '&issue=2006-2010&num=&view=&'

strUrl = strStart + strIdCode + strMid + strIdCode + strEnd

html = urllib.urlopen(strUrl)#打开连接

content = html.read()#获取页面内容

strUrlXls = ParserXlsUrl(content)

if strUrlXls == '':

return 0

strXlsDir = './Xls/'

strXls = strXlsDir + strName + '_' + strIdCode + '.xls'

urllib.urlretrieve(strUrlXls, strXls) #开始下载

return 1

if __name__ =="__main__":

f = open('GetUrl.htm', 'r')

alllines = f.readlines()

f.close()

index = 0

for eachline in alllines:

Save2Xls(eachline)

index = index + 1

print "current is %d of 1665, precent %d%%" %(index, (int)(index / 1665.0 * 100))之后程序写完后,发现不知道下载到什么地方了,又加了个进度信息。喜欢python,同样的代码用C++我不敢想象,还是Python吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值