储备知识应有:Python语言程序设计
Python网络爬虫与信息提取
两门课程都是中国大学MOOC的精彩课程,特别推荐初学者。环境Python3
本文整体思路是:1.获取小说目录页面,解析目录页面,得到所有章节链接存储在一个二维列表中。对应函数 allurl(urldir,html)
2.每次解析一章节,然后保存在文件中。对应函数 fillFile(urldir, file)
# 下载斗罗大陆
import bs4, lxml, traceback
from bs4 import BeautifulSoup
import requests
#爬取网页信息
def getHtmlText(url):
try:
# 设置代理 获取网页
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
r=requests.get(url, headers= header)
# 判断返回状态
r.raise_for_status()
# 设置编码
r.encoding=r.apparent_encoding
# 返回网页内容
return r.text
except:
return "获取网页信息失败"
#解读网页信息
def fillFile(urldir, file):
# 总章节数
numbers = len(urldir)
# 当前处理的章节数
index = 1
# 对二维列表进行解析
for i in range(numbers):
# 处理一维列表
child = urldir[i]
text = getHtmlText(child[1])
# 煲汤,解析网页信息
soup = BeautifulSoup(text, 'lxml')
# 获取标题
title = child[0]
# 捕获出现的异常
try:
# 获取内容
content = soup.select('#content')[0].text.replace('<br/><br/>', '').strip('style56(); ')
both = title + '\n' + content + '\n'
file.write(both)
except IndexError:
print(title + '出现列表索引异常----------------')
print(traceback.print_exc())
except:
print(title + ' 出现异常')
# 打印具体的异常信息
print(traceback.print_exc())
print('\r{}当前已下载:{:.3f}%'.format(title,index / numbers * 100))
index += 1
# 解读目录信息,获取所有章节url
def allurl(urldir,html):
# 煲汤,解析目录信息
soup = BeautifulSoup(html,'html.parser')
# 查找目录信息位置
allurl = soup.find_all('div', class_="clearfix dirconone")[0]
# 下行遍历获取所有的章节信息 保存在二维列表中
for li in allurl.children:
# 是否是标签对象
if isinstance(li, bs4.element.Tag):
# 读取a标签
lis = li.a
# 在字典类型中获取标题和链接
name,link = lis.attrs['title'].split(sep=',共')[0], lis.attrs['href']
urldir.append([name, link])
def main():
# 小说目录地址
url = 'http://www.quanshuwang.com/book/44/44683'
# 存储所有的章节链接
uinfo = []
# txt文件
file = open('D:斗罗大陆.txt', 'w', encoding='utf-8')
# 获取网页内容
html = getHtmlText(url)
# 将所有目录url放入uinfo
allurl(uinfo, html)
# 将每一章解析到txt文件中
fillFile(uinfo, file)
# 关闭文件
file.close()
main()