「Python」純干貨,5000字的博文教你采集整站小說(附源碼)


目錄

 

前言

 

開始

 

分析(x0)

 

分析(x1)

 

分析(x2)

 

分析(x3)

 

分析(x4)

 

完整的代碼

 

我有話說

 


 

前言

 

大家好我叫善念,這是我的第二篇技術博文(第一篇講述的是自己的經歷),連續三天更新了,每天花兩小時寫下一個實戰案例,我也是樂在其中,謝謝大家對我的支持。

 

今天咱們要做的是利用Python爬取整個網站上的所有小說內容,其實在我心里面,采集什么內容根本無關緊要,最重要的是大家能學習到我的分析思路,授人以魚不如授人以漁。

 

開始

 

既然是要采集整站數據,那么我們進入目標網站,點擊全部作品。

 

 

 

分析(x0)

 

第一步右鍵一下查看網站源代碼,看里面是否有咱們需要的書本源頭文件地址(當然是看源頭文件地址,因為一本書的內容這么大,然后一頁有這么多本書,肯定不可能內容全部在源代碼中)。

 

 

可以看到我在元素中可以找到書的名字和介紹,然后關鍵的是一個跳轉的網址,這個網址很關鍵,因為咱們點擊這個鏈接后他會跳到單本小說中。

 

 

而單本小說里面勢必會有章節分類,而我們要做的肯定是需要把每本小說的章節名字也采集下來。

 

最終的目的就是,每本小說為一個文件夾,以書的名字命名,然后文件夾內保存所有章節,每一個章節為一個txt文檔,沒一個章節名與txt文件名對應。

 

分析(x1)

 

反轉,切記不要以element作為源代碼去考慮問題!!element可能是瀏覽器執行了一些JavaScript后所展現的源碼,與服務器傳給瀏覽器的源代碼是有所不同的。

 

所以咱們還是需要在源代碼中找一找是否有跳轉鏈接和書名。

 

 

好吧,源代碼中也是有的。不過你們不能大意,一定要查看源代碼中是否有,element代表不了源代碼。

 

那么先采集一下第一頁的書名和跳轉鏈接咯

 

 

```
當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎么去學習呢?
學習Python中有不明白推薦加入交流Q群號:928946953
群里有志同道合的小伙伴,互幫互助, 群里有不錯的視頻學習教程和PDF!
還有大牛解答!
```

# 抓取第一頁的所有書籍名字,書籍入口
# 到了書籍入口后,抓取章節名字,章節鏈接(文字內容)
# 保存
import requests
from lxml import etree
import os
url='https://www.qidian.com/all'
req = requests.get(url).text
html = etree.HTML(req)
booknames = html.xpath('//div[@class="book-mid-info"]/h4/a/text()')
tzurls = html.xpath('//div[@class="book-mid-info"]/h4/a/@href')

for bookname, tzurl in zip(booknames, tzurls):
   if not os.path.exists(bookname):
   # if os.path.exists(bookname) == False:
        os.mkdir(bookname)  # 創建文件夾

 

 

這里對應着咱們的思路,每采集到一個書名就給它單獨創建一個文件夾。

 

 

完全沒問題,到這里咱們已經完成第一步了。

 

分析(x2)

 

那么接下來就是去模擬請求咱們采集到的書本目錄的跳轉鏈接,然后同樣的方法去采集到章節名與章節內容的跳轉鏈接了。

 

 

同樣的你們自己查看下源代碼,數據也是在里面的。

 

 

那就接着寫代碼咯

 

```
當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎么去學習呢? 
學習Python中有不明白推薦加入交流Q群號:928946953 
群里有志同道合的小伙伴,互幫互助, 群里有不錯的視頻學習教程和PDF!
還有大牛解答!
```
import requests
from lxml import etree
import os
url = 'https://www.qidian.com/all'
req = requests.get(url).text
html = etree.HTML(req)
booknames = html.xpath('//div[@class="book-mid-info"]/h4/a/text()')
tzurls = html.xpath('//div[@class="book-mid-info"]/h4/a/@href')

for bookname, tzurl in zip(booknames, tzurls):
    if not os.path.exists(bookname):
    # if os.path.exists(bookname) == False:
        os.mkdir(bookname)  # 創建文件夾
    req2 = requests.get("http:" + tzurl).text
    html1 = etree.HTML(req2)
    zjurls = html1.xpath('//ul[@class="cf"]/li/a/@href')
    zjnames = html1.xpath('//ul[@class="cf"]/li/a/text()')
    for zjurl, zjname in zip(zjurls, zjnames):
        print(zjname+'\n'+zjurl)

 

 

效果圖:

 

 

分析(x3)

 

知道這里為什么沒有去把章節名字命名的txt文檔保存在文件夾內嗎?

 

因為咱們還沒有獲取到章節的內容呀,是不是需要先把章節內容寫到章節的txt里面,然后再保存在文件夾內?

 

當然這句解釋是為了照顧新手。

 

