最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python 爬取國(guó)內(nèi)小說(shuō)網(wǎng)站

 更新時(shí)間:2021年06月07日 14:31:08   作者:勤勞上班的卑微小張  
國(guó)內(nèi)小說(shuō)網(wǎng)站的結(jié)構(gòu),大概都如出一轍,改改地址,就差不多了,有此需求的朋友可以參考下本文的爬蟲寫法

原理先行

作為一個(gè)資深的小說(shuō)愛(ài)好者,國(guó)內(nèi)很多小說(shuō)網(wǎng)站如出一轍,什么 🖊*閣啊等等,大都是 get 請(qǐng)求返回 html 內(nèi)容,而且會(huì)有標(biāo)志性的<dl><dd>等標(biāo)簽。
所以大概的原理,就是先 get 請(qǐng)求這個(gè)網(wǎng)站,然后對(duì)獲取的內(nèi)容進(jìn)行清洗,寫進(jìn)文本里面,變成一個(gè) txt,導(dǎo)入手機(jī),方便看小說(shuō)。

實(shí)踐篇

之前踩過(guò)一個(gè)坑,一開始我看了幾頁(yè)小說(shuō),大概小說(shuō)的內(nèi)容網(wǎng)站是https://www.xxx.com/小說(shuō)編號(hào)/章節(jié)編號(hào).html,一開始看前幾章,我發(fā)現(xiàn)章節(jié)編號(hào)是連續(xù)的, 于是我一開始想的就是記住起始章節(jié)編號(hào),然后在循環(huán)的時(shí)候章節(jié)編號(hào)自增就行,后面發(fā)現(xiàn)草率了,可能看個(gè) 100 章之后,章節(jié)列表會(huì)出現(xiàn)斷層現(xiàn)象,這個(gè)具體為啥 還真不知道,按理說(shuō)小說(shuō)編號(hào)固定,可以算是一個(gè)數(shù)據(jù)表,那里面的章節(jié)編號(hào)不就是一個(gè)自增 id 就完了嘛?有懂王可以科普一下!
所以這里要先獲取小說(shuō)的目錄列表,并把目錄列表洗成一個(gè)數(shù)組方便我們后期查找!getList.py文件:

定義一個(gè)請(qǐng)求書簽的方法

# 請(qǐng)求書簽地址
def req():
    url = "https://www.24kwx.com/book/4/4020/"
    strHtml = requests.get(url)
    return strHtml.text

將獲取到的內(nèi)容提取出(id:唯一值/或第 X 章小說(shuō))(name:小說(shuō)的章節(jié)名稱)(key:小說(shuō)的章節(jié) id)

# 定義一個(gè)章節(jié)對(duì)象
class Xs(object):
    def __init__(self,id,key,name):
        self._id = id
        self._key = key
        self._name = name

    @property
    def id(self):
        self._id
    @property
    def key(self):
        self._key
    @property
    def name(self):
        self._name

    def getString(self):
        return 'id:%s,name:%s,key:%s' %(self._id,self._name,self._key)

# 轉(zhuǎn)換成書列表
def tranceList():
    key = 0
    name = ""
    xsList = []
    idrule = r'/4020/(.+?).html'
    keyrule = r'第(.+?)章'
    html = req()
    html = re.split("</dt>",html)[2]
    html = re.split("</dl>",html)[0]
    htmlList = re.split("</dd>",html)
    for i in htmlList:
        i = i.strip()
        if(i):
            # 獲取id
            id = re.findall(idrule,i)[0]
            lsKeyList = re.findall(keyrule,i)
            # 如果有章節(jié)
            if len(lsKeyList) > 0 :
                key = int(lsKeyList[0])
                lsname = re.findall(r'章(.+?)</a>',i)
            else :
                key = key + 1
            # 獲取名字
            # lsname = re.findall(r'.html">(.+?)</a>',i)[0]
            # name = re.sub(',',' ', lsname, flags=re.IGNORECASE)
            name = re.findall(r'.html">(.+?)</a>',i)[0]
            xsobj = Xs(id,key,name)
            xsList.append(xsobj.getString())
    writeList(xsList)

