Python基础之爬取小说

简介: Python基础之爬取小说

近些年里,网络小说盛行,但是小说网站为了增加收益,在小说中增加了很多广告弹窗,令人烦不胜烦,那如何安静观看小说而不看广告呢?答案就是爬虫。本文主要以一个简单的小例子,简述如何通过爬虫来爬取小说,仅供学习分享使用,如有不足之处,还请指正。

目标页面

本文爬取的为【某横中文网】的一部小说【妙手小医仙】,已完结,共187章,信息如下:

网址:http://book.abcde.com/showchapter/1102448.html

本次主要爬取小说章节信息,及每一章对应的正文信息。章节信息如下所示:

目标分析

1. 章节目录分析

通过浏览器自带的开发人员工具【快捷键F12或Ctrl+Shift+I】进行分析,发现所有的章节都包含在ul【无序列表标签】中,每一个章节链接对应于li【列表项目标签】标签中的a【超链接标签】标签,其中a标签的href属性就是具体章节网址,a标签的文本就是章节标题,如下所示:

2. 章节正文分析

通过分析,发现章节全部内容,均在div【class=reader_box】中,其中包括标题div【class=title_txtbox】,章节信息div【class=bookinfo】,及正文信息div【class=content】,所有正文包含在p【段落标签】中。如下所示:

爬虫设计思路

  1. 获取章节页面内容,并进行解析,得到章节列表
  2. 循环章节列表:
  1. 获取每一章节内容,并进行解析,得到正文内容,
  2. 保存到文本文档。每一个章节,一个文档。

示例源码

获取请求页面内容,因为本例需要多次获取页面内容,所以封装为一个单独的函数,如下所示:

def get_data(url: str = None):
    """
    获取数据
    :param url: 请求网址
    :return:返回请求的页面内容
    """
    # 请求头,模拟浏览器,否则请求会返回418
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363'}
    resp = requests.get(url=url, headers=header)  # 发送请求
    if resp.status_code == 200:
        if resp.encoding != resp.apparent_encoding:
            # 如果返回的编码和页面显示编码不一致,直接获取text会出现乱码,需要转码
            return resp.content.decode(encoding=resp.apparent_encoding)
        else:
            # 如果返回成功,则返回内容
            return resp.text
    else:
        # 否则,打印错误状态码,并返回空
        print('返回状态码:', resp.status_code)
        return

注意:有可能不同网站,返回内容的编码和页面显示的编码不一致,可能会出现中文乱码的情况,所以本例进行编码设置。

1. 解析章节列表

要获取整本小说内容,首先就要获取章节列表,然后保存到内存数组中,以便于获取具体正文。如下所示:

def parse_chapters(html: str = None):
    """
    爬取章节列表
    :param html:
    :return:
    """
    if html is None:
        return
    else:
        chapters = []
        bs = BeautifulSoup(html, features='html.parser')
        ul_chapters = bs.find('ul', class_='chapter-list clearfix')
        # print(ul_chapters)
        li_chapters = ul_chapters.find_all('li', class_='col-4')  # 此处需要注意,页面源码查看是有空格,但是BeautifulSoup转换后空格消失
        for li_chapter in li_chapters:
            a_tag = li_chapter.find('a')
            # print(a_tag)
            a_href = a_tag.get('href')  # 此处也可以用a_tag['href']
            a_text = a_tag.get_text()  # 获取内容:章节标题
            chapters.append({'title': a_text, 'href': a_href})
        return chapters

2. 解析单个章节

当得到单个章节的链接时,就可以获取单个章节的内容,并进行解析,如下所示:

def parse_single_chapter(html: str = None):
    """
    解析单个章节内容
    :param html:
    :return:
    """
    bs = BeautifulSoup(html, features='html.parser')
    div_reader_box = bs.find('div', class_='reader_box')
    div_title = div_reader_box.find('div', class_='title_txtbox')
    title = div_title.get_text()  # 获取标题
    div_book_info = div_reader_box.find('div', class_='bookinfo')
    book_info = div_book_info.get_text()
    div_content = div_reader_box.find('div', class_='content')
    content = ''
    p_tags = div_content.find_all('p')
    for p_tag in p_tags:
        content =content + p_tag.get_text() + '\r\n'
    # content = div_content.get_text()
    return title + '\n' + book_info + '\n' + content

