Python抓取小说

Python抓取小说

前言


此脚本为了在MAC上抓取小说而写,用Python几句代码就可以了。


代码


# coding=utf-8

import re
import urllib2
import chardet
import sys
from bs4 import BeautifulSoup
import codecs

class Spider():

    def __init__(self):
        self.aTag=re.compile("<a href=\"(http://www.44pq.com/read/[0-9]+?_[0-9]+?.html)\"[^>]*?>(.+?)</a>")
        self.contentTag=re.compile("<div class=\"readerContent\" id=\"content\">(.+?)</div>",re.I|re.S)

    def getHtml(self, url):
        headers = {‘User-Agent‘:‘Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6‘}
        req=urllib2.Request(url,headers=headers)
        response = urllib2.urlopen(req)
        
        html = response.read()
        return html
        #soup=BeautifulSoup(html.decode("GB18030","ignore"))
        #return soup.findAll("a")
        #return soup.prettify()
        #typeEncode = sys.getfilesystemencoding()
        #infoencode = chardet.detect(html).get(‘encoding‘,‘utf-8‘)
        #return html.decode(‘GB18030‘,‘ignore‘).encode("utf-8")
        return html.decode(‘GB18030‘,‘ignore‘).encode(sys.getfilesystemencoding())
    
    def Run(self):
        bookurl="http://www.44pq.com/read/13567.html"
        bookname="地球上唯一的魔法师"
        text=[]
        matchs=self.aTag.finditer(self.getHtml(bookurl))
        alist=list(matchs)
        total = len(alist)
        print "total {0}".format(total)
        i=0
        for m in alist:
            i+=1
            text.append(m.group(2).decode("gb18030"))
            text.append(self.getContent(m.group(1)))
	    self.writeFile(bookname,"\n\n".join(text))
	    del text[:]
            print "{0}/{1}".format(i,total)
        self.writeFile(bookname,"\n\n".join(text))
        print "done!"

    def writeFile(self,filename,text):
        f=open(filename+".txt","a")
        f.write(text)
        f.close()


    def getContent(self,url):
        c=self.getHtml(url)
        
        c=self.contentTag.search(c).group(1)
        c=re.sub("<[^>]+?>","",c)
        c=c.replace("nbsp;","").replace("&","")
        return c.decode("gb18030")


if __name__ == ‘__main__‘:
    reload(sys)
    sys.setdefaultencoding(‘utf-8‘)
    spider = Spider()
    spider.Run()


声明一下,实在搞不定CSDN编辑器的格式问题了,上述代码中:

self.writeFile(bookname,"\n\n".join(text))
del text[:]

这两行是在for循环里的,而不应该是与关键字for对齐的。



上面不必要的import可以删掉。以小说《地球上唯一的魔法师》为例,aTag是匹配小说目录所有章节的正则表达式,contentTag是匹配小说正文的正则表达式。

需要声明一点,此代码每抓取一章,就写入文件一次,以防内存占用过大。

self.writeFile(bookname,"\n\n".join(text))
del text[:]


如果需要,也可以抓取N章写入文件一次,只需加入一个简单的逻辑判断就OK了。占用多少内存和写多少次文件,每个人有自己不同的衡量标准。





Python抓取小说,布布扣,bubuko.com

Python抓取小说

上一篇:定时调度框架Quartz随笔


下一篇:java 实现系统目录树 ,树控件使用,显示 系统文件夹