六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 58|回复: 0

用python编写递归爬取多重网址的网站信息

[复制链接]

升级  68%

8

主题

8

主题

8

主题

童生

Rank: 1

积分
34
 楼主| 发表于 2013-1-28 19:43:51 | 显示全部楼层 |阅读模式
项目组要得到这个http://kalug.linux.org.tw/~shawn/project/thesis/目录网址下面的所有文件以及这个文件目录的下层目录以及更下层目录的文件包括这个,用迅雷,flashget好像都没这样的功能:找到给一个链接,然后再递归爬取这个链接下的所有链接的。
   于是自己写了一个,好像还行o(∩_∩)o...呵呵 下面是代码,这里主要爬取pdf与doc文件。

# -*- coding: utf-8 -*-import urlparse,urllib,re,os"""this class is mainly used to crawl the deep url in the urlsdo this work for 242"""class SpiderMulti:            def read(self,url):        urlli=self.analy(url)        urldic = {}        cutli=urlli[1:]        for x in cutli:            urldic.update(x)        for url in [x.keys()[0] for x in cutli]:            if self.islink(url,urldic):                print url                self.read(url)            else:                self.download(url,urldic)                    def analy(self,url):        urlli=[]        try:            html=urllib.urlopen(url).read().split('\n')            orignalUrl = url    #re.search(r'<h2>(.*?)</h2>',url,re.I|re.DOTALL)            for eachline in html:                #print eachline                currentFind = re.search(r'href="(.*?)"',eachline,re.IGNORECASE|re.DOTALL)                if currentFind:                    urldic = {}                    curUrl = urlparse.urljoin(orignalUrl,currentFind.group(1))                    dirFind = re.search(r'class="t".*?>(.*?)<',eachline,re.IGNORECASE|re.DOTALL)                    curDir = dirFind.group(1)                    urldic[curUrl]=curDir                    urlli.append(urldic)        except:            print 'can not open ',url            pass                #print urlli        return urlli        def islink(self,url,urldic):        if urldic[url] == 'Directory':            return True        else:            return False            def download(self,url,urldic):        print '=====:',url,urldic[url]        if (self.isfile(url)):            name = os.path.join(r'd:\data',url.split('/')[-1])            print 'dowm:',url,name            try:                f=urllib.urlretrieve(url,name)            except:                print 'can not writtofile'                pass    def isfile(self,url):        if re.search(r'doc$|pdf$',url,re.IGNORECASE|re.DOTALL):            return True        else:            return False                                        if __name__=='__main__':    t=SpiderMulti()    url='http://kalug.linux.org.tw/~shawn/project/thesis/'    t.read(url)
解释一下:
1、主函数是read(),在这里面实现递归。

2、analy(url)函数分析传入的url,提取出该页的url链接,当然如果你要用你自己的url这里需要改变的是正则表达式的匹配规则。返回一个列表,列表的元素是字典,key是当前的链接地址,值是该地址对应的类型(这里主要是针对该类网站这样设计的,大家可以打开看看网页
的结果)。

3、islink()函数是判断输入的url是不是目录,如果是则递归执行read()函数

4、download()函数是:输入的链接对应的是个文件,但是不一定是我们想要的pdg或者doc文件,所以先用isfile()函数判断一下,然后再进行下载,完成任务。呵呵
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表