用python爬取筆趣閣小說
首先打開筆趣閣網址,鏈接,搜索自己想要的小說,
在網站內單擊右鍵,點擊檢查,會出現如下界面!
我們需要的章節資訊就在我劃的這塊,

可以將每個標簽點一下,它對應的內容就會在網站里高亮,如圖,我現在點到了第一章的章節資訊,它里面包含了,每一章的鏈接與名稱,

現在我們就可以用xpath來從這標簽中獲得每一章的鏈接和名稱,
import requests,os
from lxml import html#呼叫lxml模塊和requests模塊
url = 'http://www.xbiquge.la/7/7004/'
首先咱們呼叫模塊然后決議這個網頁
hl = requests.get(url) # 獲取原始碼
hl = hl.content.decode("utf-8")
先將書名找到保存起來,

可以看到書名是在這個地方,我們可以寫代碼來獲取它
selector = html.fromstring(hl)
list = selector.xpath('//div[@id = "info"]/h1/text()')
name_book = list[0]
htmls_list = []#創建一個空串列來存盤所有章節鏈接
selector = html.fromstring(hl)
html_list = selector.xpath('//div[@id = "list"]/dl/dd/a/@href')#獲得鏈接串列
#將鏈接與網頁網址連接,形成每一章的網址
for i in html_list:
htmls_list.append(url + i)
name_list = selector.xpath('//div[@id = "list"]/dl/dd/a/text()')
列印這兩個串列,得到結果如下

我只截取了一部分,可以看到兩個串列,分別是章節鏈接和章節名稱,
然后我們就可以通過章節鏈接到每一章里去獲得內容,

通過遍歷獲取每個章節的鏈接,然后進入,我們需要在瀏覽器進入某個章節,找出章節內容的規律,如圖

可以看到內容是在
所以我們可以寫代碼來獲取這章的內容,這里的函式url傳的是我們在上面取的章節鏈接,我們可以取一個鏈接來看看
import requests,os
import lxml,html
url = 'http://www.xbiquge.la/7/7004/3246381.html'
txt = ''
hl = requests.get(url) # 獲取原始碼
hl = hl.content.decode("utf-8")
selector = html.fromstring(hl)
txt_list = selector.xpath('//div[@id = "content"]/text()')
for i in txt_list:
i = repr(i).replace(r'\r','').replace(r'\xa0','').replace("'",'')#這里將文章中多余的轉義字符刪掉,repr函式讓字串中的轉義字符不起作用,類似于r
txt += i#將串列中的字串粘貼在一起,就是我們的文章內容
print(txt)
上面代碼的url我直接在瀏覽器上取了網址,但其實它已經存在于我們的串列中了,列印結果如下

可以看到我們獲得了第一章的內容,這就是我們想要的小說內容,現在我們書名,每章鏈接,章名都有了,接下來就是存盤了

存盤代碼如下
def creat(name_book,chapter,txt):
os.makedirs(name_book,exist_ok=True)
with open(name_book + r'/'+ chapter+'.txt',"w",encoding= "utf-8") as f:
f.write(txt)
我在這里定義了一個函式來存盤資料,三個引數分別是書名,章名,還有小說內容,
我們將上面內容全部封裝為函式,因為經常要將網址轉換為原始碼,所以我先寫轉換函式
def zhuanhuan(url):
hl = requests.get(url) # 獲取原始碼
hl = hl.content.decode("utf-8") # 原始碼變為字串
return hl
請原諒我英語不太好,用拼音代替

然后就是獲取書名的函式
def nbook(url):
hl = zhuanhuan(url)
selector = html.fromstring(hl)
list = selector.xpath('//div[@id = "info"]/h1/text()')
name_book = list[0]
return name_book
獲取章節鏈接和章名
def list_fun(hl,url):
htmls_list = []#創建一個空串列來存盤所有章節鏈接
selector = html.fromstring(hl)
html_list = selector.xpath('//div[@id = "list"]/dl/dd/a/@href')#獲得鏈接串列
#將鏈接與網頁網址連接,形成每一章的網址
for i in html_list:
htmls_list.append(url + i)
name_list = selector.xpath('//div[@id = "list"]/dl/dd/a/text()')
return htmls_list,name_list
獲取章節內容
def article(url):
txt= ''
hl = zhuanhuan(url)
selector = html.fromstring(hl)
txt_list = selector.xpath('//div[@id = "content"]/text()')
for i in txt_list:
i = repr(i).replace(r'\r','').replace(r'\xa0','')
txt += i
最后再在一個主函式里將串列遍歷,獲得每一章的內容存盤在本地
def main(url):
hl = zhuanhuan(url)
y = list_fun(hl,url)#接出兩個串列
name_book = nbook(url)#書名
for i,j in zip(y[0],y[1]):
txt = article(i)#章節內容
name = j.replace("?",'').replace('*','').replace('/','')#章節名稱
creat(name_book,name,txt)
章節名稱里替換那些符號是因為windows系統里檔案命名是不能有\ / : * ? " < > |
這九個符號的,這個問題曾經也困擾了我好幾天,導致我每次爬到某一章就停下來,后來才知道是命名規則的問題,其實可以將這九個符號放在串列中,檢查每個章名,然后替換,我這里是直接替換的
所以總的代碼就如下圖
import requests,os
from lxml import html,etree
#轉換網址為源代碼
def zhuanhuan(url):
hl = requests.get(url)
hl = hl.content.decode("utf-8")
return hl
#存盤網址串列和名稱串列(每一章)
def list_fun(hl,url):
htmls_list = []#創建一個空串列來存盤所有章節鏈接
selector = html.fromstring(hl)
html_list = selector.xpath('//div[@id = "list"]/dl/dd/a/@href')#獲得鏈接串列
#將鏈接與網頁網址連接,形成每一章的網址
for i in html_list:
htmls_list.append(url + i)
name_list = selector.xpath('//div[@id = "list"]/dl/dd/a/text()')
return htmls_list,name_list
#獲得章節內容
def article(url):
txt= ''
hl = zhuanhuan(url)
selector = html.fromstring(hl)
txt_list = selector.xpath('//div[@id = "content"]/text()')
for i in txt_list:
i = repr(i).replace(r'\r','').replace(r'\xa0','')
txt += i
return txt
#獲取書名
def nbook(url):
hl = zhuanhuan(url)
selector = html.fromstring(hl)
list = selector.xpath('//div[@id = "info"]/h1/text()')
name_book = list[0]
return name_book
#創建檔案
def creat(name_book,chapter,txt):
os.makedirs(name_book,exist_ok=True)#檢查是否有這個檔案夾存在,如果沒有,則創建
with open(name_book + r'/'+ chapter+'.txt',"w",encoding= "utf-8") as f:
f.write(txt)
def main(url):
hl = zhuanhuan(url)
y = list_fun(hl,url)
name_book = nbook(url)
for i,j in zip(y[0],y[1]):
txt = article(i)
name = j.replace("?",'').replace('*','').replace('/','')
creat(name_book,name,txt)
if __name__ == "__main__":
url ='http://www.xbiquge.la/7/7004/'
main(url)
print("爬取完成!")
看我爬取到的內容,雖然速度有點慢

萌新第一次寫,如果有什么不足,請各位大佬多指點
寫到這里就結束了,謝謝觀看
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/224280.html
標籤:python
上一篇:Python實作CART決策樹
