天天看點

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

目錄

前言

開始

分析(x0)

分析(x1)

分析(x2)

分析(x3)

分析(x4)

完整的代碼

我有話說

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

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

既然是要采集整站資料,那麼我們進入目标網站,點選全部作品。

「Python」純幹貨,5000字的博文教你采集整站小說(附源碼)
第一步右鍵一下檢視網站源代碼,看裡面是否有咱們需要的書本源頭檔案位址(當然是看源頭檔案位址,因為一本書的内容這麼大,然後一頁有這麼多本書,肯定不可能内容全部在源代碼中)。
「Python」純幹貨,5000字的博文教你采集整站小說(附源碼)

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

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

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

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

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

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

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

好吧,源代碼中也是有的。不過你們不能大意,一定要檢視源代碼中是否有,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)  # 建立檔案夾      

這裡對應着咱們的思路,每采集到一個書名就給它單獨建立一個檔案夾。

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

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

那麼接下來就是去模拟請求咱們采集到的書本目錄的跳轉連結,然後同樣的方法去采集到章節名與章節内容的跳轉連結了。

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

同樣的你們自己檢視下源代碼,資料也是在裡面的。

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

那就接着寫代碼咯

```
當然在學習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)      

效果圖:

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

知道這裡為什麼沒有去把章節名字命名的txt文檔儲存在檔案夾内嗎?

因為咱們還沒有擷取到章節的内容呀,是不是需要先把章節内容寫到章節的txt裡面,然後再儲存在檔案夾内?

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

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

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

每一個标簽隻儲存一行内容,那麼就需要用到把采集到的所有内容都組合起來,并用換行符隔開,盡量保持文章格式。

代碼走起:

```
當然在學習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)      
「Python」純幹貨,5000字的博文教你采集整站小說(附源碼)

這裡要說明一下,咱們還隻是抓取了第一頁的資料。那麼如何抓取整站的資料呢?

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

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

建構個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)      
「Python」純幹貨,5000字的博文教你采集整站小說(附源碼)

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

emmm本來以前是錄制過視訊教程的,但是由于從上家公司離職後丢失了。在這裡跟大夥說聲抱歉。

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

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

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

② Python标準庫資料(最全中文版)

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

④ Python基礎入門、爬蟲、web開發、大資料分析方面的視訊(适合小白學習)

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

```
當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎麼去學習呢?
學習Python中有不明白推薦加入交流Q群号:928946953
群裡有志同道合的小夥伴,互幫互助, 群裡有不錯的視訊學習教程和PDF!
還有大牛解答!
```
      
「Python」純幹貨,5000字的博文教你采集整站小說(附源碼)