注意一下我:如果你從別的語(yǔ)言轉(zhuǎn) py,第一次寫object對(duì)象可能會(huì)比較懵,沒(méi)錯(cuò)因?yàn)樗膐bject是一個(gè)class,這里我創(chuàng)建的對(duì)象就是{id,key,name}但是你寫入 txt 的時(shí)候還是要getString,所以后面想想我直接寫個(gè){id:xxx,name:xxx,key:xxx}的字符串不就完了,還弄啥class,后面還是想想給兄弟盟留點(diǎn)看點(diǎn),就留著了

最后寫入 txt 文件

# 寫入到文本
def writeList(list):
    f = open("xsList.txt",'w',encoding='utf-8')
    # 這里不能寫list,要先轉(zhuǎn)字符串 TypeError: write() argument must be str, not list
    f.write('\n'.join(list))
    print('寫入成功')

# 大概寫完的txt是這樣的
id:3798160,name:第1章 孫子,我是你爺爺,key:1
id:3798161,name:第2章 孫子,等等我!,key:2
id:3798162,name:第3章 天上掉下個(gè)親爺爺,key:3
id:3798163,name:第4章 超級(jí)大客戶,key:4
id:3798164,name:第5章 一張退婚證明,key:5

ok ! Last one
這里已經(jīng)寫好了小說(shuō)的目錄,那我們就要讀取小說(shuō)的內(nèi)容,同理

先寫個(gè)請(qǐng)求

# 請(qǐng)求內(nèi)容地址
def req(id):
    url = "https://www.24kwx.com/book/4/4020/"+id+".html"
    strHtml = requests.get(url)
    return strHtml.text

讀取我們剛剛保存的目錄

def getList():
    f = open("xsList.txt",'r', encoding='utf-8')
    # 這里按行讀取,讀取完后line是個(gè)數(shù)組
    line = f.readlines()
    f.close()
    return line

定義好一個(gè)清洗數(shù)據(jù)的規(guī)則

contextRule = r'<div class="content">(.+?)<script>downByJs();</script>'
titleRule = r'<h1>(.+?)</h1>'
def getcontext(objstr):
    xsobj = re.split(",",objstr)
    id = re.split("id:",xsobj[0])[1]
    name = re.split("name:",xsobj[1])[1]
    html = req(id)
    lstitle = re.findall(titleRule,html)
    title = lstitle[0] if len(lstitle) > 0 else name
    context = re.split('<div id="content" class="showtxt">',html)[1]
    context = re.split('</div>',context)[0]
    context = re.sub('&nbsp;|\r|\n','',context)
    textList = re.split('<br />',context)
    textList.insert(0,title)
    for item in textList :
        writeTxt(item)
    print('%s--寫入成功'%(title))

再寫入文件

def writeTxt(txt):
    if txt :
        f = open("nr.txt",'a',encoding="utf-8")
        f.write(txt+'\n')

最后當(dāng)然是串聯(lián)起來(lái)啦

def getTxt():
    # 默認(rèn)參數(shù)配置
    startNum = 1261 # 起始章節(jié)
    endNum = 1300 # 結(jié)束章節(jié)
    # 開始主程序
    f = open("nr.txt",'w',encoding='utf-8')
    f.write("")
    if endNum < startNum:
        print('結(jié)束條數(shù)必須大于開始條數(shù)')
        return
    allList = getList()
    needList = allList[startNum-1:endNum]
    for item in needList:
        getcontext(item)
        time.sleep(0.2)
    print("全部爬取完成")

完整代碼

getList.py

import requests
import re

# 請(qǐng)求書簽地址
def req():
    url = "https://www.24kwx.com/book/4/4020/"
    strHtml = requests.get(url)
    return strHtml.text

# 定義一個(gè)章節(jié)對(duì)象
class Xs(object):
    def __init__(self,id,key,name):
        self._id = id
        self._key = key
        self._name = name

    @property
    def id(self):
        self._id
    @property
    def key(self):
        self._key
    @property
    def name(self):
        self._name

    def getString(self):
        return 'id:%s,name:%s,key:%s' %(self._id,self._name,self._key)

