人工智能

导航菜单



当前位置: 首页  /  python  /  正文

Python零基础爬虫项目,采集小说网站整站数据

阅读:35

Python零基础爬虫项目,采集小说网站整站数据

声明:本文只做学习使用,禁止用作非法途径,一切因为爬虫技术使用不当造成的不良后果皆与本人无关


需要用到的库和模块

要获取的信息

网站 http://www.aixiawx.com

首先我们要确定要得到什么数据

主要步骤

(一)构建请求头

headers = {
    'User-Agent': '****************',#可填入自己的
}
base_url = 'http://www.aixiawx.com/27/27010/'

(二)分析URL参数规律


随便打开一个小说的章节,由此可见这个url参数是递增的是吧。
但是最开始的时候我观察到在这里的url是有递增规律的,就没有多看几眼,然后使用了遍历就发生了Error。
最终我测试发现部分章节不符合规律,所以不能使用这个方法来遍历url。
这样怎么办呢?

在目录页面拥有所有章节的url链接
可以抓取章节页面的url使之形成一个列表,然后遍历该列表,即可获取每个章节的链接

  1. 目录页面分析

根据章节的数量判断,<dd>标签一个是最合适的选择标签,所以我们使用<dd>标签来做获取章节链接的顶级索引

代码如下:

def analysis_catalogue(catalogue_html: "目录HTML文档"):
    '''
    解析目录HTMl文档
    获取小说章节链接
    对章节链接排序
    '''
     html = etree.HTML(catalogue_html)
    contentds = html.xpath('//dd[position()>9]/a/@href')
    for contentd in contentds:
        yield contentd
    contentus = html.xpath('//dd[position()<10]/a/@href')
    for contentu in contentus:
        yield  contentu

收集小说的其他信息则比较简单,我们可直接通过属性索引

代码如下:

def analysis_get_file_name(catalogue_data: "目录HTML文档"):
    '''
    获取信息:
    书名
    作者名
    类型
    整理文件名:file_name
    '''
    html = etree.HTML(catalogue_data)
    name_rules = [
        '//meta[@property="og:novel:category"]/@content',
        '//meta[@property="og:novel:author"]/@content',
        '//meta[@property="og:novel:book_name"]/@content',
    ]
    file_name = ''
    for name_rule in name_rules:
        content = html.xpath(name_rule)
        print(content)
        file_name = file_name + '#' + ''.join(content)
    file_name = file_name + '.txt'
    return file_name
  1. 章节页面分析

分析完目录,获取到所有章节的url链接,这时我们要去获取所有章节中的内容,这时我们可随意选择一章进行分析

经过分析,<h1>标签可以索引获取到章节名,而div的属性和属性值id="content"可以索引到文章的正文内容

代码如下:

def get_one_section(end_url: '每个章节的url'):
    '''对单元章节进行请求'''
    url = 'http://www.aixiawx.com' + end_url
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.content.decode('utf8')
        else:
            print(response.status_code)
        return None
    except RequestException:
        return None


def analysis_one_section(one_section_data: "一个章节的HTML数据"):
    '''解析每个章节的数据'''
    html = etree.HTML(one_section_data)
    contents = html.xpath('//div[@id="content"]//text()')
    chapter_data = html.xpath('//h1/text()')
    print(chapter_data)
    yield ''.join(chapter_data)
    for content in contents:
        if content != '\n':
            yield content.strip()

这里的章节获取到是一个列表,写入会很不方便,所以先使用join()方法给其字符串。除此之外文章的正文部分会有部分空字符串,这时候使用strip()进行删减。yield后面是一个生成器,这样爬取不会给内存造成很大的负担
(三)写入数据

由于是要进行阅读,所以我们使用txt写入数据

def analysis_write(file_name: '写入的文件名', write_one_section_data: '要写入的单个章节的数据'):
    '''写入数据'''
    with open(file_name + '.txt', 'a+', encoding='utf-8') as file:
        file.write(write_one_section_data + '\n')

(四)主函数调整

主体函数进行子函数的安排调整

def main():
    base_url = get_base_url()  # 对章节url进行获取

    catalogue_html = get_catalogue(base_url)  # 请求章节页面

    file_name = analysis_get_file_name(catalogue_html)  # 获取小说各部分信息,构建文件名

    end_urls = analysis_catalogue(catalogue_html)  # 获取每个章节的url

    for end_url in end_urls:
        one_section_data = get_one_section(end_url)  # 对每个url发送请求

        write_one_section_datas = analysis_one_section(one_section_data)  # 解析每个章节的数据

        for write_one_section_data in write_one_section_datas:

最终结果

代码

import requests
from lxml import etree
from requests import RequestException

headers = {
    'User-Agent': '*********************',#写自己的
}
base_url = 'http://www.aixiawx.com/27/27010/'


def get_base_url():
    '''获取目录链接'''
    print('请输入小说的base_url:')
    base_url = input()
    return base_url


def get_catalogue(base_url: "目录链接"):
    '''
    对目录链接的请求访问
    '''
    try:
        response = requests.get(base_url, headers=headers)
        print(response.status_code)
        if response.status_code == 200:
            return response.content.decode('utf-8')
        return None
    except RequestException:
        return None


