赞
踩
参考博客:完全小白篇-使用Python爬取网络小说
import requests import re from bs4 import BeautifulSoup # from docx import Document #创建正则表达式对象,r是为了避免对'/'的错误解析 findTitle = re.compile(r'<h1>(.*?)</h1>',re.S) findContext = re.compile(r'<p>(.*?)</p>',re.S) headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'} # 输入小说第一章网址 def getNovel(url, f): # 存放下一章的链接 link = url # 最后一章中,点击“下一章”会回到目录 while(link != "http://yk360.kekikc.xyz/413/"): # 获取网页源码 data = requests.get(url = link, headers = headers) #上文我们已经看到是UTF-8的编码格式,这里照搬按此解析即可 data.encoding = 'UTF-8' #解析得到网站的信息 soup = BeautifulSoup(data.text, 'html.parser') # print(soup) # 提取章节名 for item in soup.find_all('div', class_="m-title col-md-12"): item = str(item) title = re.findall(findTitle, item)[0] print(title) f.write(title + '\n') # 提取章节内容 for item in soup.find_all('div',id="content"): item = str(item) context = re.findall(findContext, item) for i in range(1, len(context)): f.write(context[i] + '\n') f.write('\n\n') # print(context) # print(len(context)) # 跳转到下一章 for item in soup.find_all('li', class_="col-md-4 col-xs-12 col-sm-12"): nextChp = item.find_all('a') tmpLink = nextChp[0].get('href') # print(tmpLink) link = "http://yk360.kekikc.xyz" + tmpLink #小说第一章的网址 baseurl = "http://yk360.kekikc.xyz/413/57269.html" with open("output.txt", "w") as f: getNovel(baseurl, f)
以 http://yk360.kekikc.xyz/413/57269.html 为例
(1)查看网页编码格式,在 head 标签里能找到
(2)查看章节名存放位置
(3)查看章节内容存放位置
(4)查看各章节间的跳转关系,最后一章的下一章是列表页面
(1)获取网页源码
设置 requests.get() 中的 headers 参数,用来模拟浏览器进行访问
# 获取网页源码
data = requests.get(url = link, headers = headers)
#上文我们已经看到是UTF-8的编码格式,这里照搬按此解析即可
data.encoding = 'UTF-8'
#解析得到网站的信息
soup = BeautifulSoup(data.text, 'html.parser')
print(soup)
(2)提取章节名
章节名存放在 class 为 m-title col-md-12
的 div 中的 h1 标签里,采用正则提取 findTitle = re.compile(r'<h1>(.*?)</h1>',re.S)
for item in soup.find_all('div', class_="m-title col-md-12"):
item = str(item)
title = re.findall(findTitle, item)[0]
print(title)
(3)提取章节内容
章节内容存放在 id 为 content
的 div 中的 p 标签里,采用正则提取 findContext = re.compile(r'<p>(.*?)</p>',re.S)
for item in soup.find_all('div',id="content"):
item = str(item)
context = re.findall(findContext, item)
print(context)
(4)跳转到下一章
下一章链接存放在 class 为 col-md-4 col-xs-12 col-sm-12
的 li 中的 a 标签里
for item in soup.find_all('li', class_="col-md-4 col-xs-12 col-sm-12"):
nextChp = item.find_all('a')
tmpLink = nextChp[0].get('href')
print(tmpLink)
link = "http://yk360.kekikc.xyz" + tmpLink
(5)将提取内容存入 TXT 文档中,其中需要注意存放章节内容时,第一个 p 标签内容为广告,需要跳过(所有的 p 标签内容按顺序存入 context 数组中,context 长度等于 p 标签个数)
for i in range(1, len(context)):
f.write(context[i] + '\n')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。