目錄html
開發爬蟲的步驟:python
實例開發與踩坑總結正則表達式
踩坑總結:ide
開發實例:函數
開發過程:學習
第三步、下載數據url
第四步、清洗數據spa
淺淡爬蟲:
此次學習爬蟲,我的認爲,爬蟲的過程像是咱們經過手動訪問網頁,找到咱們所須要的數據,而後在把數據下載並保存下來。當咱們須要訪問的網頁過多,須要下載的數據過多時,手動逐章進行無疑是一件冗長繁瑣的事情。爬蟲的優點便體現了出來,它能夠自動將網頁上咱們所須要的信息提取並保存下來,逐個訪問頁面上須要訪問的連接,進入,下載並保存信息。爬蟲的工做流程便相似手動逐個點擊訪問,瞭解了它的工做原理,再結合代碼示例就有了更深層次的認識。
開發爬蟲的步驟:
-目標數據
-網站
-頁面
-分析數據加載流程
-分析目標數據所對應的url
-下載數據
-清洗,處理數據
-數據持久化
實例開發與踩坑總結
踩坑總結:
IDE : Pycharm
須要安裝requests庫。 解決方法: win+r 輸入 cmd。在命令行輸入 : pip install requests。
導入Pycharm(!坑)。以前安裝好了requests庫,可是在Pycharm中依舊沒法運行,報錯顯示沒有requests庫。
解決方法:多是沒有導入該庫。在File - Setting - Project Interpreter 中導入requests庫。以下圖中所示。導入成功以後開始正常啓動運行。
開發實例:
此次的實例是要爬取小說內容而且保存至txt文檔。
開發過程:
第一步,獲取目標數據
首先咱們定義獲取的網頁url
url = 'https://www.xs4.cc/dushizhiwozhendewudi/'
response = requests.get(url)
#目標小說主頁源碼
html = response.text
然而此時print(html)後發現以下狀況
說明此網頁的編碼方式並不是utf-8,
咱們須要在從新定義一下網頁的編碼方式:
url = 'https://www.xs4.cc/dushizhiwozhendewudi/'
response = requests.get(url)
#編碼方式
response.encoding = 'gbk'
#目標小說主頁源碼
html = response.text
print(html)
再次打印後正常:
此時,咱們就獲取了目標網頁的源碼。
第二步,分析數據加載流程
類比於人工訪問。人工訪問時,咱們首先要點擊「第一章」的連接,而後在頁面上找到章節正文,把章節正文複製粘貼到要保存的txt文檔。爬蟲的工做步驟也是相似。在咱們獲悉的html數據中,首先找到各個章節所對應的部分。點擊F12 查看網頁源碼,而且找到對應的位置,以下圖示:
找到了對應的部分,可是要怎麼提取呢。注意,咱們已經經過第一步,把當前網頁的html源碼存入 變量html中,所以,咱們須要在html中找到對應部分並把他們提取出來。
這就要用到正則表達式,經過python re庫能夠很方便實現這個功能:
首先咱們來定位咱們所須要的代碼,咱們所須要的章節信息是在這一部分中保存的。
這時就能夠肯定,我麼所須要提取的信息就在這一部分,咱們用正則表達式中提取所須要的信息
#獲取每一章節的信息
dl = re.findall(r'id="booklistBox".*?</dl>', html, re.S)
#注意:
# re.findall(r' ', 來源, 附加方法)
#re.findall() 幫助咱們識別正則表達式。
# r'' 引號內存放 查找開頭, 咱們所需保存的數據, 查找的結尾。
# 因爲咱們所須要的章節url 和章節標題不一樣,所以用 .*? 代替。
# .*? 表明的是任意內容,至關於爬蟲在查找html源碼時,識別 查找開頭,與查找結尾,把中間的東西所有保
# 存起來。
#re.S 是爲了鑑別源文件中的 ‘ ’ ‘\n’ ,這些干擾有時會影響正則表達式的鑑別,加上re.S能無視其干擾
打印dl :
接着咱們把dl 變成列表,
用一樣的方法,咱們再在 dl 中提取下一步須要的信息,即各章節的題目與url
#獲取每一章節的信息
dl = re.findall(r'id="booklistBox".*?</dl>', html, re.S)[0]
#獲取章節信息列表
chapter_info_list = re.findall(r'<a href="(.*?)" title="(.*?)">', dl)
#獲取每一章節的標題
title = re.findall(r'title="(.*?)">', dl)
#print(title)
打印title :
把title 變成列表。
對於每一個章節,我麼首先要提取其url 與 章節標題。再對應每一個章節分別下載其內容。
#循環每一個章節,分別去下載
for chapter_info in chapter_info_list:
#chapter_url, chapter_title = chapter_info
chapter_url = chapter_info[0]
chapter_title = chapter_info[1]
#下載章節內容
chapter_response = requests.get(chapter_url)
chapter_response.encoding = 'gbk'
chapter_html = chapter_response.text
#提取章節內容
chapter_content = re.findall(r'id="content">(.*?)</div>', chapter_html, re.S)[0]
————————————————
打印 chapter_content :
咱們發現下載的數據中有不少字符,好比<br/> 、 &nsbp 等這是不可避免的狀況,打印完成後,咱們就須要來清洗數據,就是把不須要的字符,用空字符代替便可。
具體須要清洗的內容須要具體分析。
清洗代碼:
#清洗數據
chapter_content = chapter_content.replace('<br/><br/>', '')
chapter_content = chapter_content.replace('<br />', '')
chapter_content = chapter_content.replace(' ', '')
#print(chapter_content)
再次打印,:
清洗數據成功!
聽起來很厲害,其實就是把數據保存下來例如保存到txt文檔。
首先咱們要建立一個文件,將內容存放進去。
利用文件存放函數,保存對應章節內容。
再次運行。
爬蟲成功。
完整代碼:
import requestsimport re url = 'https://www.xs4.cc/dushizhiwozhendewudi/'response = requests.get(url)#編碼方式response.encoding = 'gbk'#目標小說主頁源碼html = response.text#獲取每一章節的信息dl = re.findall(r'id="booklistBox".*?</dl>', html, re.S)[0]#獲取章節信息列表chapter_info_list = re.findall(r'<a href="(.*?)" title="(.*?)">', dl)#獲取每一章節的標題title = re.findall(r'title="(.*?)">', dl)[0] #print(title) #新建一個文件,保存小說內容fb = open('%s.txt' % title, 'w', encoding='utf-8') #循環每一個章節,分別去下載for chapter_info in chapter_info_list: #chapter_url, chapter_title = chapter_info chapter_url = chapter_info[0] chapter_title = chapter_info[1] #下載章節內容 chapter_response = requests.get(chapter_url) chapter_response.encoding = 'gbk' chapter_html = chapter_response.text #提取章節內容 chapter_content = re.findall(r'id="content">(.*?)</div>', chapter_html, re.S)[0] #清洗數據 chapter_content = chapter_content.replace('<br/><br/>', '') chapter_content = chapter_content.replace('<br />', '') chapter_content = chapter_content.replace(' ', '') #print(chapter_content) #數據持久化 fb.write(chapter_title) fb.write('\n') fb.write(chapter_content) fb.write('\n')#print(title)————————————————版權聲明:本文爲CSDN博主「辭樹 LingTree」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連接及本聲明。原文連接:https://blog.csdn.net/l18339702017/article/details/103726786