python 爬取 小说

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'&nbsp;', ' ', 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 帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值