htbzwd 发表于 2015-4-25 11:27:26

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=')
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 == 'id'):
                  key = attr
                if (attr == 'value'):
                  value = attr
      if tags == 'select':
            for attr in attrs:
                if attr == 'id':
                  key = attr
      if tags == 'option':
            if len(attrs) == 2:
                for attr in attrs:
                  if attr == 'value':
                        key = self.QQs.pop()
                        value = attr
      #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;  
  
页: [1]
查看完整版本: Python 利用HTMLParser做网络爬虫