ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

用python爬取新笔趣阁的所有小说,使用xpath提取

2021-11-19 19:32:03  阅读:179  来源: 互联网

标签:xpath novel name title python list 爬取 html href


运行后会在运行的目录下面建立一个建立一个笔趣阁的目录,小说会一每个目录分类,每部小说的章节都会在对应的小说目录里面

import time
import requests
from lxml import etree
import os

novel_name = "笔趣阁"
novel_length = 0


def main():
    getContents()
    get_novel_length()
    get_data()


def get_data():

    for i in range(novel_length):
        # 获取到一部小说的链接和名字
        href_name = get_href_name(index=i)
        # 一部小说的链接
        href = href_name[0]
        # 一部小说的名字
        name = href_name[1]
        # 网页返回的内容
        html = getHtml(url=href)
        # 整部小说的章节链接和名字
        lists = link_title(html=html)

        for j in range(len(lists)):
            # 将要爬取的章节链接
            link = lists[j][0]
            # 将要爬取的章节名字
            title = lists[j][1]
            to_link = "https://www.xbiquge.la" + link
            # 章节内容网页返回的内容
            novel_html = getHtml(to_link)
            store_novel(novel_html=novel_html, name=name, title=title)
            time.sleep(1)


def store_novel(novel_html, name, title):
    """
    这个存储的流程是,先将服务器返回回来的信息储存到本地,或许你会问为什么要多次一举?
    因为不做储存我取不到里面正文的内容,只能取到最后一段,所以我就先将它存放到本地然后读取出来
    请出来之后在笔趣阁这个目录下建立一个以小说名为名称的目录,再将小说章节的内容放在这个目录下面
    :param novel_html: 服务器放回的章节信息
    :param name: 爬取的小说名字
    :param title: 爬取的小说章节名
    :return: 
    """
    # 将传输过来的 HTML 信息保存起来
    with open(f"{novel_name}/novel.html", "w", encoding="utf-8") as f:
        f.write(novel_html)

    # 在主目录小判断有没有小说的目录,如果没有就创建
    if not os.path.exists(f"{novel_name}/{name}"):
        # 创建一个以小说名为名称的目录
        os.mkdir(f"{novel_name}/{name}")

    with open(f"{novel_name}/novel.html", "r", encoding="utf-8") as f:
        html = f.read()
    xml = etree.HTML(html)
    content = xml.xpath('//div[@id="content"]/text()')

    with open(f"{novel_name}/{name}/{title}.txt", "a", encoding="utf-8") as f:
        for result in content:
            f.write(f"{result.strip()}\n")
    
    print(f"{name}\t{title} 爬取完成>>>")


def link_title(html):
    """
    这个函数是用来提取出每一部小说中的章节链接和名字的
    :param html: 网页返回的内容
    :return: 章节名字和链接
    """
    # 创建一个列表用来储存整部小说的章节链接和名字
    lists = []
    xml = etree.HTML(html)
    dd_list = xml.xpath('//div[@id="list"]/dl/dd')
    for data in dd_list:
        # 创建一个临时列表,用来存放单个章节的链接和名字
        temp_list = []
        # 提取章节链接
        link = data.xpath('./a/@href')
        temp_list.append(str(link[0]))
        # 提取章节名字
        title = data.xpath('./a/text()')
        temp_list.append(str(title[0]))
        lists.append(temp_list)
    return lists


def get_href_name(index):
    """
    返回指定的链接和小说名字
    :param index: 第几条数据
    :return: 返回读取到的链接和名字
    """
    with open(f"{novel_name}/biqvge.txt", "r", encoding="utf-8") as f:
        data = f.readlines()
        href_name = data[index].split()
    return href_name


def get_novel_length():
    """
    获取笔趣阁文件中的链接有多少条
    """
    global novel_length
    with open(f"{novel_name}/biqvge.txt", "r", encoding="utf-8") as f:
        length = len(f.readlines())
    novel_length = length


def getContents():
    """
    这个函数用来做储存处理,创建笔趣阁的目录,然后将小说的名字和链接保存起来
    """
    # 创建一个列表用来储存整个页面的信息
    lists = []
    url = "https://www.xbiquge.la/xiaoshuodaquan/"
    html = getHtml(url=url)
    xml = etree.HTML(html)
    li_list = xml.xpath('//div[@id="main"]/div/ul/li')

    for li in li_list:
        # 创建一个临时列表,用来储存单个信息的元素,例如小说的名字和链接
        temp_list = []
        # 找出小说的名字
        title = li.xpath('./a/text()')
        temp_list.append(str(title[0]))
        # 找出小说的链接
        href = li.xpath('./a/@href')
        temp_list.append(str(href[0]))
        # 追加到大列表中
        lists.append(temp_list)

    # 判断笔趣阁目录是否存在,不存在则创建
    if not os.path.exists(novel_name):
        print(f"没有“{novel_name}”这个目录,正在为你创建>>>>>")
        os.mkdir("笔趣阁")
        print("创建成功>>>>>")

    # 将信息保存起来,链接在前名字在后
    with open(f"{novel_name}/biqvge.txt", "a", encoding="utf-8") as f:
        for data in lists:
            f.write(f'{data[1]} {data[0]}\n')
    print("储存成功")


def getHtml(url):
    """
    由于笔趣阁的请求不需要请求头,所以就没有添加多余的头部信息
    :param url: 请求的连接
    :return: 返回请求后的处理内容
    """
    response = requests.get(url)
    html = response.content.decode("utf-8")
    return html


if __name__ == '__main__':
    main()

 

标签:xpath,novel,name,title,python,list,爬取,html,href
来源: https://www.cnblogs.com/wushuaiqi/p/15578827.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有