精选文章 Python小说爬虫,有目录,有文字极简处理,还有IP解锁方式!

Python小说爬虫,有目录,有文字极简处理,还有IP解锁方式!

作者:爬遍天下无敌手 时间: 2020-08-04 03:31:27
爬遍天下无敌手 2020-08-04 03:31:27

至于我为什么发这么火,原因如下:

  1. 朋友的小说全部放在文件夹中,就是一章一个text文本, 没有目录的存在,而且目录章节混乱,我大致看了下,第五章就跳到第七章了, 中间的不知道怎么没了。
  2. 打开小说一看, 密密麻麻挤着一起,没有一点段落感,而且还有一些html代码,没有处理干净,最重要的,居然还有一大批网址在里面,简直就是不走心
  3. 第三,爬取的小说根本就不能算一整本,我看了一下文件数量,足足少了二十多章,我评价到看个鬼,你自己看看能不能行 !
  4. 朋友看完,自己也很无语,至于他为什么会出现这种情况,我想很多爬虫新手们,都会出现这样的情况,而且这些问题都是出自细节中,新手们,不怎么会考虑周到,那么既然朋友也出现了这样的问题,他让我帮他改改,于是改完之后,我写下这篇博客,让更多人真正的爬小说,而不是爬一坨屎,自己都看不下去的那种坨屎!!!!

解决方案如下:

这一期还是做一个干货分享,都是我半年以来的爬虫经验,需要教学可以私聊我,在校学生还是需要一点经济支持的!

如何产生章节:

Python小说爬虫,有目录,有文字极简处理,还有IP解锁方式!1

自己问自己,有多少人爬取小说是这样的,你自己能看吗?

写代码的时候大部分人是这样的

with open('**.text', 'w') as fw:
	fw.write(r.text)

关于文件的写入, ‘w’ 的方式 是覆盖写, 没有就创建, 那么我们写小说就不需要用这个, 使用‘a’ 追加写的模式, 然后添加适当的分隔符, 只有文本中添加目录, 整个txt在手机中才会显示出目录的存在 ,我的实例如下: 最好加点文字提示, 代表这章节下载成功到总txt中 !

path = 'D://爬取小说//'
        os.chdir(path)  # 进入这个文件夹
        with open('酒神.txt', 'a+', encoding='utf-8') as fw:
            fw.write(''.join(items['title']) + '\n\n\n' + '- ' * 40)
            fw.write(''.join(items['text']))
        print(f'{items["title"]} 下载完成!')

如何章节顺序稳定:

一般我们都是从目录url 中, 去获取我们需要的章节网址, 这里拿我爬取的网址实例:

Python小说爬虫,有目录,有文字极简处理,还有IP解锁方式!2

这里我们就能获取所有章节的网址了, 只要进行适当的拼接处理, 那么很多人就舒服了,直接获取整个url列表, 直接返回给调用函数, 舒服吧? 你电脑不舒服, 关于return 和 yield 你真的懂吗? 如果你请求的网址很多, 一定时间请求次数过多,就容易丢失网址,我想大部分人都是返回列表,然后遍历列表吧? 万一丢了一个章节网址呢? 是不是就会出现章节混乱的情况,使用yield 就不需要考虑这么多因素了, 它可以直接调用一次返回一次,有效的避免了可能的因素, 我觉得很好用, 我也推荐使用, 不是所有的返回都是用return!!!

示例如下:

page_url = html.xpath('//div[@id="list"]/dl/dd/a/@href')
            for url in page_url[222:]:
                url = f'http://www.biquge.info/11_11079/{url}'
                yield url

如何保证文字的处理:

爬取小说这样的文字量很多的情况下, 文字的处理显得极为重要了,爬取小说不推荐使用正则re,也不推荐使用soup, 原因你获取不了网页自带的换行符和缩进符, 比如 \xboo 之类的, 如果你获取不了文本自带的这些,那么你就得自己添加,可以使用re的sub进行适当的替换换行,这就很麻烦,这里一定推荐使用xpath的text() 去匹配, 方便快捷,爬小说的小助手!

示例如下:

text = html.xpath('//div[@id="content"]/text()')

非常的简单, 而且xpath的匹配非常的快,不会的朋友一定要学,soup真的不推荐,大工程起来真的慢!


如何应对ip限制等因素:

他在爬小说的时候,也出现了这样的问题,在一个urls列表中, 竟然有的能请求成功, 有的不能请求成功, 明明都是网址没有错, 我也能打得开,但就是出现了这样的bug,很闹腾,但是后面我还是修复了。