# 轉(zhuǎn)換成書列表
def tranceList():
    key = 0
    name = ""
    xsList = []
    idrule = r'/4020/(.+?).html'
    keyrule = r'第(.+?)章'
    html = req()
    html = re.split("</dt>",html)[2]
    html = re.split("</dl>",html)[0]
    htmlList = re.split("</dd>",html)
    for i in htmlList:
        i = i.strip()
        if(i):
            # 獲取id
            id = re.findall(idrule,i)[0]
            lsKeyList = re.findall(keyrule,i)
            # 如果有章節(jié)
            if len(lsKeyList) > 0 :
                key = int(lsKeyList[0])
                lsname = re.findall(r'章(.+?)</a>',i)
            else :
                key = key + 1
            # 獲取名字
            # lsname = re.findall(r'.html">(.+?)</a>',i)[0]
            # name = re.sub(',',' ', lsname, flags=re.IGNORECASE)
            name = re.findall(r'.html">(.+?)</a>',i)[0]
            xsobj = Xs(id,key,name)
            xsList.append(xsobj.getString())
    writeList(xsList)

# 寫入到文本
def writeList(list):
    f = open("xsList.txt",'w',encoding='utf-8')
    # 這里不能寫list,要先轉(zhuǎn)字符串 TypeError: write() argument must be str, not list
    f.write('\n'.join(list))
    print('寫入成功')


def main():
    tranceList()

if __name__ == '__main__':
    main() 

writeTxt.py

import requests
import re
import time


# 請(qǐng)求內(nèi)容地址
def req(id):
    url = "https://www.24kwx.com/book/4/4020/"+id+".html"
    strHtml = requests.get(url)
    return strHtml.text

def getList():
    f = open("xsList.txt",'r', encoding='utf-8')
    # 這里按行讀取
    line = f.readlines()
    f.close()
    return line

contextRule = r'<div class="content">(.+?)<script>downByJs();</script>'
titleRule = r'<h1>(.+?)</h1>'
def getcontext(objstr):
    xsobj = re.split(",",objstr)
    id = re.split("id:",xsobj[0])[1]
    name = re.split("name:",xsobj[1])[1]
    html = req(id)
    lstitle = re.findall(titleRule,html)
    title = lstitle[0] if len(lstitle) > 0 else name
    context = re.split('<div id="content" class="showtxt">',html)[1]
    context = re.split('</div>',context)[0]
    context = re.sub('&nbsp;|\r|\n','',context)
    textList = re.split('<br />',context)
    textList.insert(0,title)
    for item in textList :
        writeTxt(item)
    print('%s--寫入成功'%(title))

def writeTxt(txt):
    if txt :
        f = open("nr.txt",'a',encoding="utf-8")
        f.write(txt+'\n')

def getTxt():
    # 默認(rèn)參數(shù)配置
    startNum = 1261 # 起始章節(jié)
    endNum = 1300 # 結(jié)束章節(jié)
    # 開始主程序
    f = open("nr.txt",'w',encoding='utf-8')
    f.write("")
    if endNum < startNum:
        print('結(jié)束條數(shù)必須大于開始條數(shù)')
        return
    allList = getList()
    needList = allList[startNum-1:endNum]
    for item in needList:
        getcontext(item)
        time.sleep(0.2)
    print("全部爬取完成")

    
def main():
    getTxt()

if __name__ == "__main__":
    main()

