Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29939
  • 博文数量: 6
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-13 13:23
文章分类

全部博文(6)

文章存档

2013年(6)

我的朋友

分类: Python/Ruby

2013-11-03 11:17:31

初学python,感觉python确实很强大,很简洁。有很多现成的库可以用,很方便。
代码是参考的网上的代码,在这里加上详细的注释,希望帮到跟我一样的新手。


#file:    urllister.py

from sgmllib import SGMLParser
class URLLister(SGMLParser):
    def reset(self):                              
        SGMLParser.reset(self)
        self.urls = []

    def start_a(self, attrs):                     
        href = [v for k, v in attrs if k=='href']
        if href:
            self.urls.extend(href)


#file:    spider.py


import urllib, urllister
#urllib是python的标准库
#urllister 是自定义的文件,包含class URLLister(继承自SGMLParser),重定义了start_a方法,将 def getURL(url):
    try:
        usock = urllib.urlopen(url)#打开一个url
    except:
        print 'get url excepton'
        return []
    parser = urllister.URLLister()
    parser.feed(usock.read())    #将返回的html转换成字符串,同时调用了start_a方法,url信息已经保存在了parser.urls中
    usock.close()
    parser.close()
    urls = parser.urls
    return urls

#spider(startURL,depth)递归调用getURL(url),startURL为起始URL,depth为递归次数,即遍历的深度

def spider(startURL, depth):
    i = 0
    global num      #num为全局变量,用来记录打印的url的数目
    if depth <= i:    #达到遍历的最深层
       return 0
    else:
       urls = getURL(startURL)    #从startURL返回的html中所有的url,保存在一个list中,即urls中
       if len(urls) > 0:
            for url in urls:        #对urls中的每条url递归调用spider,
                print url, num
                num = num + 1
                spider(url,depth - 1)#每次递归,深度减1
       else:
                return 0
    return 1

#调用spider

num = 0
spider("",2)
阅读(2974) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~