bug 出现 : 所有的网址 一定是正确的, 我可以确保。

Python小说爬虫,有目录,有文字极简处理,还有IP解锁方式!3

为什么会出现这样的情况,高频发的请求网址,如果不是使用框架, 那么就需要设置延迟时间了。比如sleep() 或者 request 加入参数 timeout ,不然很容易被网址通过请求次数 进而识别出来 这是一个爬虫程序, 也就是非人类操作, 那么他就可以不让你请求,从而你就爬虫失败!

这样搞:

多次请求,模块分离,你搞我, 我也可以搞你!

将获取文本的函数 分离出来, 在parse_page 进行三次判断,失败就回溯,三次回溯,实测,请求被挡住的概率大幅降低。这是一个不错的方法, 当然, 还需要加入 sleep(), 来控制代码的延迟时间。

    def parse_page_error(self, r):
        # 为处理异常:

        r.encoding = r.apparent_encoding
        html = etree.HTML(r.text)
        title = html.xpath('//div[@class="bookname"]/h1/text()')
        text = html.xpath('//div[@id="content"]/text()')
        items = {}
        items['title'] = title
        items['text'] = text
        self.save_text(items)

    def parse_page(self):
        """
        分析每一章节  然后下载, 次数过快 容易炸ip 三次保底请求 !
        """
        for url in self.get_page():
            r = requests.get(url, headers=self.headers)
            time.sleep(0.7)
            if r.status_code == 200:
                self.parse_page_error(r)
            else:
                print(f'该 {url}未下载成功! 再次请求')
                rr = requests.get(url, headers=self.headers)
                if rr.status_code == 200:
                    self.parse_page_error(rr)
                else:
                    print("第三次请求!")
                    rrr = requests.get(url, headers=self.headers)
                    self.parse_page_error(rrr)
        print('全部下载完成!')

这一期干货就到此为此, 主要还是满足自己的需求,2020年了,看小说还不会爬虫,你有多捞!

爬虫全程序:

# -*- coding :  utf-8 -*-
# @Software  :  PyCharm
# @CSDN      :  https://me.csdn.net/qq_45906219

import requests
from lxml import etree
import os
import time


class Spider:
    def __init__(self):
        self.start_url = 'http://www.biquge.info/11_11079/'
        self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                                      'AppleWebKit/537.36 (KHTML, like Gecko)'
                                      ' Chrome/81.0.4044.129 Safari/537.36',
                        'Host': 'www.biquge.info',
                        'Referer': 'http://www.biquge.info/11_11079/5216668.html',
                        'Cookie': 'clickbids=11079; Hm_lvt_6dfe3c8f195b43b8e667a2a2e5936122=1591085546;'
                                  ' Hm_lvt_c979821d0eeb958aa7201d31a6991f34=1591085539,1591085553,1591085815; '
                                  'Hm_lpvt_6dfe3c8f195b43b8e667a2a2e5936122=1591087376; '
                                  'Hm_lpvt_c979821d0eeb958aa7201d31a6991f34=1591087377'}

    def get_page(self):
        """
        获得每一章节的网址
        yield 回去
        """
        r = requests.get(self.start_url, headers=self.headers)
        if r.status_code == 200:
            r.encoding = r.apparent_encoding
            html = etree.HTML(r.text)
            page_url = html.xpath('//div[@id="list"]/dl/dd/a/@href')
            for url in page_url[222:]:
                url = f'http://www.biquge.info/11_11079/{url}'
                yield url

    def save_text(self, items):
        """
        根据章节下载'
        """
        path = 'D://爬取小说//'
        os.chdir(path)  # 进入这个文件夹
        with open('酒神.txt', 'a+', encoding='utf-8') as fw:
            fw.write(''.join(items['title']) + '\n\n\n' + '- ' * 40)
            fw.write(''.join(items['text']))
        print(f'{items["title"]} 下载完成!')

    def parse_page_error(self, r):
        # 为处理异常:

        r.encoding = r.apparent_encoding
        html = etree.HTML(r.text)
        title = html.xpath('//div[@class="bookname"]/h1/text()')
        text = html.xpath('//div[@id="content"]/text()')
        items = {}
        items['title'] = title
        items['text'] = text
        self.save_text(items)

    def parse_page(self):
        """
        分析每一章节  然后下载, 次数过快 容易炸ip 三次保底请求 !
        """
        for url in self.get_page():
            r = requests.get(url, headers=self.headers)
            time.sleep(0.7)
            if r.status_code == 200:
                self.parse_page_error(r)
            else:
                print(f'该 {url}未下载成功! 再次请求')
                rr = requests.get(url, headers=self.headers)
                if rr.status_code == 200:
                    self.parse_page_error(rr)
                else:
                    print("第三次请求!")
                    rrr = requests.get(url, headers=self.headers)
                    self.parse_page_error(rrr)
        print('全部下载完成!')


