小说获取

最近突然想追<我的26岁女房客>,趁着闲暇时间好好拜读一下网友所说的这本充满"幸福"的小说

当然,作为一位计算机技术爱好者,那肯定是想试一下一些技术手段保存到本地啦

需求

根据每一章标题、内容分别生成一个文本文件保存到本地

目标网址:我的26岁女房客
页面分析

​ 页面很清爽,所有的信息都在<div id='list'> -> dl -> dd标签中所以我们首先只需要获取到这个父节点然后批量的去循环获取每章节的超链接即可

 li_list = html.css('div#list dl dd')
 for li in li_list[7:]:
     link_list.append(li.css('a::attr(href)').get())

​ 上述代码主要是先获取到父节点标签然后去循环遍历,获取其中a标签中的链接并添加到列表中,由于dd标签前几部分是我们不需要的内容,所以使用切片格式去除掉

df = pd.DataFrame(link_list, columns=['links'])
df.to_excel('links.xlsx', index=False)

​ 为了便捷后续的操作,我这里选择了将获取的所有链接先保存到Excel文件中(当然这一步骤完全可以省略,后续只要遍历保存链接的列表即可).这里使用了pandas库对列表进行了一个格式化写入文件,并指定了表头

获取章节内容

​ 循环遍历保存链接的列表,在这里我使用的是读取Excel文件,方法大同小异

for li in link_list:
    print(li)
    html_content = get_novel_links(li)
    if html_content is None:
        print(f"跳过无效链接{li}")
        continue

​ 打开二级页面,使用浏览器开发者工具发现所有的小说内容都存在p标签中,由于页面源码中仍会存在一些脏数据,所以在获取的时候还要进行一次数据清理的动作

n_title = html.xpath('/html/body/div[2]/div/div[2]/h1/a/text()').get()
contents = html.css('div#content p::text').getall()
cle_cont = ' '.join([p.strip() for p in contents])
信息保存

​ 信息获取下来了当然是选择存储到本地阅读

with open(f'D:\\workspace\\pycharm\\Demo\\novel\\text\\{n_title}.text', 'w', encoding='utf-8') as file:
    file.write(n_title + "\n\n" + cle_cont)
完整代码
import requests, parsel, pandas as pd, os, time
from openpyxl import Workbook


def get_novel_links(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
    }
    res = requests.get(url, headers=headers)
    res.conding = res.apparent_encoding
    if res.status_code == 200:
        return res.text
    else:
        return None


# url = r"https://www.000zww.com/243/243840/index.html"
# html = parsel.Selector(get_novel_links(url))
# link_list = []
# li_list = html.css('div#list dl dd')
# for li in li_list[7:]:
#     link_list.append(li.css('a::attr(href)').get())
#
# df = pd.DataFrame(link_list, columns=['links'])
# df.to_excel('links.xlsx', index=False)

# 保存到excel
wb = Workbook()
wb.remove(wb.active)
start_time = time.time()
data = pd.read_excel('links.xlsx', header=None)
link_list = data.iloc[:, 0].dropna().tolist()  # 选择第一列的数据并清除空值,转为列表
for li in link_list:
    print(li)
    html_content = get_novel_links(li)
    if html_content is None:
        print(f"跳过无效链接{li}")
        continue
    html = parsel.Selector(html_content)
    n_title = html.xpath('/html/body/div[2]/div/div[2]/h1/a/text()').get()
    contents = html.css('div#content p::text').getall()
    cle_cont = ' '.join([p.strip() for p in contents])
    # cle_cont = ' '.join([p.replace('\n', ' ').strip() for p in contents])

    if n_title and cle_cont:
        # 保存到excel
        # ws = wb.create_sheet(title=n_title)
        # ws.append(['标题', '内容'])
        # ws.append([n_title, cle_cont])
        # 保存到文本
        with open(f'D:\\workspace\\pycharm\\Demo\\novel\\text\\{n_title}.text', 'w', encoding='utf-8') as file:
            file.write(n_title + "\n\n" + cle_cont)
# wb.save('D:\\workspace\\pycharm\\Demo\\novel\\excel\\novels.xlsx')
end_time = time.time()
print(f"程序运行时间: {end_time - start_time}")

本篇文章及其中所涉及的所有代码、数据和信息(以下简称“内容”)仅用于个人学习、研究或欣赏的目的,并非商业用途。我们尊重并遵守《中华人民共和国著作权法》及相关法律法规,坚决维护原作者的合法权益。

所有通过本文介绍的方法获取的数据来源均为公开可访问的网站或平台,且在操作过程中严格遵循目标网站的《服务条款》与《隐私政策》,不进行任何违反规定的行为。如您是任何被引用作品的权利持有人,并认为您的权利受到了侵害,请联系我,我将立即采取措施移除相关内容或提供适当的授权证明。

请注意,未经授权不得将本内容用于任何商业目的或以其他形式发布、传播。对于因不当使用本内容而导致的任何直接或间接损失,本人概不负责。

最后,提醒读者在进行网络爬虫活动时应当合法合规,尊重他人的劳动成果,共同营造良好的互联网环境。

posted @ 2025-01-10 15:28  这阵风是晚安  阅读(23)  评论(0)    收藏  举报