Python 利用HTMLParser做网络爬虫

凡举搜索引擎都需要只能网络爬虫来获得最新的网络信息,那么我们自己也可以实现一个简单的定点的爬虫来获取自己感兴趣的内容,论开发速度,我推荐python

 使用urllib和HTMLParser这两个模块就可以完成一个不错的基本功能的爬虫了,废话少说,现在开始

 首先是获取链接的线程,函数如下

 代码

 

 接着是解析网页内容的类:

代码
 1 class IndexPage(HTMLParser.HTMLParser):
 2     def __init__(self, cbFun, cbFunCmd):
 3         HTMLParser.HTMLParser.__init__(self)
 4         self.ids = ids
 5         self.cbFun = cbFun
 6         self.cbFunCmd = cbFunCmd
 7         pass
 8     def handle_starttag(self, tags, attrs):
 9         if tags == 'a':
10             for attr in attrs:
11                 for t in attr:
12                     if '?id=' in t:
13                         id = t.split('?id=')[1]
14                         #self.ids.append()
15                         if not exist(self.ids,TABLEURL +  id):
16                             self.ids.append(TABLEURL + id)
17                             self.cbFun(TABLEURL + id)
18                             #self.cbFunCmd('now collected link number ' + str(len(self.ids)))
19                             pass
20                         pass
21                     pass
22                 pass
23             pass
24         pass
25     

 

将取出的可用链接保存到一个元组中,在开启另一个线程

代码
 1 def collectthread(cbFunCmd):
 2     token = 1
 3     while(token):
 4         if (len(ids) > 0):
 5             url = ids.pop(0)
 6             data = getwebcontent(url)
 7             parser = ContentParser(cbFunCmd)
 8             parser.feed(data)
 9             QQS = parser.get_QQs()
10             #print(QQS)
11             #pushToDB(QQS)
12         pass
13     

 

这个线程监视那个元组内容,不为空时,pop出内容进行处理,处理类如下

代码
class ContentParser(HTMLParser.HTMLParser):
    
def __init__(self, cbFun):
        HTMLParser.HTMLParser.
__init__(self)
        self.cbFun 
= cbFun
        self.QQs 
= []
        
pass
    
def handle_starttag(self, tags, attrs):
        key 
= ''
        value 
= ''
        
if (tags == 'input'):
            
for attr in attrs:
                
if (attr[0] == 'id'):
                    key 
= attr[1]
                
if (attr[0] == 'value'):
                    value 
= attr[1]

        
if tags == 'select':
            
for attr in attrs:
                
if attr[0] == 'id':
                    key 
= attr[1]
        
if tags == 'option':
            
if len(attrs) == 2:
                
for attr in attrs:
                    
if attr[0] == 'value':
                        key 
= self.QQs.pop()[0]
                        value 
= attr[1]
        
#print( (key, value) )
        if (key != '' and key != 'save'):
            
            self.QQs.append( (key, value) )
        
pass
        
    
def get_QQs(self):
            
return self.QQs;

 

 当然,不要忘记定义那个元组

1 ids = []

 

最后,获取源码的方法

代码
1 def getwebcontent(url):
2     #url = INDEXURL + '10'
3     data = urllib.urlopen(url).read().decode('utf-8')
4     #data = data.replace(u'\u67fb', '')
5     #data = data.replace(u'\u6d11', '')
6     uData = data.encode('gbk')
7     return uData;

 

 

posted @ 2010-09-30 15:01  firefly_liu  阅读(3688)  评论(1)    收藏  举报