以上就是python 爬取國(guó)內(nèi)小說(shuō)網(wǎng)站的詳細(xì)內(nèi)容,更多關(guān)于python 爬取小說(shuō)網(wǎng)站的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python3之模塊psutil系統(tǒng)性能信息使用

    python3之模塊psutil系統(tǒng)性能信息使用

    psutil是個(gè)跨平臺(tái)庫(kù),能夠輕松實(shí)現(xiàn)獲取系統(tǒng)運(yùn)行的進(jìn)程和系統(tǒng)利用率,這篇文章主要介紹了python3之模塊psutil系統(tǒng)性能信息使用,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Pandas 重塑(stack)和軸向旋轉(zhuǎn)(pivot)的實(shí)現(xiàn)

    Pandas 重塑(stack)和軸向旋轉(zhuǎn)(pivot)的實(shí)現(xiàn)

    這篇文章主要介紹了Pandas 重塑(stack)和軸向旋轉(zhuǎn)(pivot)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python生成器在讀取接口用例中應(yīng)用解析

    python生成器在讀取接口用例中應(yīng)用解析

    這篇文章主要為大家介紹了python生成器在讀取接口用例中應(yīng)用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Python實(shí)現(xiàn)一個(gè)列表分割成多個(gè)列表的四種示例

    Python實(shí)現(xiàn)一個(gè)列表分割成多個(gè)列表的四種示例

    本文主要介紹了Python實(shí)現(xiàn)一個(gè)列表分割成多個(gè)列表的四種示例,包括使用循環(huán)、切片操作、itertools.groupby()和numpy的array_split(),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-12-12
  • 使用Python批量移除Word文檔水印的代碼示例

    使用Python批量移除Word文檔水印的代碼示例

    移除Word文檔中的水印可以減少不必要的麻煩,通過(guò)使用Python這樣的編程語(yǔ)言,我們可以輕松實(shí)現(xiàn)自動(dòng)化操作,高效地移除Word文檔中的水印,確保文檔的專業(yè)性和準(zhǔn)確性,本文將介紹如何使用Python批量移除Word文檔中的水印
    2024-07-07
  • 詳解Python中的序列化與反序列化的使用

    詳解Python中的序列化與反序列化的使用

    這篇文章主要介紹了詳解Python中的序列化與反序列化的使用,針對(duì)pickle和cPickle對(duì)象進(jìn)行了探究,需要的朋友可以參考下
    2015-06-06
  • Python實(shí)現(xiàn)一個(gè)服務(wù)器監(jiān)聽多個(gè)客戶端請(qǐng)求

    Python實(shí)現(xiàn)一個(gè)服務(wù)器監(jiān)聽多個(gè)客戶端請(qǐng)求

    這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)一個(gè)服務(wù)器監(jiān)聽多個(gè)客戶端請(qǐng)求,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python編程普通及類和靜態(tài)方法示例詳解

    python編程普通及類和靜態(tài)方法示例詳解

    普通方法會(huì)將實(shí)例傳入方法當(dāng)中(通常用self表示),類方法會(huì)將類傳入方法當(dāng)中(通常用cls表示),靜態(tài)方法中傳入與類無(wú)關(guān)的變量。下面將舉例詳細(xì)說(shuō)明
    2021-10-10
  • Python分割訓(xùn)練集和測(cè)試集的方法示例

    Python分割訓(xùn)練集和測(cè)試集的方法示例

    這篇文章主要介紹了Python分割訓(xùn)練集和測(cè)試集的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • python中ctypes使用方法

    python中ctypes使用方法

    這篇文章主要介紹了python中ctypes使用方法,包括 python和c中類型映射,操作結(jié)構(gòu)體和聯(lián)合體,需要定義結(jié)構(gòu)體或聯(lián)合體的類型,然后可以創(chuàng)建實(shí)例、訪問(wèn)其成員等,感興趣的朋友跟隨小編一起看看吧
    2024-04-04

最新評(píng)論

诸暨市| 怀柔区| 桑日县| 扎鲁特旗| 永泰县| 花垣县| 大竹县| 揭东县| 南康市| 吉安市| 克山县| 康乐县| 建始县| 杭锦后旗| 元阳县| 衡南县| 新乐市| 曲靖市| 安丘市| 武威市| 海宁市| 得荣县| 沧州市| 鹤山市| 贺兰县| 双鸭山市| 安塞县| 涞水县| 凤城市| 乐昌市| 那坡县| 南宁市| 德庆县| 永州市| 洛阳市| 仁化县| 盐城市| 阳曲县| 舟曲县| 德安县| 呼玛县|