hello大家好憾筏,我是你們的可愛丸嚎杨,不知道你們有沒有遇到過這種情況:
自己喜歡的小說竟然只能看不能下載?氧腰?枫浙?
作為一個(gè)python學(xué)習(xí)者刨肃,這種情況當(dāng)然不能忍,那么今天我就教大家用python寫一個(gè)小說爬蟲箩帚,輕輕松松的把全網(wǎng)小說都下載到你的電腦里真友。
本次案例我選取的是小說網(wǎng)站是:筆趣閣,首頁地址為:https://www.52bqg.com/
因?yàn)樵撔≌f網(wǎng)站上每一本小說的內(nèi)容都很多紧帕,所以今天我就教大家設(shè)計(jì)針對(duì)單本小說的爬蟲盔然。在本案例中,我選取的是以下這本還在連載的小說是嗜,網(wǎng)頁地址為:https://www.52bqg.com/book_307/
在正式開始講解之前我先給大家講解一下我的設(shè)計(jì)思路:
1愈案、確定想要爬取的小說及入口url
2、在入口url通過解析獲取小說所有章節(jié)名稱及各章節(jié)href
3鹅搪、通過字符串拼接得到所有章節(jié)詳情頁的地址
4站绪、爬取每章具體內(nèi)容的文本
5、將每章小說以章節(jié)名稱命名并保存為txt文件
注意:現(xiàn)在各大網(wǎng)站都有反爬機(jī)制丽柿,所以我們要對(duì)我們的爬蟲進(jìn)行偽裝恢准,讓它模仿瀏覽器訪問,這樣網(wǎng)站就檢測(cè)不到訪問他的是爬蟲程序啦甫题。所以我們要給爬蟲設(shè)置請(qǐng)求頭馁筐,將網(wǎng)頁的User-Agent復(fù)制到代碼里
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
剛才我們已經(jīng)確定了想要爬的小說以及入口url,那怎么獲取小說的章節(jié)名稱和href呢幔睬?方法是:點(diǎn)擊鼠標(biāo)右鍵眯漩,選擇檢查,然后選擇左上角的小箭頭麻顶,再把鼠標(biāo)移動(dòng)到我們想要獲取的內(nèi)容的位置,就能找到他們的代碼啦舱卡!
這里我們通過xpath的方式獲取需要的內(nèi)容 辅肾,如果你對(duì)xpath不熟悉的話,那我們還可以通過如下的一個(gè)小妙招輕松獲取xpath路徑轮锥。
注意:dd[3]代表的是獲取第三個(gè)dd標(biāo)簽的內(nèi)容矫钓,如果你想獲取所有章節(jié)名稱,那把[3]去掉即可舍杜,即:
//*[@id="list"]/dl/dd[3]/a
變?yōu)椋?/p>
//*[@id="list"]/dl/dd/a
代碼如下:
#設(shè)置爬取小說的函數(shù)功能
def get_text(url):
response = requests.get(url, headers=headers)
#最常用的編碼方式是utf-8以及gbk新娜,出現(xiàn)亂碼可以先嘗試這兩種
response.encoding = 'gbk'
selector = etree.HTML(response.text)
#獲取到所有章節(jié)的標(biāo)題
title = selector.xpath('//*[@id="list"]/dl/dd/a/text()')
#獲取每章小說具體內(nèi)容的鏈接
hrefs = selector.xpath('//*[@id="list"]/dl/dd/a/@href')
接下來我們來想一想如何獲取到每一章的內(nèi)容鏈接呢?首先我們可以觀察一下每一章的鏈接有什么規(guī)律:
第一章:https://www.52bqg.com/book_307/189710.html
第二章:https://www.52bqg.com/book_307/189713.html
第三章:https://www.52bqg.com/book_307/189716.html
第四章:https://www.52bqg.com/book_307/189720.html
第五章:https://www.52bqg.com/book_307/189723.html
我們可以觀察到既绩,每章的鏈接地址前面有一部分都是相同的概龄,而最后一個(gè)/后的內(nèi)容都是每一章名稱a標(biāo)簽的href屬性的內(nèi)容,因此我們可以通過字符串的拼接來找到具體章節(jié)地址
urls = []
for href in hrefs:
#把url和href拼接得到每一章具體內(nèi)容的url并存在urls列表里
urls.append(url+href)
然后我們可以再次通過審查元素的方法饲握,找到章節(jié)內(nèi)容的xpath路徑私杜,獲取每一章的內(nèi)容
for i in range(len(urls)):
#傳入每一章內(nèi)容具體鏈接的url
response = requests.get(urls[i], headers=headers)
response.encoding = 'gbk'
selector = etree.HTML(response.text)
#獲取每一章具體的內(nèi)容
contents = selector.xpath('//*[@id="content"]/text()')
#保存小說章節(jié)名稱及章節(jié)內(nèi)容
最后我們?cè)僭O(shè)計(jì)一下保存文章的代碼蚕键,并使這個(gè)爬蟲能幫助我們?cè)跊]有對(duì)應(yīng)文件夾的情況下自動(dòng)創(chuàng)建文件夾保存小說文件。
自動(dòng)生成小說文件夾:
import os
#自動(dòng)創(chuàng)建保存小說的文件夾
# os.chdir()方法用于改變當(dāng)前工作目錄指定的文件夾
if not os.path.exists(os.getcwd()+"/xiaoshuo"):
print("小說文件夾不存在衰粹,幫你自動(dòng)創(chuàng)建好了")
print("==================================")
os.mkdir("xiaoshuo")
#把當(dāng)前路徑改為到xiaoshuo文件夾處
os.chdir(os.getcwd()+"/xiaoshuo")
else:
print("小說文件夾存在")
os.chdir(os.getcwd()+"/xiaoshuo")
print("==================================")
保存為txt文件:
with open(title[i]+".txt", "w", encoding='utf-8') as f:
for content in contents:
content = content.replace("\n","")
#將每一章的內(nèi)容寫入對(duì)應(yīng)章節(jié)的txt文件里
f.write(content)
print(str(title[i])+"下載成功锣光!")
代碼運(yùn)行效果:
完整代碼:
#導(dǎo)入需要用到的模塊
import requests
from lxml import etree
import os
#自動(dòng)創(chuàng)建保存小說的文件夾
# os.chdir()方法用于改變當(dāng)前工作目錄指定的文件夾
if not os.path.exists(os.getcwd()+"/xiaoshuo"):
print("小說文件夾不存在,幫你自動(dòng)創(chuàng)建好了")
print("==================================")
os.mkdir("xiaoshuo")
#把當(dāng)前路徑改為到xiaoshuo文件夾處
os.chdir(os.getcwd()+"/xiaoshuo")
else:
print("小說文件夾存在")
os.chdir(os.getcwd()+"/xiaoshuo")
print("==================================")
#設(shè)置請(qǐng)求頭
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
#設(shè)置想要爬取的小說鏈接
url = 'https://www.52bqg.com/book_307/'
#設(shè)置爬取小說的函數(shù)功能
def get_text(url):
response = requests.get(url, headers=headers)
#最常用的編碼方式是utf-8以及gbk铝耻,出現(xiàn)亂碼可以先嘗試這兩種
response.encoding = 'gbk'
selector = etree.HTML(response.text)
#獲取到所有章節(jié)的標(biāo)題
title = selector.xpath('//*[@id="list"]/dl/dd/a/text()')
#獲取每章小說具體內(nèi)容的鏈接
hrefs = selector.xpath('//*[@id="list"]/dl/dd/a/@href')
urls = []
for href in hrefs:
#把url和href拼接得到每一章具體內(nèi)容的url并存在urls列表里
urls.append(url+href)
for i in range(len(urls)):
#傳入每一章內(nèi)容具體鏈接的url
response = requests.get(urls[i], headers=headers)
response.encoding = 'gbk'
selector = etree.HTML(response.text)
#獲取每一章具體的內(nèi)容
contents = selector.xpath('//*[@id="content"]/text()')
#保存小說章節(jié)名稱及章節(jié)內(nèi)容
with open(title[i]+".txt", "w", encoding='utf-8') as f:
for content in contents:
content = content.replace("\n","")
#將每一章的內(nèi)容寫入對(duì)應(yīng)章節(jié)的txt文件里
f.write(content)
print(str(title[i])+"下載成功誊爹!")
if __name__ == '__main__':
get_text(url)
今天的小說爬蟲案例就分享到這里啦,喜歡的朋友們記得給我點(diǎn)贊關(guān)注支持我哦瓢捉,我將持續(xù)和大家分享python學(xué)習(xí)經(jīng)驗(yàn) O(∩_∩)O~