天天看點

用python實作自動化辦公------爬取小說天堂所有小說

用python實作自動化辦公------爬取小說天堂所有小說

    • 摘要
    • 聲明
    • 快速爬取B站、愛奇藝、網易雲音樂、QQ音樂等視訊小技巧
    • 一 緻敬青春
    • 二 網站技術分析
    • 三 爬蟲流程
    • 四 精準爬取
    • 五 分布式爬蟲

摘要

所謂爬蟲,其實就是使用者和後端碼農的互相較量。使用者想要從伺服器端爬取資料,伺服器端的碼農不樂意了,LZ辛辛苦苦收集到的資料豈能讓你寫幾行代碼就給偷走了,不行不行,必須加點反爬手段。随着一輪又一輪的較量,爬蟲興起,反爬手段也越來越多。對于我們普通大衆來說,平時想爬點小電影、小說之類的,愈發變得艱難。

但是并不是所有網站的後端碼農都是反爬黨,今天的目标TXT小說天堂首頁,就是要将該網站所有小說一網打盡。我會将源碼在下文中全部展示出來,但是警告大家,如果你的磁盤容量太小,可能冒煙哦!

聲明

對于本文涉及的程式請謹慎使用,如讀者使用此程式造成該網站癱瘓,帶來的後果自負。

本程式隻用作爬蟲技術交流,請勿用于商業用途!

後續本人将設計爬蟲GUI軟體,将免費送給讀者朋友們。

用python實作自動化辦公------爬取小說天堂所有小說

快速爬取B站、愛奇藝、網易雲音樂、QQ音樂等視訊小技巧

安裝you-get

可使用pip安裝。

安裝成功後可直接使用如下指令:

you-get url

url為你想爬取的網站的url,系統會自動将爬取的檔案儲存在C:\Users\你的賬号名**目錄下

用python實作自動化辦公------爬取小說天堂所有小說

如下示範:

①打開你想要的視訊,複制url。

用python實作自動化辦公------爬取小說天堂所有小說

②打開終端,輸入指令:you-get https://www.bilibili.com/video/BV11y4y1B7Uw?from=search&seid=1081825059945006533

用python實作自動化辦公------爬取小說天堂所有小說

下載下傳的檔案預設在C:\Users\你的賬号名**目錄下,下載下傳的檔案可以直接使用。

用python實作自動化辦公------爬取小說天堂所有小說
用python實作自動化辦公------爬取小說天堂所有小說

一 緻敬青春

整理房間的時候,發現了我塵封十幾年的mp3,太驚訝了!那時候在被窩裡看小說的場景浮現在眼前。那時候十歲左右的年紀,跑去黑網吧,專門下載下傳玄幻、暴力小說,記得當時的《壞蛋是怎樣煉成的》中的謝文東一直是我的偶像,為了下載下傳到此小說,不惜挨一頓暴打從家裡偷出5元錢跑去黑網吧。十幾年過去了,我已不是當時的少年,也不需要偷偷跑去黑網吧,此刻,我能爬取大多數小說網站,但是再也回不到那時候童真的年紀了,緻敬青春!!!

二 網站技術分析

用python實作自動化辦公------爬取小說天堂所有小說
用python實作自動化辦公------爬取小說天堂所有小說

這個網站經過我多次無headers爬取,居然沒有觸發反爬措施,是以我可以判定這個網站沒有反爬手段,讀者朋友們可以随意爬取。對于網站的整體架構,沒有渲染、設計簡單,是以爬蟲難度很小。很容易就可以将所有小說打包回家。還有就是,這個網站不能下載下傳,隻能線上閱讀,點選“立即下載下傳”也不會有任何下載下傳彈出視窗。

用python實作自動化辦公------爬取小說天堂所有小說

三 爬蟲流程

對于資源網站,要想将其一網打盡,那必然要擷取底層的url。怎麼獲得底層url呢?那麼該網站将所有小說分成了21個大類,每個大類裡邊包括各種小說,某一小說又分為各個章節,每一個章節才會将小說内容顯示出來。是以在爬取過程中,我們先要擷取大類的url,再到小說的url,再到小說章節的url,這樣子形成多級清單。