3. 循环解析并保存

循环获取单个章节正文页面,并进行解析,然后保存。如下所示:

def get_and_parser_single_chapter(chapters: list = []):
    """
    获取单个章节
    :param chapters: 章节列表
    :return:
    """
    for (index, chapter) in enumerate(chapters, 1):
        title = chapter.get('title')
        href = chapter.get('href')
        while True:
            print('开始第%d章爬取' % index)
            html = get_data(href)
            if html is not None:
                content = parse_single_chapter(html)
                save_data(title, content)  # 保存数据
                print('第%d章爬取成功' % index)
                break
            else:
                print('第%d章爬取失败' % index)
                time.sleep(2)

4. 整体调用逻辑

当写好单个功能函数时,顺序调用就是完整的爬虫,如下所示:

url = 'http://book.abcde.com/showchapter/1102448.html'
print('开始时间>>>>>', time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
html_chapters = get_data(url)
chapters = parse_chapters(html_chapters)
get_and_parser_single_chapter(chapters)
print('结束时间>>>>>', time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
print('done')

示例截图

爬取到的小说列表,如下所示:

每一个章节内容,如下所示:

示例完整代码

备注

我从来不认为半小时是我微不足道的很小的一段时间。真正的强者,不是没有眼泪的人,而是含着眼泪奔跑的人。但行前路,无问西东 。

长相思·山一程

纳兰性德 【朝代】清

山一程,水一程,身向榆关那畔行,夜深千帐灯。

风一更,雪一更,聒碎乡心梦不成,故园无此声。

相关文章
|
5天前
|
数据采集 Python
爬虫实战-Python爬取百度当天热搜内容
爬虫实战-Python爬取百度当天热搜内容
76 0
|
5天前
|
数据采集 JSON 数据格式
python爬虫之app爬取-charles的使用
charles 基本原理,charles抓包,分析,重发。
77 0
|
5天前
|
数据采集 存储 架构师
上进计划 | Python爬虫经典实战项目——电商数据爬取!
在如今这个网购风云从不间歇的时代,购物狂欢持续不断,一年一度的“6.18年中大促”、“11.11购物节”等等成为了网购电商平台的盛宴。在买买买的同时,“如何省钱?”成为了大家最关心的问题。 比价、返利、优惠券都是消费者在网购时的刚需,但在这些“优惠”背后已产生灰色地带。
|
5天前
|
数据采集 测试技术 API
python爬虫之app爬取-微信朋友圈
搭建appium环境,appium基本使用,API操作等等
102 0
|
5天前
|
数据采集 Web App开发 iOS开发
爬取B站评论:Python技术实现详解
爬取B站评论:Python技术实现详解
|
5天前
|
数据采集 Web App开发 开发者
探秘Python爬虫技术:王者荣耀英雄图片爬取
探秘Python爬虫技术:王者荣耀英雄图片爬取
|
5天前
|
数据采集 存储 数据处理
使用Python爬取豆瓣电影影评:从数据收集到情感分析
本文演示如何使用Python爬虫获取豆瓣电影《肖申克的救赎》的影评数据并进行情感分析。首先,安装requests、BeautifulSoup、pandas和TextBlob库。接着,编写爬虫抓取评论的用户名、评分和内容,存储为DataFrame。然后,利用TextBlob进行情感分析,得到情感分数。此方法有助于分析用户对电影的反馈。
130 1
|
5天前
|
数据采集 存储 安全
python爬虫之app爬取-mitmproxy 的使用
mitmproxy抓包原理,设置代理,MitmDump运用,mitmproxy使用。
54 0
|
5天前
|
自然语言处理 搜索推荐 算法
Python小说阅读器制作教程
Python小说阅读器制作教程
35 0
|
5天前
|
数据采集 存储 数据挖掘
Python爬虫实战:打造一个简单的新闻网站数据爬取工具
本文将介绍如何运用Python编写一个简单而高效的网络爬虫,帮助您在实际项目中快速获取并存储新闻网站的数据。通过学习本文,您将了解到如何利用Python中的第三方库和技术来实现数据爬取,为您的数据分析和应用提供更多可能性。