mainBodyL=re.findall(zb,DData,re.S)
mainBody=mainBodyL[0]
mainBody=mainBody.replace('
','\n') mainBody=mainBody.replace(' ',' ') return mainBody
','\n') mainBody=mainBody.replace(' ',' ') return mainBody
现在已经基本完成了目标要达到的所有内容了,现在要做的就是把每一章保存下来。
使用代码:
def saveDataFileN(DData,DFileN):
f = open(DFileN,'w', encoding = LXBM)
f.write(DData)
f.close()
现在基本已经实现了所有的功能代码如下:
#getStory
#爬取一个小说网的一部小说。
import urllib.request
import re
import time
targetDir='Y://斗破苍穹分章下载/' #文件的保存路径
LXBM='gbk' #文件的编码类型,需要单独设置
weburlT='http://www.bxwx.org/b/8/8823/'
weburlN='5789596.html'
weburl=weburlT + weburlN
webheaders={
'Connection':'Keep_Alive',
'Accept':'text/html,application/xhtml+xml,*/*',
'Accept-Language':'zh-CN,zh;q=0.8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.154 Safari/537.36 LBBROWSER',
} #报头,模拟浏览器的访问行为
def getDate(Burl,Bheaders):
#根据url地址得到该url中的文本数据
req = urllib.request.Request(url=Burl,headers=Bheaders)#构造请求头
data = urllib.request.urlopen(req).read() #读取数据
data1 = data.decode(LXBM,'ignore') #把读取的数据转换为utf-8的格式
return data1
def saveDataFileN(DData,DFileN):
#保存文件,传入的为文件数据,文件名
f = open(DFileN,'w', encoding = LXBM)
f.write(DData)
f.close()
def getTitle(DData): #得到文章的题目
zb=r'(.*?)' #正则表达式 查找内容
titleL=re.findall(zb,DData)
print(titleL[0])
title = titleL[0]
title = title.replace('?','')
return title
def getNext(DData): #得到下一章的url 最后一章没有返回值
zb=r'录 下一'
nextL=re.findall(zb,DData)
#print(nextL[0])
if nextL:
return nextL[0]
return 0
def getNr(DData): #读取正文内容
zb=r'(.*?)
mainBodyL=re.findall(zb,DData,re.S)
mainBody=mainBodyL[0]
mainBody=mainBody.replace('
','\n')
mainBody=mainBody.replace(' ',' ')
return mainBody
if __name__ == '__main__': #程序运行的入口
num = 0
while True:
html=getDate(weburl,webheaders)
title = getTitle(html)#得到这一章的题目
body = getNr(html) #得到内容
text=' ' + title + '\n' + body
num =num + 1
file=targetDir + str(num) + title +'.txt'
saveDataFileN(text, file) #保存到单章中
Nurl=getNext(html)#得到下一章的url
if Nurl == 0:#如果是最后一章则跳出去
break
weburl=weburlT+Nurl
print(weburl)
time.sleep(0.15) #睡眠50毫秒,防止被封ip
print('end')
在执行时出现了一个OSError :可能的原因是存文件名时有一个英文的’?‘通过在字符串中的替换成功解决了这个问题。