zoukankan      html  css  js  c++  java
  • 使用Python批量下载数据

              又是下网页数据,之前用Python写过一个,下载的是国家统计局网站上的信息,地址为:http://blog.csdn.net/liminlu0314/article/details/7300240

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

    <span id="uidynatreeCb3trSLA1">New South Wales<a href="/ausstats/abs@nrp.nsf/lookup/1Main+Features12006-2010" onclick="openWindow('/ausstats/abs@nrp.nsf/lookup/1Main+Features12006-2010','1');"> - Get Data</a></span><br>
    
             一共有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('<a href="')
        strTemp = strTemp[iPos+9:]
        
        iPos = strTemp.find('&Latest"><')
        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吧。



  • 相关阅读:
    codeforces 669C C. Little Artem and Matrix(水题)
    codeforces 669B B. Little Artem and Grasshopper(水题)
    oracle drop table recyclebin恢复
    odu恢复drop表--不通过logmnr挖掘object_id
    odu恢复drop表--通过logmnr挖掘object_id
    odu恢复delete 表
    GO学习-(7) Go语言基础之流程控制
    GO学习-(6) Go语言基础之运算符
    GO学习-(4) Go语言基础之变量和常量
    GO学习-(3) VS Code配置Go语言开发环境
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314014.html
Copyright © 2011-2022 走看看