用python實作自動化辦公------爬取小說天堂所有小說
用python實作自動化辦公------爬取小說天堂所有小說
用python實作自動化辦公------爬取小說天堂所有小說
用python實作自動化辦公------爬取小說天堂所有小說

四 精準爬取

按照第三節的流程,我們按如下步驟進行:

第一步:擷取大類的url

用python實作自動化辦公------爬取小說天堂所有小說
#官網:'https://www.xstt5.com/'
    start_url = 'https://www.xstt5.com/'
    #擷取官網響應
    response_all=session.get(start_url,headers=headers).content
    response_all = etree.HTML(response_all)
    #擷取官網所有大類的url清單
    name_list_all = response_all.xpath('//ul/li/a/@href')
           

第二步:擷取小說的url

用python實作自動化辦公------爬取小說天堂所有小說
#擷取各個大類之下的小類的url
            start_url = i
            response = session.get(start_url, headers=headers).content
            response = etree.HTML(response)
            #擷取小說url清單
            txt_url_list = response.xpath('//div[@class="w990"]/div[2]/div/div/h3/a/@href')
            #擷取小說名
            txt_name_list = response.xpath('//div[@class="w990"]/div[2]/div/div/h3/a/text()')

           

第三步:擷取小說章節的url

用python實作自動化辦公------爬取小說天堂所有小說
response_index = session.get('https://www.xstt5.com' + u, headers=headers).content
            response_index = etree.HTML(response_index)
            #擷取章節的url位址
            txt_url_chapter_list = response_index.xpath('//td/ul/li/a/@href')
           

五 分布式爬蟲

現在大型爬蟲都是采用分布式爬蟲模式,就如Python的多級清單一樣,逐漸深入。

用python實作自動化辦公------爬取小說天堂所有小說

對于此網站的章節部分,設計者用了table标簽,章節數是被打亂的,是以需要将章節數進行排序,不然爬取的小說章節是錯亂的,沒有任何意義。

#對章節url進行排序
                txt_url_chapter_list.sort()
           

現在我們就可以将第四節中三個清單進行聯立,使用分布式爬蟲了。源代碼如下:

"""User-agent大清單"""
USER_AGENT_LIST = [
                  'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3451.0 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:57.0) Gecko/20100101 Firefox/57.0',
                  'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.2999.0 Safari/537.36',
                  'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.70 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2',
                  'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36 OPR/31.0.1889.174',
                  'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.1.4322; MS-RTC LM 8; InfoPath.2; Tablet PC 2.0)',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 OPR/55.0.2994.61',
                  'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.814.0 Safari/535.1',
                  'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36',
                  'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; Touch; MASMJS)',
                  'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1041.0 Safari/535.21',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
                  'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3451.0 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:57.0) Gecko/20100101 Firefox/57.0',
                  'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.2999.0 Safari/537.36',
                  'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.70 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2',
                  'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36 OPR/31.0.1889.174',
                  'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.1.4322; MS-RTC LM 8; InfoPath.2; Tablet PC 2.0)',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 OPR/55.0.2994.61',
                  'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.814.0 Safari/535.1',
                  'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36',
                  'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; Touch; MASMJS)',
                  'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1041.0 Safari/535.21',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
                  'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4093.3 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko; compatible; Swurl) Chrome/77.0.3865.120 Safari/537.36',
                  'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
                  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4086.0 Safari/537.36',
                  'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:75.0) Gecko/20100101 Firefox/75.0',
                  'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) coc_coc_browser/91.0.146 Chrome/85.0.4183.146 Safari/537.36',
                  'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 VivoBrowser/8.4.72.0 Chrome/62.0.3202.84',
                  'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:83.0) Gecko/20100101 Firefox/83.0',
                  'Mozilla/5.0 (X11; CrOS x86_64 13505.63.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:68.0) Gecko/20100101 Firefox/68.0',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36',
                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
                  'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 OPR/72.0.3815.400',
                  'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36',
                  ]

from requests_html import HTMLSession
import os, xlwt, xlrd, random
import threading

from lxml import etree

session = HTMLSession()

