Python网页抓取程序

本程序用于从网页抓取文本,也就是盗墓笔记的文本提取,写得简单,大家莫笑

''' 

 从盗墓笔记的网站中取得各集具体内容的地址,并从各集体内容网页中提取内容并写入文件中

'''
#-*- encoding: gb2312 -*-
import HTMLParser
import urllib
import sys
class urlParser(HTMLParser.HTMLParser):
    def __init__(self):
        self.urllist=[]
        HTMLParser.HTMLParser.__init__(self)        
        
    def handle_starttag(self, tag, attrs):
        # 这里重新定义了处理开始标签的函数
        if tag == 'a':
            # 判断标签<a>的属性
            for name,value in attrs:
                if name=='href':
                    self.urllist.append(value)
                
class DocParser(HTMLParser.HTMLParser):
    def __init__(self,filename):
        self.readingtitle = 0
        self.readingdoc=0
        self.record=0
       
        self.fsock = open(filename, 'w')
              
        HTMLParser.HTMLParser.__init__(self)
    def __del__(self):
        
        self.fsock.close()
        
    def handle_starttag(self, tag, attrs):
        if tag =='div':
            self.record+=1
        if tag == 'title':
            self.readingtitle = 1
        if tag == 'p':
            self.readingdoc = 1        
    def handle_data(self,data):
        if self.readingtitle:  #检查是否取得数据
        #通常这是一个慢又差的方法
            data=data.encode('utf-8')
            self.fsock.write( data)
            self.fsock.write( '\n\n')
        if self.readingdoc and self.record==11:
            if not ('google' in data):
                data=data.encode('utf-8')
                self.fsock.write( data)
    def handle_endtag(self, tag):
        if tag == 'title':
            self.readingtitle = 0
        if tag == 'doc':
            self.readingdoc = 0
            
def readdata(url):
    
    
    temp=url.split('/')[-1]
    fname=temp.split('.')[0]+'.txt'    
    my = DocParser(fname)
    # 传入要分析的数据,是html的。
    a=urllib.urlopen(url).read()
    a=a.decode('utf-8')
    my.feed(a)
    
    
if __name__ == '__main__':
    
    
    url=urlParser()
    f=urllib.urlopen('http://www.daomubiji.com/').read()
    f=f.decode('utf-8')
    url.feed(f)
    links=[]
    for link in url.urllist:
         if link.split('.')[-1]=='html':
             links.append(link)
    
    for link in links:
        readdata(link)

程序比较简单,就不具体解释了,大部分内容东拼西凑,包括内部的注释也没有改。程序运行也很慢,大约要一个小时才能完成,如果要改进一是改进HTML的解释算法, 二是引进多线程。

posted on 2011-04-14 10:06  zcmky  阅读(820)  评论(0编辑  收藏  举报

导航