import urllib.request,urllib.error
from itertools import count
from urllib.parse import urljoin
from xml.etree.ElementPath import findtext
from bs4 import BeautifulSoup
import re
import xlwt
from getDouban import finTitle
# 《剑来》小说目录链接
baseurl="https://www.xiakabbb.com/txt34237.shtml"
#请求头
headers = {
"User-Agent": "XXXXX(此处获取小说页面的请求头填入即可)"
}
# 正则提取章节链接
findLink =re.compile(r'href="(.*?)"')
# 提取文本内容
findTitle=re.compile(r'<h1>(.*?)</h1>')
# 存储章节url链接
listUrl=[]
# 获取一个网站页面数据,返回html文本信息
def geturl(url):
res = urllib.request.Request(url=url, headers=headers)
html = ""
try:
req = urllib.request.urlopen(res)
html = req.read().decode("utf-8")
# print(html)
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
return html
def getTxt(html_text):
clean_text=''
if html_text:
# clean_text = re.sub(r'<[>]+>', '', html_text) # 去除HTML标签
# clean_text = re.sub(r'<br />', '', clean_text)
clean_text = re.sub(r' ', ' ', clean_text) # 将HTML空格实体替换为普通空格
clean_text = re.sub(r'\s+', ' ', clean_text) # 将多个空格替换为一个空格
clean_text = clean_text.strip() # 去除首尾空格
return clean_text
# 解析html
def analysisData(url):
html = geturl(url)
soup = BeautifulSoup(html, "html.parser")
for itr in soup.findAll('div',id='list'):
itr=str(itr)
link=re.findall(findLink,itr)
# print(len(link))
# print(link)
for item in link:
item=str(item)
absolute_url = urljoin(url, item)
# print(absolute_url)
listUrl.append(absolute_url)
# 本地存储小说路径
savepath = 'E:\Program Files\loadFile\剑来.txt'
count=0
#打开本地一个剑来.txt文件,没有的话,则会创建 "a" 会在打开文件后,将获取到的内容,往后添加进去。"w" 则是直接将获取的内容,写入文件,然后会关闭文件
# 此处操作,表示,打开一个文件,然后在文件内解析html,并提取文本内容,不断的将文本内容写入文件。写完之后,才会关闭文件。
# 该操作结果则是,会把一整本小说内容,写到一个文本文件中。 此处,也可以先做遍历提取文本内容,然后,通过遍历改变剑来.txt的后缀,将每一个章节写入一个文本文件
with open(savepath,"a",encoding="utf-8") as file:
for itemRul in listUrl:
count+=1
txturl=str(itemRul)
newHtml=geturl(txturl)
newsoup = BeautifulSoup(newHtml, "html.parser")
h1_tag=newsoup.find('h1')
html_name=''
if h1_tag:
html_name=h1_tag.text
# print(html_name)
html_name = html_name.strip()
file.write(html_name+"\n")
html_test=newsoup.find('div',id='content').get_text()
html_test=html_test.strip()
# print(html_test)
file.write(html_test+"\n")
print("当前章节数:"+str(count) )
def main():
analysisData(baseurl)
# 按装订区域中的绿色按钮以运行脚本。
if __name__ == '__main__':
main()
# 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助
python 爬取 小说
于 2024-10-25 11:43:41 首次发布