class DFSpider(object):

    def __init__(self,start_url,txt_name):
        # 起始的請求位址、小說名----初始化
        self.start_url = start_url
        self.txt_name=txt_name

    def parse_start_url(self):
        """
        發送請求,擷取響應
        :return:
        """
        # 請求頭
        headers = {
            # 通過随機子產品提供的随機拿取資料方法
            'User-Agent': random.choice(USER_AGENT_LIST)
        }
        # 發送請求,擷取響應位元組資料
        response = session.get(self.start_url, headers=headers).content
        """序列化對象,将位元組内容資料,經過轉換,變成可進行xpath操作的對象"""
        response = etree.HTML(response)
        """調用提取第二份響應資料"""
        self.parse_response_data(response)


    def parse_response_data(self, response):
        """
        解析response響應資料,提取
        :return:
        """
        #小說内容
        name_list_1 = response.xpath('//div[@class="zw"]/p/text()')

        #小說章節
        name_list_2 = response.xpath('//div[@class="atitle"]/h1/text()')

        """調用儲存小說的方法"""
        self.save_txt_file(name_list_1,name_list_2)
    def save_txt_file(self,name_list,name_list2):
        with open(f'./資料/{self.txt_name}.txt','a+',encoding='utf-8')as f:
            print(f"正在爬取{name_list2[0]}")
            f.write(str(name_list2[0])+'\n')
            for i in name_list:
                # print(i)
                f.write(i+'\n')

headers = {
            # 通過随機子產品提供的随機拿取資料方法
            'User-Agent': random.choice(USER_AGENT_LIST)
        }


if __name__ == '__main__':
    #官網:'https://www.xstt5.com/'
    start_url = 'https://www.xstt5.com/'
    #擷取官網響應
    response_all=session.get(start_url,headers=headers).content
    response_all = etree.HTML(response_all)
    #擷取官網所有大類的url清單
    name_list_all = response_all.xpath('//ul/li/a/@href')

    #周遊
    for i in name_list_all:
        try:
            #擷取各個大類之下的小類的url
            start_url = i
            response = session.get(start_url, headers=headers).content
            response = etree.HTML(response)
            #擷取小說url清單
            txt_url_list = response.xpath('//div[@class="w990"]/div[2]/div/div/h3/a/@href')
            #擷取小說名
            txt_name_list = response.xpath('//div[@class="w990"]/div[2]/div/div/h3/a/text()')

            #打包
            for u, n in zip(txt_url_list, txt_name_list):
                # print(u,n)
                print('_'*80)
                print(f"正在下載下傳 {n}")
                response_index = session.get('https://www.xstt5.com' + u, headers=headers).content
                response_index = etree.HTML(response_index)
                #擷取章節的url位址
                txt_url_chapter_list = response_index.xpath('//td/ul/li/a/@href')

                #儲存小說url和小說名
                with open("xiaoshuoliebiao.txt",'a+',encoding='utf-8') as f:
                    f.write('https://www.xstt5.com'+u+','+n+'\n')

                #對章節url進行排序
                txt_url_chapter_list.sort()

                #逐個爬取儲存

                # 方法一(單線程)
                # for c in txt_url_chapter_list:
                #     url='https://www.xstt5.com'+c
                #     object=DFSpider(url,n)
                #     object.parse_start_url()
                # print(f" {n} 下載下傳成功")
                #
                # 方法二(多線程)爬蟲速度加快,但是章節會亂
                for c in txt_url_chapter_list:
                    url = 'https://www.xstt5.com' + c
                    object = DFSpider(url, n)
                    fun1=threading.Thread(target=object.parse_start_url)
                    fun1.start()
                    fun1.join()
        except:
            print("出錯了!未找到檔案")
           

當然,對于分布式任務,當然可以采用多線程、多程序、協程就行爬取工作,速度更快哦!

for c in txt_url_chapter_list:
                url = 'https://www.xstt5.com' + c
                object = DFSpider(url, n)
                fun1=threading.Thread(target=object.parse_start_url)
                fun1.start()
                fun1.join()
           

以下就是運作截圖了

用python實作自動化辦公------爬取小說天堂所有小說
用python實作自動化辦公------爬取小說天堂所有小說
用python實作自動化辦公------爬取小說天堂所有小說
用python實作自動化辦公------爬取小說天堂所有小說

今天的分享就到這兒了,感謝大家的閱讀,别忘了給我點個贊哦!

如果對我的文章感興趣,請為我點一個贊,如果有python的知識需要了解或探讨,可以加本人微信cuiliang1666457052