初学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) |