从笔下文学网站爬取一本名为《剑来》的小说,作者为烽火戏诸侯
网站网址如下:https://www.bxwxorg.com/
①通过查看网页源码找规律(在此之前请弄清楚网站允许爬取的部分,就该网站而言,没有限制)
②编写代码,实现功能
import requests
from bs4 import BeautifulSoup # 引入BS库
def text_save(filename, data): # 定义函数将列表中数据写入到文件中,filename为写入的文件,data为要写入数据列表.
file = open(filename, 'w', encoding='utf-8')
for i in range(len(data)):
s = str(data[i]).replace('[', '').replace(']', '') # 去除[]
s = s.replace("'", '').replace(',', '') + '\n' # 去除单引号,逗号,每行末尾追加换行符
file.write(s) # 将列表中数据依次写入文件中
file.close()
print("保存文件成功")
res = requests.get('https://www.bxwxorg.com/read/6964/')
html = res.text
soup = BeautifulSoup(html, 'html.parser')
find_title = soup.find('div', id="info") # 查找书名和作者名字的父级标签
title = find_title.find('h1') # 获取书名
author = find_title.find('p') # 获取作者名字
print('书名:', title.text, '\n作者:', author.text[5:]) # 打印书名和作者名字
find_intro = soup.find('div', id="intro") # 查找书籍简介的父级标签
intro = find_intro.find('p') # 获取书籍简介
print('简介:', intro.text) # 打印书籍简介
list_all = [] # 创建一个列表,为之后临时存放小说内容做铺垫
global m # 定义全局变量,记录列表中的元素个数
global n # 定义全局变量,记录之后列表中需要切片的位置(即最新章节部分所占的位置)
m = -1
n = 0
find_list = soup.find('dl')
lists = find_list.find_all('dd') # 查找章节内容的父级标签
for list_n in lists:
a = list_n.find('a')
name = a.text # 获取章节名称
chapter_url = a['href'] # 获取章节链接
res1 = requests.get(chapter_url) # 开始根据章节链接获取章节内容
html1 = res1.text
soup1 = BeautifulSoup(html1, 'html.parser')
find_article = soup1.find('div', id="content")
articles = find_article.find_all('p')
print(name, chapter_url)
list_all.append([name]) # 将得到的章节名称加入到列表中
m = m + 1
if name == "序章":
n = m - 3 # -3是为了给小说名字,作者姓名以及小说简介空出位置留待之后替换使用
print(n)
for article in articles: # 通过循环遍历得到小说一章节的内容并将其写入到列表中
list_all.append([article.text])
m = m + 1
list_m = []
list_m = list_all[n:-1] # 通过切片去掉小说前面的最新章节部分,避免与之后重复,并将其赋值给一个新的列表
list_m[0:3] = [title.text, author.text, intro.text] # 将列表中前三个元素替换为小说名字,作者姓名以及小说简介
text_save('剑来.txt', list_m) # 调用函数将列表内容存储到TXT文件中
③结果如下
第一次编写爬虫程序,比较没有思路,本程序通过列表方法暂存数据以实现写入txt文件,比较耗时,如果有更好的方法希望可以教教我。