您的位置:首页 > 编程语言 > Python开发

Python抓取小说

2014-05-14 00:48 274 查看

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蜘蛛