2022软工K班个人编程任务
一、PSP表格
| 計劃 | 10 | 10 |
| 估計這個任務(wù)需要多少時間 | 5 | 6 |
| 開發(fā) | 720 | 900 |
| 需求分析 | 600 | 720 |
| 生成設(shè)計文檔 | 20 | 30 |
| 設(shè)計復(fù)審 | 5 | 4 |
| 代碼規(guī)范 | 2 | 2 |
| 具體設(shè)計 | 60 | 180 |
| 具體編碼 | 360 | 280 |
| 代碼復(fù)審 | 60 | 30 |
| 測試 | 30 | 180 |
| 報告 | 120 | 110 |
| 測試報告 | 0 | 0 |
| 計算工作量 | 20 | 30 |
| 事后總結(jié) | 30 | 60 |
| 合計 | 2012 | 2542 |
二、任務(wù)要求的實現(xiàn)
1.項目設(shè)計與技術(shù)棧
這一次任務(wù)被我拆分成了6個環(huán)節(jié),分別是: 1.從零學(xué)習(xí)python與爬蟲 2.通過爬蟲獲取要爬取的所有頁面的url 3.通過爬蟲爬取目的文本 4.對目的文本的處理,提取疫情數(shù)據(jù) 5.每日熱點的實現(xiàn) 6.數(shù)據(jù)的可視化處理完成各個環(huán)節(jié)的方法: 123.通過上網(wǎng)查詢相關(guān)書籍、代碼、視頻學(xué)習(xí)爬蟲 4.學(xué)習(xí)python處理爬到的文本,用到了beautifulsoup和正則表達(dá)式 5.根據(jù)所得數(shù)據(jù)分析,結(jié)合實際自主設(shè)計實現(xiàn)每日熱點 6.學(xué)習(xí)使用excel等工具構(gòu)建數(shù)據(jù)可視化動態(tài)展示 技術(shù)棧:JavaScript+Python+Excel+Pycharts2.爬蟲與數(shù)據(jù)處理
本次在爬蟲上我所用的時間最長,遇到的主要問題是:所爬網(wǎng)站存在反爬機制,對于我這個之前從沒用過爬蟲的小萌新來說是個不小的挑戰(zhàn)。
爬蟲的實現(xiàn):
因為反爬機制,用request指令經(jīng)常爬不到正常的網(wǎng)頁信息,返回412和爬到一堆亂碼是兩大難以解決的問題,因此我選擇使用selenium來編寫爬蟲,部分代碼如下:
from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC def get_request(url): #selenium爬蟲,返回網(wǎng)頁源碼while 1:driver = webdriver.Chrome(options=chrome_options) # 設(shè)置引擎為Chrome,在后臺默默運行driver.get(url)EC_title = EC.title_contains('日') #爬取成功檢測print(EC_title(driver))if EC_title(driver):breakprint('ERROR')driver.close()print('succeed!')# print(con.text)return driver.page_source通過循環(huán)訪問頁面,直到判斷語句判定爬取了正確的內(nèi)容后,返回所爬頁面的源碼。運用了selenium模擬訪問網(wǎng)頁,這種方法的優(yōu)點是穩(wěn)定,不會因為爬取到錯誤代碼而導(dǎo)致程序中止;缺點是selenium耗時較長。
順帶附上我爬取所有網(wǎng)址的部分代碼,使用的是request方法:
數(shù)據(jù)處理
數(shù)據(jù)處理先利用BeautifulSoup處理網(wǎng)頁源碼,獲取到網(wǎng)頁中正文的文本信息(實現(xiàn)很方便),然后利用正則表達(dá)式提取出帶有關(guān)鍵字詞、目標(biāo)格式的信息。部分代碼如下:
def deal_data():datas = open("data.txt", "w")#data.txt中存放提取的數(shù)據(jù)htmls=[]f=open("htmls.txt","r",encoding='utf-8')#讀取txt文件中存儲的網(wǎng)址line=f.readline()while line:htmls.append(line.rstrip('\n'))#輸入網(wǎng)頁時不能帶換行符,這里將其刪去line=f.readline()f.close()iu=0for urls in htmls:iu=iu+1if iu>972:breaksummary= len(htmls)print(urls)print('爬取網(wǎng)址',iu,'共有',summary,'個')url = urlscon = get_request(url) #爬取爬取texts = conresult = BeautifulSoup(texts, 'lxml') # html.parserdiv1 = result.find('title')#提取網(wǎng)頁標(biāo)題,目的是獲取日期信息print(div1)div_date=re.search('[0-9]+月[0-9]+日',str(div1))print(div_date.group())#成功提取日期div2 = result.find('div', attrs={'class': 'con'})div_def = div2.text.replace('\xa0' * 4, '\n\n\xa0\xa0')#處理網(wǎng)頁正文部分div_def = div_def.replace('(注:媒體引用時,請標(biāo)注“信息來自國家衛(wèi)生健康委員會官方網(wǎng)站”。)','')div_def = div_def.replace('分享到','')div_x=(re.search('新增確診病例([\s\S]*?)\n',str(div_def)) or NoMatch)#通過正則提取div_x=(re.search('本土([\s\S]*?))',str(div_x.group())) or NoMatch)print(div_x.group())div_bentuxinzeng=re.findall('河北[0-9]+|山西[0-9]+|遼寧[0-9]+|吉林[0-9]+|黑龍江[0-9]+|江蘇[0-9]+|浙江[0-9]+|安徽[0-9]+|福建[0-9]+|江西[0-9]+|山東[0-9]+|河南[0-9]+|湖北[0-9]+|湖南[0-9]+|廣東[0-9]+|海南[0-9]+|四川[0-9]+|貴州[0-9]+|云南[0-9]+|陜西[0-9]+|甘肅[0-9]+|青海[0-9]+|臺灣[0-9]+|內(nèi)蒙古[0-9]+|廣西[0-9]+|西藏[0-9]+|寧夏[0-9]+|新疆[0-9]+|北京[0-9]+|天津[0-9]+|上海[0-9]+|重慶[0-9]+|香港[0-9]+|澳門[0-9]+|例[0-9]+例(在[\s\S]*?)',str(div_x.group()))print(div_bentuxinzeng)numlist = re.findall('[0-9]+', str(div_bentuxinzeng)) ##分離列表prolist = re.findall('河北|山西|遼寧|吉林|黑龍江|江蘇|浙江|安徽|福建|江西|山東|河南|湖北|湖南|廣東|海南|四川|貴州|云南|陜西|甘肅|青海|臺灣|內(nèi)蒙古|廣西|西藏|寧夏|新疆|北京|天津|上海|重慶|香港|澳門|臺灣',str(div_bentuxinzeng))pro1list=(prolist)num1list=(numlist)print(pro1list)print(num1list)#最終得到兩個一一對應(yīng)的列表for i in range(len(pro1list)):#將數(shù)據(jù)寫入txtdatas.write(div_date.group())datas.write(',')datas.write(pro1list[i])datas.write(',')datas.write(num1list[i]+'\n')div_x = (re.search('新增無癥狀([\s\S]*?)\n', str(div_def)) or NoMatch)#同上,提取本土新增無癥狀div_x = (re.search('本土([\s\S]*?))', str(div_x.group())) or NoMatch)print(div_x.group())div_wuzhengzhuangxinzeng=re.findall('河北[0-9]+|山西[0-9]+|遼寧[0-9]+|吉林[0-9]+|黑龍江[0-9]+|江蘇[0-9]+|浙江[0-9]+|安徽[0-9]+|福建[0-9]+|江西[0-9]+|山東[0-9]+|河南[0-9]+|湖北[0-9]+|湖南[0-9]+|廣東[0-9]+|海南[0-9]+|四川[0-9]+|貴州[0-9]+|云南[0-9]+|陜西[0-9]+|甘肅[0-9]+|青海[0-9]+|臺灣[0-9]+|內(nèi)蒙古[0-9]+|廣西[0-9]+|西藏[0-9]+|寧夏[0-9]+|新疆[0-9]+|北京[0-9]+|天津[0-9]+|上海[0-9]+|重慶[0-9]+|香港[0-9]+|澳門[0-9]+|例[0-9]+例(在[\s\S]*?)',str(div_x.group()))print(div_wuzhengzhuangxinzeng)numlist = re.findall('[0-9]+', str(div_wuzhengzhuangxinzeng)) ##分離列表prolist = re.findall('河北|山西|遼寧|吉林|黑龍江|江蘇|浙江|安徽|福建|江西|山東|河南|湖北|湖南|廣東|海南|四川|貴州|云南|陜西|甘肅|青海|臺灣|內(nèi)蒙古|廣西|西藏|寧夏|新疆|北京|天津|上海|重慶|香港|澳門|臺灣',str(div_wuzhengzhuangxinzeng))pro2list = (prolist)num2list = (numlist)print(pro2list)print(num2list)for i in range(len(pro2list)):datas.write(div_date.group())datas.write(',,,')#控制格式導(dǎo)入excel中datas.write(pro2list[i])datas.write(',')datas.write(num2list[i] + '\n')數(shù)據(jù)處理的難點在于一些早些網(wǎng)頁的文本格式和近期不同,要額外考慮,導(dǎo)致代碼冗長。
3.數(shù)據(jù)統(tǒng)計接口部分的性能改進(jìn)
本次作業(yè)在花費時間方面,爬蟲耗時在我對其“改進(jìn)”后成倍增長(反爬機制確實遭不住啊),時間關(guān)系,在本次作業(yè)中我沒有多的時間去探索一個更好的爬蟲方法,不過今后我還要探索更加省時還能正常爬取網(wǎng)頁的方法。
消耗最大的函數(shù):deal_data()中的get_request(url)
4.每日熱點的實現(xiàn)思路
我通過分析每一天所爬的數(shù)據(jù),人為制定出一個標(biāo)準(zhǔn),主要通過判斷語句對數(shù)據(jù)進(jìn)行分析,對當(dāng)日中國本土以及各個省份的疫情情況作出簡單的判斷,與疫情數(shù)據(jù)一起寫入excel中。部分代碼如下:
summm1 = 0 #每日熱點模塊,根據(jù)人數(shù)對疫情進(jìn)行分析研判summm2 = 0for i in range(len(pro1list)):summm1 = summm1 + int(num1list[i])if int(num1list[i]) > 40:datas.write(div_date.group())datas.write(',,,,,,,')datas.write(pro1list[i] + '省')datas.write('新增本土確診人數(shù)為:')datas.write(num1list[i])datas.write('。防疫形勢嚴(yán)峻。\n')for i in range(len(pro2list)):summm2 = summm2 + int(num2list[i])if int(num2list[i]) > 200:datas.write(div_date.group())datas.write(',,,,,,,')datas.write(pro2list[i] + '省')datas.write('新增本土無癥狀感染者人數(shù)為:')datas.write(num2list[i])datas.write('。防疫形勢嚴(yán)峻。\n')if summm1==0:datas.write(div_date.group())datas.write(',,,,,,,')datas.write('好耶!無本土新增確診!\n')if summm2==0:datas.write(div_date.group())datas.write(',,,,,,,')datas.write('好耶!無本土新增無癥狀感染者!\n')if summm1 > 0:datas.write(div_date.group())datas.write(',,,,,,,')datas.write('新增本土確診人數(shù)為:')datas.write(str(summm1))if summm1 < 25:datas.write('。總體態(tài)勢良好。\n')elif summm1 < 50:datas.write('。仍有潛在危險。\n')elif summm1 < 200:datas.write('。形勢并不樂觀。\n')else:datas.write('。防疫形勢嚴(yán)峻。\n')if (int(num1list[0]) >= summm1 / 2):datas.write(div_date.group())datas.write(',,,,,,,')datas.write(pro1list[0])datas.write('為重點防控省份。\n')if summm2 > 0:datas.write(div_date.group())datas.write(',,,,,,,')datas.write('新增本土無癥狀感染者人數(shù)為:')datas.write(str(summm2))if summm2 < 50:datas.write('。總體態(tài)勢良好。\n')elif summm2 < 200:datas.write('。仍有潛在危險。\n')elif summm2 < 1000:datas.write('。形勢并不樂觀。\n')else:datas.write('。防疫形勢嚴(yán)峻。\n')if (int(num2list[0]) >= summm2 / 2):datas.write(div_date.group())datas.write(',,,,,,,')datas.write(pro2list[0])datas.write('為重點防控省份。\n')這種實現(xiàn)方法的優(yōu)點:直觀,有嚴(yán)格的判定方法。
缺點:不夠全面,過于直板。
5.數(shù)據(jù)可視化界面的展示
數(shù)據(jù)可視化我選擇的是利用基于Pycharts的WPS-excel,操作簡單,內(nèi)容直觀。通過利用excel所提供的數(shù)據(jù)透視表和透視圖技術(shù),能夠?qū)崿F(xiàn)數(shù)據(jù)的動態(tài)化展示和一定的交互功能。界面展示如下:
頁面左側(cè)是每日新增確診Top10和每日新增無癥狀Top15的省份,能夠直觀地看出全國的防疫重心應(yīng)該放在哪個位置。右側(cè)是對某個省份的新增確診和無癥狀感染者的趨勢圖,利用折線統(tǒng)計圖實現(xiàn)了對某個省疫情情況有記錄的近10天的趨勢。
中間部分是日期的選取和省份的選取,分別對應(yīng)左右兩側(cè)的功能。
港澳臺因為其特殊性,我單獨列出置于中下部,今日熱點置于右下方,會根據(jù)所選日期變化。
三、心得體會
本次個人編程任務(wù)我所耗時間略高于預(yù)計時間,其實我的估計時間已經(jīng)放很寬了(個人認(rèn)為),但實際用時更長,其主要原因是我在編程過程中遇到了比預(yù)想中更多的問題,從對抗網(wǎng)頁的反爬機制到數(shù)據(jù)處理、數(shù)據(jù)可視化,我的實際用時都遠(yuǎn)超預(yù)計。我也是第一次感覺到即使熬夜學(xué)習(xí),時間還是略顯緊湊的感覺。
發(fā)現(xiàn)自己的問題:學(xué)習(xí)容易精力不集中,有些效率低下,導(dǎo)致時間消耗過多。
今天回頭看看,我這用時約有四十多小時的作業(yè)雖然并不是很符合我最初的預(yù)想,但我還是成就感滿滿。在這個過程中,我所用到的所有技術(shù)幾乎都是從零學(xué)起的。這是從無到有的過程,我真覺得這四十多小時,我學(xué)到的東西比以前一個月的還多(以前太懶)。我學(xué)會了網(wǎng)頁爬取數(shù)據(jù)處理,這對我今后的發(fā)展肯定是大有所益的。
總結(jié)
以上是生活随笔為你收集整理的2022软工K班个人编程任务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原型设计+用户规格说明书
- 下一篇: html新的页面打开新页面,javasc