徐安西
【摘要】教育大數(shù)據(jù)背景下,數(shù)據(jù)采集是教學(xué)資源庫建設(shè)、網(wǎng)絡(luò)信息管理、教學(xué)研究的前提。利用網(wǎng)絡(luò)爬蟲,采集網(wǎng)頁表層數(shù)據(jù),可以充分發(fā)揮大數(shù)據(jù)無處不在的“第三只眼”作用。本案例從網(wǎng)絡(luò)爬蟲原理開始,探析其技術(shù)架構(gòu),以實(shí)例引領(lǐng)學(xué)生探索網(wǎng)絡(luò)爬蟲數(shù)據(jù)采集的魅力。
【關(guān)鍵詞】教育大數(shù)據(jù);數(shù)據(jù)采集python 爬蟲
一、設(shè)計(jì)思想
本節(jié)課是廣東教育出版社2019版《普通高中信息技術(shù)必修1:數(shù)據(jù)與計(jì)算》第5.2.1小節(jié)“數(shù)據(jù)采集的方法和工具”中部分內(nèi)容[1],網(wǎng)頁數(shù)據(jù)采集是大數(shù)據(jù)時代數(shù)據(jù)采集技術(shù)之一,也是教育大數(shù)據(jù)研究與實(shí)踐的重要數(shù)據(jù)來源之一。網(wǎng)絡(luò)爬蟲程序是在第4章Python程序設(shè)計(jì)的基礎(chǔ)上,結(jié)合HTML網(wǎng)頁制作知識,進(jìn)行網(wǎng)頁文本信息采集。因此,該部分教學(xué)內(nèi)容涉及到的基礎(chǔ)知識多,實(shí)踐應(yīng)用形式豐富。
在實(shí)際教學(xué)中分為三大部分,第一程序展示,以爬蟲的信息采集為切入點(diǎn),激發(fā)學(xué)生的學(xué)習(xí)興趣。第二部分,模塊介紹與Python爬蟲程序的結(jié)構(gòu)。第三部分提煉爬蟲原理。在教學(xué)過程中結(jié)合任務(wù)驅(qū)動,程序語法用以點(diǎn)代面的方法,例如在soup.find語法中只圍繞解決實(shí)際問題的知識點(diǎn)進(jìn)行探究,而不是面面俱到。程序架構(gòu)上讓學(xué)生通過觀察、提煉出程序的架構(gòu)。通過實(shí)際的操作提煉出爬蟲的概念。
二、學(xué)情分析
本節(jié)課的教學(xué)對象是高一年級的學(xué)生,通過初中的信息技術(shù)課學(xué)生已經(jīng)掌握了簡單的網(wǎng)頁制作與HTML語言,知道網(wǎng)頁內(nèi)容版塊與HTML標(biāo)記間的關(guān)系;熟練掌握了Python語言的三種流程結(jié)構(gòu),可以進(jìn)行基本程序邏輯的架構(gòu);了解了模塊的作用,使用模塊思想組織程序代碼。
三、教學(xué)目標(biāo)
知識與技能目標(biāo)
了解requests模塊、BeautfiulSoup模塊的作用;學(xué)會requests模塊、BeautfiulSoup模塊最基本的語法;掌握爬蟲原理。
過程與方法
本節(jié)課通過展示爬蟲應(yīng)用,激發(fā)學(xué)習(xí)興趣;展示網(wǎng)絡(luò)爬蟲原理圖,逐步編寫代碼;通過實(shí)例探究采集網(wǎng)頁中的文字信息。
情感態(tài)度與價值觀
引導(dǎo)學(xué)生了合法使用爬蟲程序:指導(dǎo)學(xué)生采集網(wǎng)絡(luò)表層數(shù)據(jù),進(jìn)行學(xué)習(xí)、研究;不采集電話號碼、Email等個人信息,不進(jìn)行數(shù)據(jù)跟蹤“深扒”個人隱私;不在短時間內(nèi),對同一個網(wǎng)站發(fā)出網(wǎng)絡(luò)爬蟲下載請求,造成網(wǎng)絡(luò)蠻力攻擊。
四、教學(xué)重難點(diǎn)
1.教學(xué)重點(diǎn)
(1)網(wǎng)絡(luò)爬蟲原理與結(jié)構(gòu);
(2)requests網(wǎng)頁模塊與循環(huán)不間斷下載;
(3)BeautfiulSoup網(wǎng)頁解析模塊的基本功能與用法;
2.教學(xué)難點(diǎn)
根據(jù)爬蟲實(shí)際應(yīng)用,結(jié)合不同參數(shù),合理使用BeautfiulSoup模塊中find方法,發(fā)現(xiàn)有用信息。
五、教學(xué)準(zhǔn)備
1.準(zhǔn)備爬蟲圖。
2.實(shí)驗(yàn)環(huán)境:需要在Python中提前安裝requests、bs4模塊;
3.爬蟲編程參考手冊;
4.爬蟲各模塊示例代碼;
5.目標(biāo)網(wǎng)站。
六、教學(xué)過程
1.導(dǎo)入:演示程序,激發(fā)興趣
師:班級正在開展“閱讀經(jīng)典”的這個活動,請你到“古詩文網(wǎng)”去下載《孟子》《史記》等全文。下載的格式保存成txt格式,分發(fā)給大家,以方便大家離線閱讀。請大家嘗試完成任務(wù)。
學(xué)生:打開網(wǎng)站,有的同學(xué)在找有沒有提供txt直接下載的鏈接,有的同學(xué)在一頁一頁打開、選擇、復(fù)制。
師:這個網(wǎng)站沒有提供txt直接下載,而且孟子的章節(jié)很多,如果一頁一頁的去打開復(fù)制,這個任務(wù)很繁重。我們正在學(xué)習(xí)Python,老師編寫了一個程序來,大家一起來看一看效果?(程序省略)
【設(shè)計(jì)意圖】
通過實(shí)際問題讓同學(xué)們意識到以前的方法已經(jīng)不能有效的解決問題,有必要尋求新的方法。教師演示程序,通過效率的對比,激發(fā)了同學(xué)學(xué)習(xí)欲望。
2.探究:模塊功能
師:Python是一個功能非常強(qiáng)大的語言,它的強(qiáng)大之處就在于提供了非常多的模塊,用python編程來解決實(shí)際問題,在明確需求后,首要的任務(wù)就是找模塊。針對這個任務(wù)我們要選擇哪些模塊呢?對于模塊選擇問題,我們先回過頭看一看,我們用人工采集的方法中做了哪些事情,什么事情是你希望用程序?qū)崿F(xiàn)的?
學(xué)生:思考并梳理人工采集的步驟。
師、生:一起分享探討,整個過程就干了兩件事:
(1)打開網(wǎng)頁,根據(jù)以前所學(xué)的知識,就是客戶端瀏覽器向服務(wù)器發(fā)出一個request請求,Web服務(wù)器把請求結(jié)果以HTML源碼的形式返回;
(2)讓計(jì)算機(jī)自動在網(wǎng)頁上“找”到所需的內(nèi)容。
總結(jié):所以Python爬蟲就要能自動完成這2件事的功能:
(1)自動向服務(wù)器發(fā)出request請求,下載并存儲HTML源碼;
(2)源碼中“找”到相應(yīng)的文本信息。
【設(shè)計(jì)意圖】
通過梳理人工采集的步驟,讓學(xué)生了解所選的python模塊應(yīng)具有什么功能。每個功能模塊在程序中承當(dāng)?shù)慕巧_@也為學(xué)生自己探索開發(fā)新程序提供一般性的思路。
3.探究:模塊使用
(1)網(wǎng)頁下載模塊
師:對于第一個功能,我們稱為網(wǎng)頁下載模塊,通過了解,在Python中比較出名是urllib、requests等模塊可以實(shí)現(xiàn)此功能,我們這里選擇了requests模塊。
學(xué)生:觀察打印res.text的結(jié)果,發(fā)現(xiàn)要查找的內(nèi)容就包含在HTML源代碼中。更換URL地址,查看被訪問網(wǎng)頁的HTML代碼與res.text內(nèi)容是否一致。
(2)網(wǎng)頁解析模塊
師:下面我們討論網(wǎng)能實(shí)現(xiàn)網(wǎng)頁內(nèi)文本信息“找”這個功能。我們稱為頁解析模塊,
這里引入一個叫BeautifulSoup模塊。
實(shí)例化一個BeauifulSoup對象,取名soup,實(shí)例化時有2個參數(shù),第一參數(shù)是要分析的文本,由于我們要找的內(nèi)容就在res.text里,所以填入res.text,第二參數(shù)是分析的標(biāo)準(zhǔn),html.parser是html語法分析器,也是默認(rèn)的分析標(biāo)準(zhǔn)。
(3)提出問題,共同探究
師:提問soup會通過什么方式來查找到信息的?
①大家看孟子第一節(jié)的HTML源代碼,要找的內(nèi)容是包含在哪個標(biāo)記中的?
②對于不同結(jié)構(gòu)的網(wǎng)頁,是否有同樣的規(guī)律?
學(xué)生:查看HTML源代碼,找出信息所在的標(biāo)記。更換URL,再次檢查包含文本信息的HTML標(biāo)記
(4)探索功能豐富的soup.find(‘p’)
師:大家發(fā)現(xiàn),我們所招的內(nèi)容是包含在<p>標(biāo)記中,具體進(jìn)行試驗(yàn)來驗(yàn)證。
學(xué)生:通過打印,我們發(fā)現(xiàn)r里面存儲還是一段HTML代碼,參考學(xué)習(xí)手冊,探索r與r.text的作用,r.text取出不帶標(biāo)記的文本內(nèi)容,就相當(dāng)于這段HTML代碼在網(wǎng)頁中呈現(xiàn)的效果。
(5)問題再現(xiàn):如何找到所有需要的文本信息?
師:通過觀察,這并不是我們要找的內(nèi)容,因?yàn)閒ind只是返回的第一個查找到的結(jié)果。我們看HTML 源代碼,原來在這之段內(nèi)容之前還有其它的<p>標(biāo)記。即使沒有“作者:佚名”這一段,我們要找的內(nèi)容包含在2個<p>標(biāo)記里面,find只是找到第一個<p>,那第二個<p>怎么解決?有沒有簡單的方法?
學(xué)生:通過不同類型網(wǎng)頁試驗(yàn)、比較,發(fā)現(xiàn)要找的內(nèi)容不僅包含在2個<p>標(biāo)記中,也包含在<div>標(biāo)記中。
(6)深究細(xì)節(jié),解決問題
師:我們把r=soup.find(‘p’)改成r=soup.find(‘div’),通過打印,結(jié)果找到的還是其它內(nèi)容,問題出在什么地方?
學(xué)生活動:跟<p>標(biāo)記問題一樣,HTML源代碼中不止一個<div>標(biāo)記。
師:為了區(qū)別這些<div>標(biāo)記,我們應(yīng)該給與更多的信息。大家有沒有發(fā)現(xiàn),我們要找的div標(biāo)記跟其它的div標(biāo)記有什么不同?
學(xué)生:發(fā)現(xiàn)<div>標(biāo)記的class屬性值不同。
師:所以我們要告訴程序,你不僅是要找div標(biāo)記,而且要找class屬性值是‘contson’的div標(biāo)記,請參考手冊,改寫程序。
學(xué)生活動:改寫程序,并打印驗(yàn)證結(jié)果。
【設(shè)計(jì)意圖】
對于requests模塊和BeautifulSoup模塊的使用,這里采用的是嘗試法。通過不斷的嘗試修改代碼,發(fā)現(xiàn)問題,再修改,再嘗試。
4.深挖:爬蟲的原理
師:通過上面的代碼,我們已經(jīng)可以找到第一節(jié)的內(nèi)容,如何得到第二、三節(jié)的內(nèi)容?
學(xué)生:嘗試修改上面的代碼,得到正確的結(jié)果。
師:在解決第二、三節(jié)問題時,大家思考,修改了哪些代碼,哪些代碼是不需要修改的?
學(xué)生:我們只要修改url的值,而其它的代碼不需要修改:
師:
res=requests.get(url)
…
print(r.text)
上面這段代碼無論在哪個章節(jié)都不需要修改,如果把這段代碼抽象成一個功能,那就是“訪問一張網(wǎng)頁,找、寫”?;氐阶畛醯膯栴},怎樣得到全部的章節(jié)?
學(xué)生:討論解決方法。
如果要實(shí)現(xiàn)全部章節(jié)的下載,只要不斷的更改url的值。而“訪問一張網(wǎng)頁,找、寫”這段代碼都是重復(fù)不變的。
師:我們用什么結(jié)構(gòu)來處理這些重復(fù)的事情呢,請畫出流程示意圖。
學(xué)生活動:畫出流程示意圖。
師:根據(jù)流程示意圖,打開2.py,補(bǔ)充編寫代碼:
學(xué)生:寫出while模塊的結(jié)構(gòu)。
師:很多同學(xué)被卡在怎樣得到下一頁的網(wǎng)址url上,請大家手工瀏覽網(wǎng)頁,我們怎樣到下一章去,是不是點(diǎn)擊“下一章”按鈕。說明下一章的網(wǎng)址就包含在這個超鏈接之中,請大家查看HTML源代碼,如何在這個超鏈接中提取下一章的網(wǎng)址呢?
學(xué)生活動:查看HTML源代碼,發(fā)現(xiàn)下一章的網(wǎng)址存在于<a>這個標(biāo)記中。
師:我們查看每個網(wǎng)址,就是兩個部分組成:
url=“https://so.gushiwen.org”+“/guwen/bookv_1127.aspx”
第一部分是固定的,而第二部分就是存在“下一章”這個超鏈接標(biāo)記的‘href’屬性中,所以我們只要找到每張網(wǎng)頁中指向“下一章”的超鏈接<a>標(biāo)記就可以了,我們把找的結(jié)果存在link這個變量里,我們寫這樣一段代碼可不可以:
link=soup.find(‘a(chǎn)’)
學(xué)生:思考不可以的原因,并修改代碼。
師:得到了正確的url,如果我們到了最后一章怎么辦?請完善代碼。
學(xué)生:完善代碼,測試,找出問題,再測試。
師生:共同完善代碼。
師:我們這段程序自動訪問一個url,抓取數(shù)據(jù)后,再自動的訪問下一個url,不斷循環(huán)重復(fù)。我們把具有這種功能的程序稱為蜘蛛或爬蟲程序。教師展示原理示意圖。
【設(shè)計(jì)意圖】
對于下載所有章節(jié)問題,讓學(xué)生在做中發(fā)現(xiàn)哪些代碼是“變”的,哪些是“不變”的。哪些是需要重復(fù)的,自然而然的讓學(xué)生運(yùn)用已學(xué)的循環(huán)結(jié)構(gòu)來處理問題,提高學(xué)生自我分析解決問題的能力。
5.自我創(chuàng)新、思考:
(1)現(xiàn)在網(wǎng)址是手工輸入的,很繁瑣。如何讓爬蟲自己從特定的文件或數(shù)據(jù)庫自動更多的URL地址?
(2)如果想讓爬蟲只抓取特定文本信息的網(wǎng)頁,如何修改代碼呢?
七、教學(xué)反思
1.程序教學(xué)中,對一些語法、模塊的用法采用以點(diǎn)代面的方式進(jìn)行教學(xué)。即以一個小點(diǎn)為切入口,讓學(xué)生去嘗試,不需要面面俱到。
2.程序教學(xué)中另一個難點(diǎn)就是程序流程結(jié)構(gòu),很多學(xué)生能讀懂代碼,但是在解決實(shí)際問題時又不知道如何下手??梢栽诮虒W(xué)中經(jīng)常讓學(xué)生自己去思考得出程序流程結(jié)構(gòu),而不是僅僅關(guān)注具體的語法。
參考文獻(xiàn):
[1]高中信息技術(shù)必修1:數(shù)據(jù)與計(jì)算廣東教育出版社2019
(南京師范大學(xué)附屬中學(xué)江蘇南京 210003)