那么接下來采集章節內容,方法什么的不講了, 一模一樣的,章節內容同樣在源代碼中如上上圖所示。

 

 

每一個標簽只保存一行內容,那么就需要用到把采集到的所有內容都組合起來,並用換行符隔開,盡量保持文章格式。

 

代碼走起:

 

```
當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎么去學習呢? 
學習Python中有不明白推薦加入交流Q群號:928946953 
群里有志同道合的小伙伴,互幫互助, 群里有不錯的視頻學習教程和PDF!
還有大牛解答!
```
import requests
from lxml import etree
import os
url = 'https://www.qidian.com/all'
req = requests.get(url).text
html = etree.HTML(req)
booknames = html.xpath('//div[@class="book-mid-info"]/h4/a/text()')
tzurls = html.xpath('//div[@class="book-mid-info"]/h4/a/@href')

for bookname, tzurl in zip(booknames, tzurls):
    if not os.path.exists(bookname):
    # if os.path.exists(bookname) == False:
        os.mkdir(bookname)  # 創建文件夾
    req2 = requests.get("http:" + tzurl).text
    html1 = etree.HTML(req2)
    zjurls = html1.xpath('//ul[@class="cf"]/li/a/@href')
    zjnames = html1.xpath('//ul[@class="cf"]/li/a/text()')
    for zjurl, zjname in zip(zjurls, zjnames):
        print(zjname+'\n'+zjurl)
        req3 = requests.get('http:' + zjurl).text
        html2 = etree.HTML(req3)
        nrs = html2.xpath('//div[@class="read-content j_readContent"]/p/text()') # 分散式內容
        nr = '\n'.join(nrs)
        file_name = bookname + "\\" + zjname + ".txt"
        print("正在抓取文章:" + file_name)
        with open(file_name, 'a', encoding="utf-8") as f:
            f.write(nr)

 

 

效果圖:

 

 

這里要說明一下,咱們還只是抓取了第一頁的數據。那么如何抓取整站的數據呢?

 

分析(x4)

 

一般稍微有經驗的都知道一點,就是當我們翻頁的時候,網站的url會發生變化,頁碼一般就是在url上面。

 

 

 

構建個for循環把頁碼數變為一個變量即可,無需多言,直接上最終的完整代碼,代碼僅供參考,你們最終可以自己去修改效果。

 

完整的代碼

 

 

```
當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎么去學習呢?
學習Python中有不明白推薦加入交流Q群號:928946953
群里有志同道合的小伙伴,互幫互助, 群里有不錯的視頻學習教程和PDF!
還有大牛解答!
```

import sys
import requests
from lxml import etree
import os
for i in range(sys.maxsize):
    url = f'https://www.qidian.com/all/page{i}/'
    req = requests.get(url).text
    html = etree.HTML(req)
    booknames = html.xpath('//div[@class="book-mid-info"]/h4/a/text()')
    tzurls = html.xpath('//div[@class="book-mid-info"]/h4/a/@href')

    for bookname, tzurl in zip(booknames, tzurls):
        if not os.path.exists(bookname):
        # if os.path.exists(bookname) == False:
            os.mkdir(bookname)  # 創建文件夾
        req2 = requests.get("http:" + tzurl).text
        html1 = etree.HTML(req2)
        zjurls = html1.xpath('//ul[@class="cf"]/li/a/@href')
        zjnames = html1.xpath('//ul[@class="cf"]/li/a/text()')
        for zjurl, zjname in zip(zjurls, zjnames):
            print(zjname+'\n'+zjurl)
            req3 = requests.get('http:' + zjurl).text
            html2 = etree.HTML(req3)
            nrs = html2.xpath('//div[@class="read-content j_readContent"]/p/text()') # 分散式內容
            nr = '\n'.join(nrs)
            file_name = bookname + "\\" + zjname + ".txt"
            print("正在抓取文章:" + file_name)
            with open(file_name, 'a', encoding="utf-8") as f:
                f.write(nr)

 

 

我有話說

 

 

 

——女朋友就是私有變量,只有我這個類才能調用(紀念分手的第二周

 

emmm本來以前是錄制過視頻教程的,但是由於從上家公司離職后丟失了。在這里跟大伙說聲抱歉。

 

但是文章的話是現寫的,每篇文章我都會說得很細致,所以花費的時間比較久,一般都是兩個小時以上,每篇文章達到五千字左右。

 

原創不易,再次謝謝大家的支持。

 

① 2000多本Python電子書(主流和經典的書籍應該都有了)

 

② Python標准庫資料(最全中文版)

 

③ 項目源碼(四五十個有趣且經典的練手項目及源碼)

 

④ Python基礎入門、爬蟲、web開發、大數據分析方面的視頻(適合小白學習)

 

⑤ Python學習路線圖(告別不入流的學習)

 

```
當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎么去學習呢?
學習Python中有不明白推薦加入交流Q群號:928946953
群里有志同道合的小伙伴,互幫互助, 群里有不錯的視頻學習教程和PDF!
還有大牛解答!
```

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM