编程语言
首页 > 编程语言> > 用python爬取新笔趣阁的所有小说,使用xpath提取

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

作者:互联网

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

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