最簡(jiǎn)單的爬蟲案例開發(fā)
前面的學(xué)習(xí)中我們已經(jīng)簡(jiǎn)單了解了一些爬蟲所需的知識(shí),這節(jié)課我們就來(lái)做一個(gè)小爬蟲來(lái)實(shí)踐下我們前面所學(xué)習(xí)的知識(shí),這節(jié)課我們會(huì)爬取慕課網(wǎng)首頁(yè)所有的課程名稱:
1. 爬取慕課網(wǎng)首頁(yè)所有課程名稱
我們第一個(gè)爬蟲程序,是來(lái)爬取慕課網(wǎng)的首頁(yè)的所有課程信息的名字。下面的代碼鎖使用到的技術(shù)有的我們并沒有涉及到,后面的學(xué)習(xí)中我們會(huì)一一講解。這里只是讓大家對(duì)爬蟲程序有個(gè)大概的了解,熟悉最基本的爬蟲流程,以及對(duì)爬蟲處理有一個(gè)粗略的印象,同時(shí),也是激發(fā)大家學(xué)習(xí)的熱情,讓大家對(duì)爬蟲不僅停留在理論上,也可以實(shí)際操作去加深印象。
1.1 建立 imoocSpider.py 文件
爬蟲文件的命名一定要準(zhǔn)確,爬蟲爬取的是哪一個(gè)網(wǎng)站就用哪一個(gè)網(wǎng)站來(lái)進(jìn)行命名,這樣以后我們寫的爬蟲越來(lái)越多會(huì)方便管理。
文件創(chuàng)建好之后首先導(dǎo)入 requests 第三方庫(kù)和頁(yè)面解析工具 BeautifulSoup:
import requests # requests庫(kù),用來(lái)發(fā)送網(wǎng)絡(luò)請(qǐng)求
from bs4 import BeautifulSoup # 一個(gè)解析庫(kù),用來(lái)解析網(wǎng)頁(yè)結(jié)構(gòu)
Tips:BeautifulSoup 我們?cè)诤竺鏁?huì)講到,這里只是先用一下。
1.2 定義網(wǎng)址變量
定義網(wǎng)址變量 url,url 中存儲(chǔ)的是我們要爬取的網(wǎng)站,這個(gè)小爬蟲中我們要爬取的網(wǎng)站是:http://idcbgp.cn。
url = "http://idcbgp.cn" #慕課網(wǎng)首頁(yè)地址
1.3 創(chuàng)建請(qǐng)求頭部
創(chuàng)建請(qǐng)求頭部,因?yàn)榉?wù)器會(huì)分辨請(qǐng)求的是瀏覽器或者是爬蟲,如果是爬蟲的話會(huì)直接斷開請(qǐng)求,導(dǎo)致請(qǐng)求失敗。為了不讓我們的爬蟲暴露,所以要給它加上一層偽裝,這樣服務(wù)器就會(huì)認(rèn)為是瀏覽器在請(qǐng)求了:
headers = {'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36'} # 請(qǐng)求頭部
1.4 發(fā)起請(qǐng)求
使用 requests 庫(kù)中的 get 方法來(lái)進(jìn)行請(qǐng)求:
r = requests.get(url, headers= headers) # 發(fā)送請(qǐng)求
1.5 解析請(qǐng)求結(jié)果
因?yàn)檎?qǐng)求的結(jié)果是 HTML 格式的,所以我們使用 BeautifulSoup 來(lái)解析我們的請(qǐng)求結(jié)果:
bs = BeautifulSoup(r.text, "html.parser") # 解析網(wǎng)頁(yè)
在返回的請(qǐng)求結(jié)果中,我們想要的數(shù)據(jù)都是在 h3
標(biāo)簽中包裹著,所以我們使用 BeautifulSoup 查找返回結(jié)果中所有的 h3
標(biāo)簽并剝離,存儲(chǔ)在變量 mooc_classes 中。
mooc_classes = bs.find_all("h3", class_="course-card-name") # 定位課程信息
1.6 解析數(shù)據(jù)
將每一個(gè) h3
標(biāo)簽中的課程名稱剝離,并存儲(chǔ)在 class_list
這個(gè)列表中去,最后將課程信息存入到文本文件中:
class_list = []
for i in range(len(mooc_classes)):
title = mooc_classes[i].text.strip()
class_list.append("課程名稱 : {} \n".format(title)) #格式化課程信息
with open('mooc_classes.txt', "a+") as f: # 將課程信息寫入文本文件中
for text in class_list:
f.write(text)
1.7 最終代碼
下面就是我們這個(gè)小爬蟲的最終代碼:
import requests # requests庫(kù),用來(lái)發(fā)送網(wǎng)絡(luò)請(qǐng)求
from bs4 import BeautifulSoup # 這是一個(gè)解析庫(kù),用來(lái)解析網(wǎng)頁(yè)
url = "http://idcbgp.cn" #慕課網(wǎng)首頁(yè)地址
headers = {'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36'} # 請(qǐng)求頭部
r = requests.get(url, headers= headers) # 發(fā)送請(qǐng)求
bs = BeautifulSoup(r.text, "html.parser") # 解析網(wǎng)頁(yè)
mooc_classes = bs.find_all("h3", class_="course-card-name") # 定位課程信息
class_list = []
for i in range(len(mooc_classes)):
title = mooc_classes[i].text.strip()
class_list.append("課程名稱 : {} \n".format(title)) #格式化課程信息
with open('mooc_classes.txt', "a+") as f: # 將課程信息寫入文本文件中
for text in class_list:
f.write(text)
上面的程序,就是一個(gè)最簡(jiǎn)單的一個(gè)爬蟲程序。最后,我們格式化輸出的樣式,使得輸出格式為 課程名稱+慕課網(wǎng)課程名稱的樣式,最后把結(jié)果保存到一個(gè) TXT 文件里面。最后我們打開 TXT 文件看一下效果:
如下圖所示:
Tips:一般在正式的爬蟲開發(fā)中我們不會(huì)把數(shù)據(jù)存儲(chǔ)到文件中去,而是會(huì)存儲(chǔ)到數(shù)據(jù)庫(kù)中,這樣才能最大限度的保證數(shù)據(jù)不會(huì)丟失。
2. 小結(jié)
本小節(jié),通過(guò)運(yùn)用 BeautifulSoup 以及 Requests 實(shí)現(xiàn)了一個(gè)最簡(jiǎn)單的爬蟲程序,關(guān)于它們的學(xué)習(xí),我們會(huì)在后面的章節(jié)進(jìn)行詳細(xì)論述。這個(gè)小程序,只是向大家演示一個(gè)最基本的爬蟲的工作流程。細(xì)心的同學(xué)肯定會(huì)發(fā)現(xiàn),我們的代碼量并不是很多,就輕松實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的爬取工作。其實(shí),正式因?yàn)槭褂肞ython 編寫爬蟲程序的簡(jiǎn)單方便,才使得 Python 語(yǔ)言成為了寫爬蟲程序的首選。