(起什么優(yōu)雅的名字點(diǎn)擊量會增多?)
崇尚的學(xué)習(xí)思維是:輸入,輸出平衡,且平衡點(diǎn)不斷攀升。
曾經(jīng)有大神告誡說:沒事別瞎寫文章;所以,很認(rèn)真的寫的是能力范圍內(nèi)的,看客要是看不懂,不是你的問題,問題在我,得持續(xù)輸入,再輸出。
今天的主題是:實(shí)戰(zhàn)爬取. (涉及python文件操作,requests,BeautifulSoup,結(jié)構(gòu)化數(shù)據(jù))
1:框架
| 序號 | 內(nèi)容 | 解釋 |
|---|---|---|
| 01 | 內(nèi)容介紹 | -- |
| 02 | 分解如何操作 | -- |
| 03 | 參考及介紹 | -- |
2:內(nèi)容介紹
目標(biāo)
抓取目標(biāo)網(wǎng)站的全部博文:
01: 博文的鏈接
02: 博文的標(biāo)題
03: 博文的摘要由來
url = http://xlzd.me/
昨天在學(xué)習(xí)基于github搭建博客的時候,無意間查看到這個人的博客,里面也有好些python和爬蟲知識。xlzd雜談
進(jìn)一步發(fā)現(xiàn)是個羅粉。
你懂的。
- 時間花銷
一般寫一篇專欄,需要花費(fèi)80min,今天又是放假時間,所以效率不高,光從零開始寫代碼就花了60min。水平還是不夠。
原則上,基本的爬蟲知識已經(jīng)快屬于我的舒適區(qū)。最近持續(xù)的專欄寫作,一系列的總結(jié),意味著,寫出的多,輸入的少,甚至寫完這個系列,會寫不出像樣的其他專欄...
但我的理念是:持續(xù)精進(jìn)。
所以,會盡快寫完這個系列,進(jìn)行輸入數(shù)據(jù)科學(xué)知識。
3:步驟分解
先總結(jié)下爬蟲的大概步驟是什么:
- 獲取url : 不管是自己構(gòu)造的符合要求的url還是抓取的url.
- 下載網(wǎng)頁源代碼:requests 或者 urllib模塊
- 對網(wǎng)頁源代碼進(jìn)行解析:re, BeautifulSoup系列,xpath系列等
- 結(jié)構(gòu)化數(shù)據(jù),存儲:本地,數(shù)據(jù)等
- 原始:url
http://xlzd.me/
查看網(wǎng)頁翻頁:

網(wǎng)頁源代碼:

得出網(wǎng)頁的組成特征:給出兩種自己構(gòu)造url的方法
# 方法1:
def search_url_one(self):
self.all_url = ["http://xlzd.me/page/{}/".format(i) for i in range(1, 8)]
return self.all_url
pass
# 方法2:
def search_url_two(self):
for one in range(1, 8):
url = "http://xlzd.me/page/" + str(one) + '/'
self.all_url.append(url)
return self.all_url
當(dāng)然也可以自己在網(wǎng)頁中匹配,每抓取一頁,把下一頁的url抓取出來,總共7頁,抓最后一頁進(jìn)行判斷,說明這是最后一頁。
- 對第一頁分析抓取的目標(biāo):
文章的url
文章的標(biāo)題
文章的摘要
網(wǎng)頁源代碼顯示:

all_title = Soup.find_all(class_="post-title")
all_abstract = Soup.find_all(class_="post-content")
# 上面已經(jīng)把所需要的目標(biāo)都容納下來了。
# 具體的url 和標(biāo)題 的匹配規(guī)則是:
for one_title in all_title:
one_title.a.get('href')) # 獲取 一個url
one_title.get_text() # 獲取 一個title
# 具體的摘要匹配規(guī)則是:
for one_abstract in all_abstract:
one_abstract.get_text() #獲取一個abstract
具體方法參考BeautifulSoup文檔
大概的任務(wù)已經(jīng)完成了。
一頁中有8篇文章,一共有7頁。
循環(huán)操作就可以實(shí)現(xiàn)抓取任務(wù)了。
- 寫入文本操作
具體要求是每篇文章的url,title,abstract 寫入一個文本中。
剛開始我的想法是把title當(dāng)做 文本的名稱:
如下顯示:

全部抓取的時候發(fā)現(xiàn)有些標(biāo)題不規(guī)則會出錯。所以進(jìn)行了簡化操作。
第一篇:1.txt
依次類推到最后一篇。

# 文本寫入總會出現(xiàn)編碼問題,注意下。
def save(self, passage):
global name
for one in range(len(passage)):
with codecs.open("Blog\\" + str(name) + ".txt", 'wb', encoding='utf-8') as f:
f.write(passage[one]["url"])
f.write("\n")
f.write(passage[one]["title"])
f.write("\n")
f.write(passage[one]["abstract"])
f.write("\n")
name +=1
具體一篇的顯示如下:

結(jié)果:7頁網(wǎng)頁,1頁8篇文章,最后一頁只有1篇文章。

全部抓取完成。
獲取到的全部文章的url還可以進(jìn)行分析,比如如何把每篇文章的內(nèi)容都抓取下來。
代碼還可以進(jìn)行重構(gòu)。
你懂的。
4:參考及總結(jié)
大致流程走下來。爬蟲的整體思路應(yīng)該明朗了。
完整代碼:完整代碼
關(guān)于本人:
國內(nèi)小碩,半路出家的IT學(xué)習(xí)者。
興趣領(lǐng)域:爬蟲 , 數(shù)據(jù)科學(xué)
本人正在構(gòu)建一個共同成長爬蟲小型社群。有興趣私信
答疑及分享。