jiushen = Spider()
jiushen.parse_page()

这样学会了吧!视频教程,完整打包代码加群:1136192749

 

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:elasticsearch java 基于 RestClientAPI 的增删改查

下一篇:mysql -u root -p突然连接不上

您可能感兴趣

  • 建议收藏!2020 年必备的几个 DevOps 工具

    来自:SegmentFault ,作者:徐九 链接:https://segmentfault.com/a/1190000022908614 提到 DevOps 这个词,我相信很多人一定不会陌生。作为一个热门的概念,DevOps近 年来频频出现在各大技术社区和媒体的文章中。到了 2020 年,DevOps 的革命也终于成为了一个主流,DevOps 相关工具的受欢迎程度也在激增。根据 Googl...

  • 一文带你了解爬虫。

    前段时间我妈突然问我:儿子,爬虫是什么?我当时既惊讶又尴尬,惊讶的是为什么我妈会对爬虫好奇?尴尬的是我该怎么给她解释呢? 一、爬虫介绍 1.爬虫是什么 网络爬虫(web crawler 简称爬虫)就是按照一定规则从互联网上抓取信息的程序,既然是程序那和正常用户访问页面有何区别?爬虫与用户正常访问信息的区别就在于:用户是缓慢、少量的获取信息,而爬虫是大量的获取信息。 这里还需要注意的是:爬虫并...

  • 计算机专业必读哪些经典书籍?

    大家好,我是狗哥。 经常有粉丝问:狗哥,我想学计算机,应该读哪些书籍?那么多计算机书籍,我如何选?,今天狗哥就把自己的书单发出来,供大家参考,并附上连接,都是经典的书籍,特别是基础书籍中的一定要反复去读,让自己走的更远。 分4类:基础书籍、数据库、C&C++相关、java相关。 基础书籍 计算机科学导论(原书第3版) 《计算机科学导论(原书第3版)》是大学计算机相关专业的基础课教材,涉及计算...

  • 高级程序员知识学习(Redis的扩展应用知识1)

    Redis的资源:https://github.com/2462612540/Senior_Architect.git Redis 基础数据结构 Redis 有 5 种基础数据结构,分别为: string (字符串)、 list (列表)、 set (集合)、 hash (哈希) 和 zset (有序集合)。 string (字符串):字符串 string 是 Redis 最简单的数据结构。...

  • 10大经典数据分析模型,你知道几个?

    点击上方蓝色小字,关注“涛哥聊Python” 重磅干货,第一时间送达 来源:悟空智能科技 转自:上海数据分析 模型分析法就是依据各种成熟的、经过实践论证的管理模型对问题进行分析的方法。 在长时间的企业管理理论研究和实践过程中,将企业经营管理中一些经典的相关关系以一个固定模型的方式描述出来,揭示企业系统内部很多本质性的关系,供企业用来分析自己的经营管理状况,针对企业管理出现的不同问题,能采用最...

  • MySQL 高性能优化规范建议

    Java面试笔试面经、Java技术每天学习一点 Java面试 关注不迷路 作者:听风 来源:https://www.cnblogs.com/huchong/ 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过 32 个字符...

  • 阿里面试最全面经总结

    1.听说你对JVM有点研究,讲一讲JVM的内存模型吧(我说虚拟机栈,本地方法栈,程序计数器,堆,方法区) 总的有什么,生命周期,每一个 JVM 的分区 ,线程私有,线程共享,直接内存 线程私有的生命周期和线程相同,线程共享的和虚拟机的生命周期相同。 java虚拟机栈是将方法的变量,出入口参数等以栈帧的形式存入,虚拟机中只有一个堆,堆中存入的是new出的对象,而且堆是垃圾回收的主要场所。方法区...

  • 深度语义理解在剧本角色情感分析中的探索与应用

    1. 背 景 剧本分析是内容生产链条的第一环,因此,我们结合专家经验知识、大数据与自然语言处理技术来帮助业务部门快速分析和评估剧本。评估体系中涉及到了大量关于角色的分析,其中角色的情感分析是非常重要的一个任务。 不同于通常的评论类短文本,剧本有其独有的业务特点,因此任务的目标和建模与通常的任务区别较大。本文将系统的介绍情感分析领域相关的内容,以及爱奇艺在剧本分析中针对角色进行细粒度情感分析所...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。