python爬取個人博客園博客列表

前言
昨天和幾個小伙伴小聚了一下,但是由于我的失誤,導致諸事不順
出門忘看老黃歷了
(逛公園,到門口閉園了;往回走,公交站不好找,走了好多冤枉路),然后手機沒電了,地鐵還停了,回到家也已經(jīng)不早了,所以昨天就放鴿子了,但是今天呢,不能再繼續(xù)鴿了,然后我就打算分享一些比較輕松的內(nèi)容,于是就有了今天的內(nèi)容。
安裝配置python
這里我們簡單介紹下python的安裝配置,原本是不打算講的,但是我看了下,之前我好像也沒有分享過,所以這里就簡單說下,也是幫助那些沒有python基礎的小伙伴,能夠盡快上手。
下載安裝
安裝版本這里推薦3.0及以上,我這里安裝的是3.9,2.7雖然也可以,但是不推薦,官方推薦的也是3.0版本。這兩種版本在很多函數(shù)和寫法上并不通用,所以代碼也不通用,有興趣的小伙伴可以看下區(qū)別,這里我不打算展開分享。
安裝方式有很多,用win10的小伙伴可以直接在應用商店搜索安裝,但這里并不推薦這種方式,因為這種方式不好找python安裝路徑,特別是對windows平臺不是特別熟悉的小伙伴:

另外一種安裝方式就是官網(wǎng)下載,然后安裝:

官方最新版本是3.10,如果覺得官方網(wǎng)站下載慢的話,可以去華為鏡像站下載,選擇對應的版本即可(華為好像沒有3.10版本的):
https://repo.huaweicloud.com/python/
安裝過程很簡單,這里就不講了,雙擊exe,然后一直下一步就好了。
配置
安裝完成后,我們需要對python設置一些環(huán)境變量。首先,打開python安裝路徑,如果不知道可以搜下python,然后打開文件路徑即可:

打開之后其實還不是安裝位置,還需要再次右鍵打開安裝路徑:

然后才是真正的安裝路徑(我這里就是在應用市場下載的,看這路徑是不是不好找):

然后打開環(huán)境變量設置,添加兩個環(huán)境變量設置:
#?安裝目錄,也就是python.exe所在路徑
C:\Users\syske\AppData\Local\Programs\Python\Python39?
#?安裝目錄下scripts路徑,這個目錄下存放了pip等管理工具
C:\Users\syske\AppData\Local\Programs\Python\Python39\Scripts
這里需要注意的是,環(huán)境變量要設置在系統(tǒng)變量的path下面,否則如果是用戶變量則無法被識別(也可能是我操作方式不對,但是系統(tǒng)變量肯定是可以的):

驗證
安裝完成后,重新打開一個新的cmd窗口,輸入python命令,如果顯示如下在,則表明已經(jīng)安裝配置完成,否則配置有問題:

然后再執(zhí)行了經(jīng)典的hello world試下:

當然,還需要測試下pip是否配置ok,這個工具是用了管理python的依賴庫的:

至此,python環(huán)境搭建完成。
爬取博客列表
準備工作
這里主要是安裝我們爬蟲要依賴的第三方依賴庫。
安裝requests庫,這個庫的作用是向我們的目標地址發(fā)送請求,并拿到響應內(nèi)容,比如html內(nèi)容
?pip?install?requests
安裝beautifulsoup4庫,這個庫的作用就是解析響應的html內(nèi)容。目前我也僅用它來解析html內(nèi)容,所以其他內(nèi)容暫時未知
pip?install?beautifulsoup4
安裝lxml庫,這個庫是bs4庫(也就是我們的soup庫要依賴的)
pip?install?lxml
如果沒有這個庫,在解析html的時候會報如下錯誤

最終完成效果
簡單來說,就是我們想通過這個爬蟲,拿到我的個人博客的所有列表,包括標題和鏈接地址,這里我是直接生成了一個markdown文檔,所以鏈接的效果就是markdown的可點擊鏈接,最終的效果
如下:

頁面源碼
首先我們要先分析要抓取的頁面html,確定具體解析方案:

