前言: 這次的爬蟲難度係數不大,相對於我上次講解的課程了來說有很好的驗證和過度的效果,但是卻有幾個較新的知識點。包含文本解碼,封裝方法,寫入txt,鏈接拼接等等,這也是我選擇《書趣閣小說》來教學的原因。特別是實現它的邏輯,可以用到很多的地方,這些都是可以帶來的收穫!
視頻教程: 爬取《書趣閣》小說
操作平臺: python37, jupyter, 谷歌
1、請求服務器
1.1、分析網頁
我們在請求服務器之前要先看一下這個網頁的構造,我們可以看到它的信息全部都是通過html
加載出來的,每一個url
都可以對應一篇小說,所以我們只需要提取到該小說目錄的所有鏈接就可以獲取到沒有個章節的內容了。
1.2、獲取html文件
# 導入包
import requests
url = "http://www.shuquge.com/txt/514/363448.html"
reponse = requests.get(url)
print (reponse.text)
1.3、解碼
我這裏用了一種萬能的解碼方式,可以對付大多數的亂碼問題
#解碼
reponse.encoding = reponse.apparent_encoding
print (reponse.text)
2、提取並保存信息
2.1、提取內容
在這裏任然使用的lxml
來提取信息,主要提取它的名稱,用來做txt文件
的名稱,並把內容保存進文件內
# 提取信息
from lxml import etree
#解析
etree_html = etree.HTML(reponse.text)
#提取標題
title = etree_html.xpath('//*[@id="wrapper"]/div[4]/div[2]/h1/text()')
print (title)
#提取內容
content = etree_html.xpath('//*[@id="content"]//text()') #現在還是數組形式,文本,字符串
text = "".join(content) #把數組轉化爲字符串,\r和\n換行
text
2.2、寫入txt
現在使用相對路徑的方式把它和代碼保存在一個文件夾內,名稱爲第一章 若得來生重倚劍,屠盡奸邪笑蒼天.txt
with open('./第一章 若得來生重倚劍,屠盡奸邪笑蒼天.txt', 'a', encoding='utf-8') as file: #創建並打開一個文件
file.write(text) #放進去內容,寫入
file.close() # 關閉
2.3、封裝函數的方法
簡單方法封裝可以寫爲:
#這個方法沒有被執行,因爲沒有入口
def start():
print ("啊啊啊啊啊啊")
# 沒有數據返回類型
def funtion():
print ("內容已經被執行")
# 有數據返回型
def get_info(b):
a = b + 10
return a
if __name__ =='__main__':
funtion() #直接進入funtion()中執行
c = get_info(5) #把5傳到get_info()方法中,返回值賦給c
print (c)
結果:
內容已經被執行
15
記憶點: start()
方法沒有被執行是因爲它沒有被調用,所以沒有執行;我們可以把方法理解爲一個房子,它有一扇唯一的門 def funtion()
,我們要進入其中,必須要有對應的鑰匙funtion()
才能進入;如果我們要帶東西進去,那麼必須要先告訴我們是否可以帶東西進入?能帶多少個?它的門可以爲 get_info(b)
,鑰匙就爲 get_info(這裏放要帶的東西,多個用逗號分開)
,需要傳出來的值可以用 return
傳出,並找一個值接收,如上面的 c
。
3、爬取首頁所有鏈接
- 爬取首頁鏈接方法和上面一樣,雖然文字有亂碼情況,但是我們不需要文本,只需要
href=" "
雙引號中的內容,這部分沒有亂碼,不需要額外解碼都可以; - 我們獲取的
href
標籤內容不是一個完整的鏈接,需要參考它原理完整鏈接自己拼接出來; - 把爬取到的每一個鏈接拼接完整後追加到一個數組中,用 return 把這個數組返回出來。
import requests
from lxml import etree
def get_link(index_url):
index_html = requests.get(index_url).text
index_etree = etree.HTML(index_html)
dd = index_etree.xpath('/html/body/div[5]/dl/dd')
link_list = [] # 打包所有的練接
for item in dd:
href = "http://www.shuquge.com/txt/514/"+item.xpath('./a/@href')[0]
link_list.append(href)
return link_list #返回的東西,我要帶走的
if __name__ =='__main__':
index_url = "http://www.shuquge.com/txt/514/index.html" #文章首頁鏈接
links = get_link(index_url)
for link in links:
target_url = link
print (target_url)
4、爬取所有章節
# 導入包
import requests
from lxml import etree
filePath = r"C:\Users\Youle\Desktop\爬取的小說\\" #本機的桌面路徑,r表示原意,多加一個\表示轉義
#這個方法下載並提取文字
def download_text(url):
# 導入包
reponse = requests.get(url)
#解碼,萬能模式
reponse.encoding = reponse.apparent_encoding
#解析
etree_html = etree.HTML(reponse.text)
#提取標題
title = etree_html.xpath('//*[@id="wrapper"]/div[4]/div[2]/h1/text()')
print (title)
#提取內容
content = etree_html.xpath('//*[@id="content"]//text()') #現在還是數組形式,文本,字符串
text = "".join(content) # 把數組轉換爲字符串,\r和\n都是換行符
# 保存到txt文件,放到電腦桌面,絕對路徑,r表示原意,\代表轉義字符
with open(filePath + title[0] + '.txt', 'a', encoding='utf-8') as file: #創建並打開一個文件
file.write(text) #放進去內容,寫入
file.close() # 關閉
# 取到所有文章的鏈接
def get_link(index_url):
index_html = requests.get(index_url).text
index_etree = etree.HTML(index_html)
dd = index_etree.xpath('/html/body/div[5]/dl/dd')
link_list = [] # 打包所有的練接
for item in dd:
href = "http://www.shuquge.com/txt/514/"+item.xpath('./a/@href')[0] #拼接出完整的鏈接
link_list.append(href)
return link_list #返回的東西,我要帶走的
if __name__ =='__main__':
index_url = "http://www.shuquge.com/txt/514/index.html" #文章首頁鏈接
links = get_link(index_url)
for link in links:
target_url = link
print ("這在爬取:", target_url)
download_text(target_url) #帶進去的東西
結果截屏: