起点小说网全站爬虫(Python)

网络文学随互联网的崛起而崛起,在时间日益碎片化的今天,网络文学以其方便快捷的特点适应了人们的娱乐性需求,因而也快速成长一个巨大的市场。娱乐是人们的根本性需求,文化是这个过程中的附属品。要想知道人们关心的是什么?什么又在兴起,哪些题材又在逐渐没落,我们需要从整体去分析。

因此这个爬虫也就应运而生,我们选取了目前国内最大的小说平台——起点网作为数据来源。本爬虫主要是为了爬取起点小说的基本信息(题目、作者、简介等),在写爬虫的过程中,我也碰到了一些有趣的反爬机制,这些小障碍我也会在本文中一并记录下来,希望能够给后来者一些帮助。

架构 \ 包

  • 本爬虫主要是用Scarpy架构

  • lxml(使用XPath需要的包)

数据存储

主要采用MongoDB数据库,MongoDB数据库在处理这种快速读写的数据有着非常高的效率,该部分主要通过修改pipelines来实现:


import pymongo

class MongoPipeline(object):

    def __init__(self,mongo_uri,mongo_db):

        self.mongo_uri = mongo_uri

        self.mongo_db = mongo_db

    @classmethod

    def from_crawler(cls,crawler):

        return cls(

            mongo_db=crawler.settings.get('MONGO_DB'),

            mongo_uri=crawler.settings.get('MONGO_URI')

        )

    def open_spider(self,spider):

        self.client = pymongo.MongoClient(self.mongo_uri)

        self.db = self.client[self.mongo_db]

    def process_item(self,item,spider):

        self.db[item.collection].insert(dict(item))

        return item

    def close_spider(self,spider):

        self.client.close()

起点网的反爬机制

无论怎么看,起点网的反爬机制都是很业余的,我本来以为需要构建一个IP池,或者说限制住访问速度才能爬的下来;但这些都没有用到,基本上只要写完基本的Scrapy我们就能得到所需要的数据。

但在爬取网站数据的时候,我遇到了相当多次访问连接失效的问题,不管是使用爬虫访问还是直接用浏览器访问,这种情况都不少,对此我认为起点网的后台代码也许写的真的很烂,但就是这么烂的代码支撑起了中国网络文学界的半壁江山。果然在业务确定、行业壁垒已经建立的情况下,只要代码能跑得动,就不需要大修。

那么起点网主要使用了哪些反爬机制呢?

1. 数字乱码

kOFkOe.png

我们可以通过F12键打开控制台,在Elements中查看到这一反爬机制;此处我已经截图,我们可以看到:

原本在浏览器中清晰可见的数字,在element(HTML)代码中变成了乱码,这是起点给予的第一个反爬机制。

kOFFyD.png

<center>源码</center>

原本我以为是由于编码的问题导致的控制台查看出现了乱码,在后台我看到数字的编码为&#100417等,开始我尝试去搜索这是什么编码,走了很多弯路后发现这其实是一个映射。源码对应的字符部分其实表示的是某种字体的英文显示,如在截图中,该字体为KbUxwPAi;了解到这些,我们要做的就是构建起这个映射,然后解码出对应的数字,该部分的思路如下:

  • 获取页面的字体文件链接(通过正则表达式)

  • 通过fontTool木块获取当前字体映射关系

  • 建立起英文映射

  • 通过pyquery进行数据提取

该部分代码如下(spider中的qidian.py)


def get_font(self,Pageurl):

        response = requests.get(Pageurl).text

        doc = pq(response)

        # 获取当前字体文件名称

        fonturl = doc('p.update > span > style').text()

        url = re.search('woff.*?url.*?\'(.+?)\'.*?truetype',fonturl).group(1)

        response = requests.get(url)

        font = TTFont(BytesIO(response.content))

        cmap = font.getBestCmap()

        font.close()

        return cmap



def get_encode(self,cmap,values):

        WORD_MAP = {'zero': '0', 'one': '1',

                    'two': '2', 'three': '3',

                    'four': '4', 'five': '5',

                    'six': '6','seven': '7',

                    'eight': '8', 'nine': '9',

                    'period': '.'}

        word_count = ''

        for value in values.split(';'):

            value = value[2:]

            key = cmap[int(value)]

            word_count += WORD_MAP[key]

        return word_count

2. 链接转换

因为起点小说网全部分类下面虽然有显示五万多页的作品,但一般爬虫抓到5000多页就会发现没有办法获取到有效数据了,也就是说全部分类下的5000页之后的数据基本都是摆设,对此我换了个思路想先抓取到一二级分类的所有内容之后在通过更换url中的page=?来更多的抓取数据。

但这也就碰到了第二条反爬机制

我们直接单击玄幻分类可以跳转到玄幻分类的第一页,此时链接是这个样子的:


https://www.qidian.com/all?page=1&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0

而如果我们打开第二页会发现链接变成如下所示


https://www.qidian.com/all?chanId=21&orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=2

对比可以发现,page更换了位置,其实只要细心点就能绕过这个坑;解决这个小问题之后,之后的爬取就畅通无阻了。

但因为网络链接的不稳定和代码不够健壮的问题,其实离爬取起点的全网数据还是有一定距离的,起点全网有112万本小说,我们最终爬取的小说数目为19万左右,除去其有一些小说一直没有展示出来,代码还是不够健壮。

其他

需要着重强调的部分我已经说的差不多了,剩下的诸如定义Items等都是Scrapy的基础,在这里就不过多的赘述,在写完代码之后我们可以直接运行

scrapy crawl qidian

来抓取运行爬虫,之后你会看到数据如激流一般在屏幕上流淌

以上。

github源码地址:起点小说网全站爬虫

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 起点,作为一个8年的老书虫肯定是知道。既然学习了数据分析,就看看起点的数据。 1 获取数据 首先,肯定要先获取数据...
    一纸行阅读 11,476评论 9 8
  • 声明:本文讲解的实战内容,均仅用于学习交流,请勿用于任何商业用途! 一、前言 强烈建议:请在电脑的陪同下,阅读本文...
    Bruce_Szh阅读 12,648评论 6 28
  • 爬虫文章 in 简书程序员专题: like:128-Python 爬取落网音乐 like:127-【图文详解】py...
    喜欢吃栗子阅读 21,722评论 4 412
  • 1 前言 作为一名合格的数据分析师,其完整的技术知识体系必须贯穿数据获取、数据存储、数据提取、数据分析、数据挖掘、...
    whenif阅读 18,039评论 45 523
  • 王爱丽 焦点网络中级五期 洛阳18—1—26持续分享第249天(春雪原创分享第383次) 近五的这个生日,收到了一...
    春雪ly阅读 874评论 1 4