Python爬蟲入門——第一個爬蟲實例

目錄

開發爬蟲的步驟:

實例開發與踩坑總結

踩坑總結:

開發實例:

開發過程:

第一步,獲取目標數據

第二步,分析數據加載流程

第三步、下載數據

第四步、清洗數據

第五步、數據持久化


寫在最前:      

 特別鳴謝 全書網 給了爬蟲少年一個入門的機會,練習的時候,爬了好幾個網站,都在中間被封了,導致中途代碼報廢,只能重新找網站重構代碼從頭做起。

       感謝B站UP主 python學習者 的教學視頻。本文就是在他的視頻指導下完成的

淺淡爬蟲:

       這次學習爬蟲,個人認爲,爬蟲的過程像是我們通過手動訪問網頁,找到我們所需要的數據,然後在把數據下載並保存下來。當我們需要訪問的網頁過多,需要下載的數據過多時,手動逐章進行無疑是一件冗長繁瑣的事情。爬蟲的優勢便體現了出來,它可以自動將網頁上我們所需要的信息提取並保存下來,逐個訪問頁面上需要訪問的鏈接,進入,下載並保存信息。爬蟲的工作流程便類似手動逐個點擊訪問,瞭解了它的工作原理,再結合代碼示例就有了更深層次的認識。

 

開發爬蟲的步驟:

-目標數據
    -網站
    -頁面
-分析數據加載流程
    -分析目標數據所對應的url
-下載數據
-清洗,處理數據
-數據持久化

 

實例開發與踩坑總結

踩坑總結:

         IDE : Pycharm

         需要安裝requests庫。 解決方法: win+r 輸入 cmd。在命令行輸入 : pip install requests。

         導入Pycharm(!坑)。之前安裝好了requests庫,但是在Pycharm中依舊無法運行,報錯顯示沒有requests庫。

         解決方法:可能是沒有導入該庫。在File - Setting - Project Interpreter 中導入requests庫。如下圖中所示。導入成功之後開始正常啓動運行。

開發實例:

 這次的實例是要爬取小說內容並且保存至txt文檔。

網址:https://www.xs4.cc/dushizhiwozhendewudi/

 

開發過程:

第一步,獲取目標數據

首先我們定義獲取的網頁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 id="booklistBox">
    ***
</dl>

這時就可以確定,我麼所需要提取的信息就在這一部分,我們用正則表達式中提取所需要的信息

#獲取每一章節的信息
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('&nbsp;', '')
    #print(chapter_content)

再次打印,:

清洗數據成功!

第五步、數據持久化

聽起來很厲害,其實就是把數據保存下來例如保存到txt文檔。

首先我們要創建一個文件,將內容存放進去。

#新建一個文件,保存小說內容
fb = open('%s.txt' % title, 'w', encoding='utf-8')

利用文件存放函數,保存對應章節內容。

#數據持久化
    fb.write(chapter_title)
    fb.write('\n')
    fb.write(chapter_content)
    fb.write('\n')

再次運行。

爬蟲成功。

 

 

完整代碼:

import requests
import 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('&nbsp;', '')
    #print(chapter_content)
    #數據持久化
    fb.write(chapter_title)
    fb.write('\n')
    fb.write(chapter_content)
    fb.write('\n')
#print(title)

 

發佈了424 篇原創文章 · 獲贊 102 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章