查看: 7170|回复: 3

  用Python进行网页分析实现批量下载(final version)

[复制链接]
论坛徽章:
0
跳转到指定楼层
1#
发表于 2006-8-1 12:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最终版:前几个版本(见本人的以前文章)基本都是用正则表达式实现匹配得到下载链接的,弊端有两方面:1。由于所 分析的网页很有规律,所以正则表达式实现起来过于繁琐,肯定不合适 2。各个任务之间都不不同,每次都重新编码,实现起来毫无规律,没有扩展性。所以此篇文章为这个专题的最终版,以后还有更多东西要学习,就不要在着方面纠缠了。

可执行版本:这次终于可以出一个自己比较满意的可执行版本,所以贴出源代码,作为这段工作的总结。相关的其他资源的获取,都可以由以下代码扩展之,而且相当简单,所以不再提供

运行要求:必须先下载和安装python-2.4.2.msi ,配置好Python环境;单击start.bat即可实现批量下载

源代码: 本工程只包括两个文件start.bat 和CustomParser.py:

start.bat

       //make the dir for files and run the project

        mkdir files
         python CustomParser.py

CustomParser.py

from sgmllib import SGMLParser
from string import find, replace, rjust
from threading import Thread
import urllib

__author__ = "Chen Peng (peng.ch@hotmail.com)"
__version__ = "$Revision: 1.0 $"
__date__ = "$Date: 2006/03/03 $"
__copyright__ = "Copyright (c) 2006 Chen Peng"
__license__ = "Python"

__all__ = ["Gif_163_Parser"]

class PDownloadThread( Thread ):
    """
    Download the files in the dict and save them to local files with the given name
    """
    def __init__( self, DictList,i ):
        Thread.__init__( self )
        self.DictList=DictList
        self.pageno=str(i);
   
    def run( self ):     
        for k in self.DictList.keys():
            try:
              print 'Download'+self.DictList[k]+'......'
              uFile=urllib.urlretrieve( self.DictList[k], '.\\files\\'+k+'.'+self.DictList[k].split('.')[self.DictList[k].split('.').__len__()-1])
            except :
               logfile = open('error.log', 'a')
               logfile.write(self.pageno+' '+self.DictList[k]+'   '+k+'\n')
               logfile.close()  
            print 'Save to file '+k        

class Gif_163_Parser( SGMLParser ):
   """
    任务:下载163彩图
    原理:http://mms.163.com/new_web/cm_lv ... amp;type=1&key=
        从1到415页(共6637)分析得到如下路径:“/fgwx/hhsj/1_060302175613_186/128x128.gif”
   eg:<script>showPic('22930','1','/fgwx/hhsj/1_060302175613_186/128x128.gif','1','编号:22930\n名字: 因为有你\n人气:100');</script>      
   下载路径:http://mmsimg.163.com/new_web/lo ... 612_995/176x176.gif
   """
   def reset( self ):                              
        SGMLParser.reset( self )
        self.headURL='http://mmsimg.163.com/new_web/loaditem.jsp/type=1/path='
        self.SubURL = []
        self.Links = {}
         
   def start_script( self, attrs ):
        #self.SubURL.extend( [' %s="%s"' % ( key, value ) for key, value in attrs] )
        pass

   def end_script( self ):
        pass
   
   def handle_data( self, text ):
        if find( text, 'showPic' )!=-1:
           self.Links[replace( text.split( '\\n' )[1], '\xc3\xfb\xd7\xd6: ', '' )]=self.headURL+replace ( text.split( ',' )[2], '\'', '' );
            
   def Execute( self ):   
       for i in range( 1, 415 ):
           self.Links.clear;
           try:
               usock = urllib.urlopen( "http://mms.163.com/new_web/cm_lv2_pic.jsp?catID=&ord=dDate&page="+str(i)+"&type=1&key=" )
               self.feed( usock.read() )
               usock.close()                     
               TestThread=PDownloadThread( self.Links ,i)
               TestThread.start()                 
               self.close()     
           except IOError:
               pass   
        #print ( ["%s=%sn"% ( k, self.Links[k] ) for k in self.Links.keys()] )
        #print self.Links

if __name__ == '__main__':
    #Gif_163_Parser().Execute();
     testtask=Gif_163_Parser()
     testtask.Execute()
论坛徽章:
0
2#
发表于 2008-7-19 15:47 | 只看该作者
顶!写的不错,好像程序有点问题,有点死循环迹象,一直不停地在下载~~~~

使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
3#
发表于 2008-8-9 23:35 | 只看该作者
GOOD!

使用道具 举报

回复
论坛徽章:
20
奥运会纪念徽章:蹦床
日期:2012-06-15 11:17:34三菱
日期:2013-11-27 11:07:49凯迪拉克
日期:2013-11-26 16:46:46马自达
日期:2013-11-07 08:41:49马自达
日期:2013-11-06 11:51:40红旗
日期:2013-11-06 00:17:58一汽
日期:2013-11-06 00:01:02雪铁龙
日期:2013-11-01 13:34:26宝马
日期:2013-10-28 11:47:30问答徽章
日期:2013-10-26 21:18:18
4#
发表于 2009-7-24 17:20 | 只看该作者
路过看一眼!

使用道具 举报

回复
论坛徽章:
0
5#
发表于 2014-11-22 07:17
Thanks, good one


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表