起點(diǎn)小說網(wǎng)全站爬蟲(Python)

網(wǎng)絡(luò)文學(xué)隨互聯(lián)網(wǎng)的崛起而崛起查牌,在時(shí)間日益碎片化的今天对碌,網(wǎng)絡(luò)文學(xué)以其方便快捷的特點(diǎn)適應(yīng)了人們的娛樂性需求荆虱,因而也快速成長一個(gè)巨大的市場。娛樂是人們的根本性需求朽们,文化是這個(gè)過程中的附屬品怀读。要想知道人們關(guān)心的是什么?什么又在興起骑脱,哪些題材又在逐漸沒落菜枷,我們需要從整體去分析。

因此這個(gè)爬蟲也就應(yīng)運(yùn)而生叁丧,我們選取了目前國內(nèi)最大的小說平臺——起點(diǎn)網(wǎng)作為數(shù)據(jù)來源啤誊。本爬蟲主要是為了爬取起點(diǎn)小說的基本信息(題目、作者歹袁、簡介等)坷衍,在寫爬蟲的過程中寝优,我也碰到了一些有趣的反爬機(jī)制条舔,這些小障礙我也會在本文中一并記錄下來,希望能夠給后來者一些幫助乏矾。

架構(gòu) \ 包

  • 本爬蟲主要是用Scarpy架構(gòu)

  • lxml(使用XPath需要的包)

數(shù)據(jù)存儲

主要采用MongoDB數(shù)據(jù)庫孟抗,MongoDB數(shù)據(jù)庫在處理這種快速讀寫的數(shù)據(jù)有著非常高的效率,該部分主要通過修改pipelines來實(shí)現(xiàn):


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()

起點(diǎn)網(wǎng)的反爬機(jī)制

無論怎么看钻心,起點(diǎn)網(wǎng)的反爬機(jī)制都是很業(yè)余的凄硼,我本來以為需要構(gòu)建一個(gè)IP池,或者說限制住訪問速度才能爬的下來捷沸;但這些都沒有用到摊沉,基本上只要寫完基本的Scrapy我們就能得到所需要的數(shù)據(jù)。

但在爬取網(wǎng)站數(shù)據(jù)的時(shí)候痒给,我遇到了相當(dāng)多次訪問連接失效的問題说墨,不管是使用爬蟲訪問還是直接用瀏覽器訪問骏全,這種情況都不少,對此我認(rèn)為起點(diǎn)網(wǎng)的后臺代碼也許寫的真的很爛尼斧,但就是這么爛的代碼支撐起了中國網(wǎng)絡(luò)文學(xué)界的半壁江山姜贡。果然在業(yè)務(wù)確定、行業(yè)壁壘已經(jīng)建立的情況下棺棵,只要代碼能跑得動(dòng)楼咳,就不需要大修。

那么起點(diǎn)網(wǎng)主要使用了哪些反爬機(jī)制呢烛恤?

1. 數(shù)字亂碼

kOFkOe.png

我們可以通過F12鍵打開控制臺母怜,在Elements中查看到這一反爬機(jī)制;此處我已經(jīng)截圖缚柏,我們可以看到:

原本在瀏覽器中清晰可見的數(shù)字糙申,在element(HTML)代碼中變成了亂碼,這是起點(diǎn)給予的第一個(gè)反爬機(jī)制船惨。

kOFFyD.png

<center>源碼</center>

原本我以為是由于編碼的問題導(dǎo)致的控制臺查看出現(xiàn)了亂碼柜裸,在后臺我看到數(shù)字的編碼為&#100417等,開始我嘗試去搜索這是什么編碼粱锐,走了很多彎路后發(fā)現(xiàn)這其實(shí)是一個(gè)映射疙挺。源碼對應(yīng)的字符部分其實(shí)表示的是某種字體的英文顯示,如在截圖中怜浅,該字體為KbUxwPAi铐然;了解到這些,我們要做的就是構(gòu)建起這個(gè)映射恶座,然后解碼出對應(yīng)的數(shù)字搀暑,該部分的思路如下:

  • 獲取頁面的字體文件鏈接(通過正則表達(dá)式)

  • 通過fontTool木塊獲取當(dāng)前字體映射關(guān)系

  • 建立起英文映射

  • 通過pyquery進(jìn)行數(shù)據(jù)提取

該部分代碼如下(spider中的qidian.py)


def get_font(self,Pageurl):

        response = requests.get(Pageurl).text

        doc = pq(response)

        # 獲取當(dāng)前字體文件名稱

        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. 鏈接轉(zhuǎn)換

因?yàn)槠瘘c(diǎn)小說網(wǎng)全部分類下面雖然有顯示五萬多頁的作品,但一般爬蟲抓到5000多頁就會發(fā)現(xiàn)沒有辦法獲取到有效數(shù)據(jù)了跨琳,也就是說全部分類下的5000頁之后的數(shù)據(jù)基本都是擺設(shè)自点,對此我換了個(gè)思路想先抓取到一二級分類的所有內(nèi)容之后在通過更換url中的page=?來更多的抓取數(shù)據(jù)。