def analysis_catalogue(catalogue_html: "目录HTML文档"):
    '''
    解析目录HTMl文档
    获取小说章节链接
    对章节链接排序
    '''
     html = etree.HTML(catalogue_html)
    contentds = html.xpath('//dd[position()>9]/a/@href')
    for contentd in contentds:
        yield contentd
    contentus = html.xpath('//dd[position()<10]/a/@href')
    for contentu in contentus:
        yield  contentu



def analysis_get_file_name(catalogue_data: "目录HTML文档"):
    '''
    获取信息:
    书名
    作者名
    类型
    整理文件名:file_name
    '''
    html = etree.HTML(catalogue_data)
    name_rules = [
        '//meta[@property="og:novel:category"]/@content',
        '//meta[@property="og:novel:author"]/@content',
        '//meta[@property="og:novel:book_name"]/@content',
    ]
    file_name = ''
    for name_rule in name_rules:
        content = html.xpath(name_rule)
        print(content)
        file_name = file_name + '#' + ''.join(content)
    file_name = file_name + '.txt'
    return file_name


def get_one_section(end_url: '每个章节的url'):
    '''对单元章节进行请求'''
    url = 'http://www.aixiawx.com' + end_url
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.content.decode('utf8')
        else:
            print(response.status_code)
        return None
    except RequestException:
        return None


def analysis_one_section(one_section_data: "一个章节的HTML数据"):
    '''解析每个章节的数据'''
    html = etree.HTML(one_section_data)
    contents = html.xpath('//div[@id="content"]//text()')
    chapter_data = html.xpath('//h1/text()')
    print(chapter_data)
    yield ''.join(chapter_data)
    for content in contents:
        if content != '\n':
            yield content.strip()


def analysis_write(file_name: '写入的文件名', write_one_section_data: '要写入的单个章节的数据'):
    '''写入数据'''
    with open(file_name, 'a+', encoding='utf-8') as file:
        file.write(write_one_section_data + '\n')


def main():
    base_url = get_base_url()  # 对章节url进行获取

    catalogue_html = get_catalogue(base_url)  # 请求章节页面

    file_name = analysis_get_file_name(catalogue_html)  # 获取小说各部分信息,构建文件名

    end_urls = analysis_catalogue(catalogue_html)  # 获取每个章节的url

    for end_url in end_urls:
        one_section_data = get_one_section(end_url)  # 对每个url发送请求

        write_one_section_datas = analysis_one_section(one_section_data)  # 解析每个章节的数据

        for write_one_section_data in write_one_section_datas:
            analysis_write(file_name, write_one_section_data)  # 向文件中写入数据


if __name__ == '__main__':
    print('开始抓取!')
    main()
    print('结束!')

效果

如有手机阅读器,支持txt文件导入的会自动编排目录,效果更好,建议导入手机阅读

如果觉得有用的话,求个点赞收藏,谢谢!

标签

Python基础爬虫项目采集小说网站数据


相关文章列表

Python爬虫项目实践:从网页上抓取数据,进行数据可视化分析

Python爬虫项目实践:从网页上抓取数据,进行数据可视化分析

在数据分析和挖掘领域,数据来源是非常重要的一环。然而,很多时候我们无法直接获取到所需的数据。这时,爬虫技术可以帮助我们从网页中抓取所需的数据。本文将介绍如何使用Python编写一个简单的爬虫项目,并...


0基础学Python爬虫之全网小说免费读#

0基础学Python爬虫之全网小说免费读#

前言本文案例适合爬虫入门学习,有些地方描述不清晰,如有疑问欢迎在下方留言。完整代码@ 私聊小编领取。3环境:Python3.6+Windows大概思路:获取小说主页源代码在主页源代码中找到每个章节的超...


Python爬虫实战:批量采集股票数据,并保存到Excel中

Python爬虫实战:批量采集股票数据,并保存到Excel中

本文通过具体的案例,让读者掌握Python在爬虫项目中的应用。通过本文的学习,读者可以掌握分析网页的技巧、Python编写网络程序的方法、Excel的操作,以及正则表达式的使用。这些都是爬虫项目中必备...


Python爬虫教程:自动化获取网站数据的技巧

Python爬虫教程:自动化获取网站数据的技巧

引言 随着互联网的快速发展,获取网站数据已经成为许多行业的常见需求。Python作为一种强大而灵活的编程语言,提供了丰富的库和工具,使得编写和执行爬虫变得相对简单。本教程将引导您学习使用Python...


20个新手Python爬虫实战项目,学会后立马上手去爬取数据

20个新手Python爬虫实战项目,学会后立马上手去爬取数据

写在前面有多少人学习Python,其实就是为了成为爬虫行业的大牛呢?你想在网页上爬取你想要的数据不费吹灰之力么?那么你肯定需要项目实战来提升自己的技术,毕竟没有谁能随随便便成功!我段时间精心总结出了2...


Python爬虫教程:轻松学习采集好看视频网站的视频

Python爬虫教程:轻松学习采集好看视频网站的视频

源代码地址https://github.com/kylin1020/haokan运行环境Python 3.6+windows/Linux源代码# coding: utf-8import reimpor...


友情链接