hello大家好膜毁,我是你們的可愛丸构韵,不知道你們有沒有遇到過這種情況:
自己喜歡的小說竟然只能看不能下載?吃媒?衡奥?
作為一個python學(xué)習(xí)者爹袁,這種情況當(dāng)然不能忍,那么今天我就教大家用python寫一個小說爬蟲矮固,輕輕松松的把全網(wǎng)小說都下載到你的電腦里呢簸。
本次案例我選取的是小說網(wǎng)站是:筆趣閣,首頁地址為:https://www.52bqg.com/
因?yàn)樵撔≌f網(wǎng)站上每一本小說的內(nèi)容都很多,所以今天我就教大家設(shè)計針對單本小說的爬蟲根时。在本案例中,我選取的是以下這本還在連載的小說辰晕,網(wǎng)頁地址為:https://www.52bqg.com/book_307/
在正式開始講解之前我先給大家講解一下我的設(shè)計思路:
1蛤迎、確定想要爬取的小說及入口url
2、在入口url通過解析獲取小說所有章節(jié)名稱及各章節(jié)href
3含友、通過字符串拼接得到所有章節(jié)詳情頁的地址
4替裆、爬取每章具體內(nèi)容的文本
5、將每章小說以章節(jié)名稱命名并保存為txt文件
注意:現(xiàn)在各大網(wǎng)站都有反爬機(jī)制窘问,所以我們要對我們的爬蟲進(jìn)行偽裝辆童,讓它模仿瀏覽器訪問,這樣網(wǎng)站就檢測不到訪問他的是爬蟲程序啦惠赫。所以我們要給爬蟲設(shè)置請求頭把鉴,將網(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)移動到我們想要獲取的內(nèi)容的位置怠缸,就能找到他們的代碼啦!
這里我們通過xpath的方式獲取需要的內(nèi)容 钳宪,如果你對xpath不熟悉的話揭北,那我們還可以通過如下的一個小妙招輕松獲取xpath路徑。
注意:dd[3]代表的是獲取第三個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
我們可以觀察到,每章的鏈接地址前面有一部分都是相同的奉呛,而最后一個/后的內(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)容
最后我們再設(shè)計一下保存文章的代碼登馒,并使這個爬蟲能幫助我們在沒有對應(yīng)文件夾的情況下自動創(chuàng)建文件夾保存小說文件。
自動生成小說文件夾:
import os
#自動創(chuàng)建保存小說的文件夾
# os.chdir()方法用于改變當(dāng)前工作目錄指定的文件夾
if not os.path.exists(os.getcwd()+"/xiaoshuo"):
print("小說文件夾不存在咆槽,幫你自動創(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)容寫入對應(yīng)章節(jié)的txt文件里
f.write(content)
print(str(title[i])+"下載成功陈轿!")
代碼運(yùn)行效果:
完整代碼:
#導(dǎo)入需要用到的模塊
import requests
from lxml import etree
import os
#自動創(chuàng)建保存小說的文件夾
# os.chdir()方法用于改變當(dāng)前工作目錄指定的文件夾
if not os.path.exists(os.getcwd()+"/xiaoshuo"):
print("小說文件夾不存在,幫你自動創(chuàng)建好了")
print("==================================")
os.mkdir("xiaoshuo")
#把當(dāng)前路徑改為到xiaoshuo文件夾處
os.chdir(os.getcwd()+"/xiaoshuo")
else:
print("小說文件夾存在")
os.chdir(os.getcwd()+"/xiaoshuo")
print("==================================")
#設(shè)置請求頭
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)容寫入對應(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~