但這也就碰到了第二條反爬機(jī)制

我們直接單擊玄幻分類可以跳轉(zhuǎn)到玄幻分類的第一頁脉让,此時(shí)鏈接是這個(gè)樣子的:


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

而如果我們打開第二頁會發(fā)現(xiàn)鏈接變成如下所示


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

對比可以發(fā)現(xiàn)桂敛,page更換了位置,其實(shí)只要細(xì)心點(diǎn)就能繞過這個(gè)坑溅潜;解決這個(gè)小問題之后术唬,之后的爬取就暢通無阻了。

但因?yàn)榫W(wǎng)絡(luò)鏈接的不穩(wěn)定和代碼不夠健壯的問題滚澜,其實(shí)離爬取起點(diǎn)的全網(wǎng)數(shù)據(jù)還是有一定距離的粗仓,起點(diǎn)全網(wǎng)有112萬本小說,我們最終爬取的小說數(shù)目為19萬左右,除去其有一些小說一直沒有展示出來借浊,代碼還是不夠健壯眶掌。

其他

需要著重強(qiáng)調(diào)的部分我已經(jīng)說的差不多了,剩下的諸如定義Items等都是Scrapy的基礎(chǔ)巴碗,在這里就不過多的贅述朴爬,在寫完代碼之后我們可以直接運(yùn)行

scrapy crawl qidian

來抓取運(yùn)行爬蟲,之后你會看到數(shù)據(jù)如激流一般在屏幕上流淌

以上橡淆。

github源碼地址:起點(diǎn)小說網(wǎng)全站爬蟲

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末召噩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逸爵,更是在濱河造成了極大的恐慌具滴,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件师倔,死亡現(xiàn)場離奇詭異构韵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)趋艘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門疲恢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓷胧,你說我怎么就攤上這事显拳。” “怎么了搓萧?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵杂数,是天一觀的道長。 經(jīng)常有香客問我瘸洛,道長揍移,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任反肋,我火速辦了婚禮那伐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘囚玫。我一直安慰自己喧锦,他們只是感情好读规,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布抓督。 她就那樣靜靜地躺著,像睡著了一般束亏。 火紅的嫁衣襯著肌膚如雪铃在。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音定铜,去河邊找鬼阳液。 笑死,一個(gè)胖子當(dāng)著我的面吹牛揣炕,可吹牛的內(nèi)容都是我干的帘皿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼畸陡,長吁一口氣:“原來是場噩夢啊……” “哼鹰溜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丁恭,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤曹动,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后牲览,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墓陈,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年第献,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贡必。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡庸毫,死狀恐怖赊级,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情岔绸,我是刑警寧澤理逊,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站盒揉,受9級特大地震影響晋被,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刚盈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一羡洛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧藕漱,春花似錦欲侮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至橄仍,卻和暖如春韧涨,著一層夾襖步出監(jiān)牢的瞬間牍戚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工虑粥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留如孝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓娩贷,卻偏偏與公主長得像第晰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子彬祖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 起點(diǎn)但荤,作為一個(gè)8年的老書蟲肯定是知道。既然學(xué)習(xí)了數(shù)據(jù)分析涧至,就看看起點(diǎn)的數(shù)據(jù)腹躁。 1 獲取數(shù)據(jù) 首先,肯定要先獲取數(shù)據(jù)...
    一紙行閱讀 11,622評論 9 8
  • 聲明:本文講解的實(shí)戰(zhàn)內(nèi)容南蓬,均僅用于學(xué)習(xí)交流纺非,請勿用于任何商業(yè)用途! 一赘方、前言 強(qiáng)烈建議:請?jiān)陔娔X的陪同下烧颖,閱讀本文...
    Bruce_Szh閱讀 12,704評論 6 28
  • 爬蟲文章 in 簡書程序員專題: like:128-Python 爬取落網(wǎng)音樂 like:127-【圖文詳解】py...
    喜歡吃栗子閱讀 21,752評論 4 412
  • 1 前言 作為一名合格的數(shù)據(jù)分析師,其完整的技術(shù)知識體系必須貫穿數(shù)據(jù)獲取窄陡、數(shù)據(jù)存儲炕淮、數(shù)據(jù)提取、數(shù)據(jù)分析跳夭、數(shù)據(jù)挖掘涂圆、...
    whenif閱讀 18,072評論 45 523
  • 王愛麗 焦點(diǎn)網(wǎng)絡(luò)中級五期 洛陽18—1—26持續(xù)分享第249天(春雪原創(chuàng)分享第383次) 近五的這個(gè)生日,收到了一...
    春雪ly閱讀 878評論 1 4