從頁面源碼可以看出來,我們其實只需要拿到class為postTitle的div,然后解析其中的文字內(nèi)容及a標簽的url即可,所以下面的實現(xiàn)就是基于這個思路展開的。
實現(xiàn)過程
下面我們看下具體的爬取代碼。其實整個代碼確實很簡單,當然這也是很多人喜歡用python寫腳本的原因,簡簡單單幾行代碼,就可以實現(xiàn)其他語言整個項目的功能(比如java,當然性能上python沒有任何優(yōu)勢),真的是生產(chǎn)力提升利器。
這里最核心的一句代碼是:
for?tag?in?soup.find_all('div',?class_='postTitle'):
再精簡一下是:
soup.find_all('div',?class_='postTitle')
也就是soup的find_all,從soup的文檔中,我們可以得知,通過這個方法我們可以拿到soup下的相關(guān)tag對象。這個方法有四個參數(shù):
name參數(shù)可以查找所有名字為name的tag,字符串對象會被自動忽略掉。例如:soup.find_all('div'attrs:可以通過屬性搜索,例如:soup.find_all('div', class_='postTitle')recursive:這個暫時沒用到,還沒研究string:沒研究keywords:包括關(guān)鍵字的內(nèi)容,也沒研究
關(guān)于soup可以小伙伴可以去詳細看下文檔,我也沒有搞得特別清楚,所以暫時就先不說了。
然后下面就是完整的實現(xiàn)過程了:
#?引入?requests庫
import?requests;
#?從bs4庫中引入BeautifulSoup
from?bs4?import?BeautifulSoup;
#?引入正則表達式依賴
import?re;
#?引入文件相關(guān)依賴
import?os;
#?全局變量,主要是為了生成序號,方法內(nèi)部最后一個賦值很重要,沒有這個賦值,會導致序號不連續(xù)
global?index;
#?定義了一個方法,這個方法就是為了循環(huán)遍歷我的博客,文件就是我們要保存的文件
def?get_blog_list(page,?index,?file):
??#?通過requests發(fā)送請求,這里用到了字符串的格式化
??r?=?requests.get('https://www.cnblogs.com/caoleiCoding/default.html?page={}'.format(page));
??#?打印返回結(jié)果
??print(r.text);
??#?用soup庫解析html,如果沒有安裝lxml庫,會報錯
??soup?=?BeautifulSoup(r.text,'lxml');
??
??#?搜索class屬性為postTitle的div
??for?tag?in?soup.find_all('div',?class_='postTitle'):
????print(tag);
????#?tag的span標簽的內(nèi)容
????content?=?tag.span.contents;
????#?過濾掉置頂內(nèi)容,這塊的結(jié)構(gòu)和其他內(nèi)容不一樣,匹配需要寫正則,太復雜,所以先忽略掉
????if?index?==?0?and?page?==?1:
??????index?+=?1;
??????continue;
????print(content)
????#?獲取span的內(nèi)容,也就是文本內(nèi)容
????title?=?next(tag.span.children)
????print(str(title));
????#?替換其中的換行符和空格
????title?=?title.replace('\n',?'').strip();
????print(title);
????#?獲取tag下的a標簽的href,也就是我們的博客地址
????url?=?tag.a['href']
????print(tag.a['href']);
????#?通過字符串格式化寫入解析的內(nèi)容
????file.write('{}.?[{}]({})\n'.format(index,?title,?url));
????#?序號自增
????index?+=?1;
????#?給全局變量賦值
????inedx?=?index;
????
if?__name__?==?"__main__":
??#?初始化全局變量
??index?=?0;
??#?定義我們的markdwon文件,模式為寫,如果沒有的話,會新增
??file?=?open('syske-blog-list.md',?'w')
??#?我現(xiàn)在的包括是60頁,這里是循環(huán)獲取
??for?page?in?range(59):
????get_blog_list(page?+?1,?index,?file);
總結(jié)
今天我們就是對python腳本爬蟲的一次簡單應用演示,當然也希望能通過這個示例激發(fā)各位小伙伴學習python的興趣,畢竟它也算是一個比較高效的生產(chǎn)力工具,如果學的好了,你可以用它來處理日常工作中的各類問題,包括數(shù)據(jù)統(tǒng)計、數(shù)據(jù)處理、批量業(yè)務處理,還有像今天這樣簡單抓取數(shù)據(jù),當然,你如果學的好了,你可以用它做任何事,搶票呀、下載短視頻,甚至是爬取小電影、小姐姐圖片等。
好了,今天的內(nèi)容就到這里吧,再晚點今天就發(fā)不出去了,各位小伙伴,晚安吧!
- END -