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]