【Python】小說爬取-1.簡易單個小說內容
小說爬取器,單個章節小說內容爬取講解
1.我們需要用到的
requests,parsel,以及你的目標小說
2.此程式目的
本次文章的要求較簡單,只是你想看的小說,爬取它的內容,並儲存為txt文件,達到這個功能只需15行程式碼即可
爬取一個網文的內容,是我們的目的,此前,我們可以設想這個程式最終的樣子,它並不用於商業化。它應該是簡單的,不復雜的,易上手的,應該有視覺化的執行介面,可以一鍵建立txt小說檔案,可以讀取所有章節內容,有進度,可以顯示失敗與否,能有多個網站的資源,有搜尋欄。
3.開始操作
前置條件
兩個庫,還有一個是小說目錄網址在這個地方可以看到小說的所有章節以及小說名字
還有一個就是小說網站的網址,這個是因為該網站的href屬性做的調整
import requests import parsel url = 'https://www.81zw.com/book/42186/' burl = 'https://www.81zw.com'
接下來是程式碼的操作環節
此處需要配合網頁原始碼使用,有五個必要的操作,這五個的使用貫穿了這個程式。
requests.get()
parsel.Selector()
.css().get()
'\n'.join()
with open()
接下來一一講解
在你使用了準備好上述條件後,小說名字。
page = requests.get() selector = parsel.Selector(page.text) novel_name= selector.css('#info h1::text').get
接下來列印novel_name就是小說名字
request.get()獲取它的網頁原始碼,.text可以使它字串輸出,但我們並不是要一整個網頁。我們需要的只是它的名字,為了這個目的,我們就要使用css選擇,
通過parsel.Selector然後使用css選擇固定的東西,這裡就涉及指定的網頁內容,這裡並不是一成不變('#info h1::text'),此處不懂請跳轉至4.1
這裡如果列印novel_name得到的就是小說名字,然後我們還需要小說的每個章節名,我們是全部輸出在一個txt檔案中,所以在文章正文網頁中檢視更方便些。
所以為css('.bookname h1::text').get()
看到這裡並瞭解網頁的檢查操作的話你應該已經懂大體的操作了(如果不懂請看第四),接下來用for迴圈所有章節並使得到的文字注入txt檔案中
如何迴圈所有的章節呢,簡單來說就是要開啟每一個章節並讀取正文記錄,你要觀察網址之間的規律在那裡
這是官網www.81zw.com 八一中文網
這是小說頁面://www.81zw.com/book/42186/ 我師兄實在是太穩健了
這是小說的第一章www.81zw.com/book/42186/18304635.html 小小靈娥
小說的第二章呢,www.81zw.com/book/42186/18304636.html 師兄的入門稽核
第三章呢,你可以猜一下了,如你所想是18304637結尾 入門第一課
這裡你可能就以為貫穿所有了,但其實這個是錯誤的,你可以觀察後續的網址程式碼,會發現有變化,但也有其他方法也很簡單,關鍵就在於
ls = goal.css('#list a::attr(href)').getall()
這個是什麼意思呢?他是個列表,涵蓋了所有的網址程式碼(見4)每個元素都是這樣的形式/book/42186/18304635.html,這樣做一些靈活變化
所以應該
for i in ls: url = 'https://www.81zw.com/' + i # 然後在這個迴圈下再對url這個網址操作,他會迴圈遍歷每一個章節
然後套用上面的函式,一樣的核心
x = requests.get(url) y = parsel.Selector.(x.text) z = y.css('#content::text').get
然後就是有新意的地方了。
檔案相關的操作
with open(檔名稱, 方式, 編碼方式) as f:
檔名稱要有後綴,編碼方式一般使用'utf-8',然後對著f使用write寫入小說內容
r |
以讀方式開啟檔案,可讀取檔案資訊。 |
w |
以寫方式開啟檔案,可向檔案寫入資訊。如檔案存在,則清空該檔案,再寫入新內容 |
a |
以追加模式開啟檔案(即一開啟檔案,檔案指標自動移到檔案末尾),如果檔案不存在則建立 |
with open('novel_name' + '.txt', 'a', encoding='utf-8') as f:
f.write(content)
到這裡接近尾聲,其他列印章節名,空行之類的操作可以自行選擇
4.網頁的F12檢查操作
對你需要的小說網頁目錄頁選擇檢查網頁原始碼然後應該是這樣的形式
使用按鍵選中可以指定到某個目標,我使用的是edge,左上角那個標誌就是這個功能。然後我選中了小說名字,id = info,在h1標籤下。
他是有規律的,上面的是小說名字,所以應該是css('#info h1::text')
這個是章節名字,所以是css('#list a::text'),他的後續網址是css('#list a::attr(href)')
前者的內容是第一張小小靈娥,後者是橘色內容/book/42186/18304635.html
這裡我打開了正文的第一章,這裡是正文的位置在content下,此外每個網站可能都有所不同,如果不是id而是class就需要用.來開頭而不是#
所以正文的部分就是css('#content::text')
需要getall,否則你只會得到一句。
5.後續操作
import requests
import parsel
url = 'https://www.81zw.com/book/42186/'
url1 = 'https://www.81zw.com/'
goal = parsel.Selector(requests.get(url).text)
novel_name = goal.css('#info h1::text').get()
ls = goal.css('#list a::attr(href)').getall()
print(ls)
for link in ls:
url2 = 'https://www.81zw.com' + link
goal1 = parsel.Selector(requests.get(url2).text)
novel = goal1.css('#content::text').getall()
name = goal1.css('.bookname h1::text').get()
cc = '\n'.join(novel)
with open('w' + '.txt', 'a', encoding='utf-8') as f:
f.write(name)
print()
f.write(cc)
print()
這個是整個程式碼,如果不出意外執行該檔案後應該會在該檔案所在的目錄裡建立一個
我的執行時間是960s,執行時間使用time模組後續再說明
如果有任何疑問,歡迎在評論區詢問,我會耐心解答