日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2022软工K班个人编程任务

發布時間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2022软工K班个人编程任务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、PSP表格

PSP預估耗時(分鐘)實際耗時(分鐘)
計劃1010
估計這個任務需要多少時間56
開發720900
需求分析600720
生成設計文檔2030
設計復審54
代碼規范22
具體設計60180
具體編碼360280
代碼復審6030
測試30180
報告120110
測試報告00
計算工作量2030
事后總結3060
合計20122542

二、任務要求的實現

1.項目設計與技術棧

這一次任務被我拆分成了6個環節,分別是: 1.從零學習python與爬蟲 2.通過爬蟲獲取要爬取的所有頁面的url 3.通過爬蟲爬取目的文本 4.對目的文本的處理,提取疫情數據 5.每日熱點的實現 6.數據的可視化處理完成各個環節的方法: 123.通過上網查詢相關書籍、代碼、視頻學習爬蟲 4.學習python處理爬到的文本,用到了beautifulsoup和正則表達式 5.根據所得數據分析,結合實際自主設計實現每日熱點 6.學習使用excel等工具構建數據可視化動態展示 技術棧:JavaScript+Python+Excel+Pycharts

2.爬蟲與數據處理

本次在爬蟲上我所用的時間最長,遇到的主要問題是:所爬網站存在反爬機制,對于我這個之前從沒用過爬蟲的小萌新來說是個不小的挑戰。

爬蟲的實現:

因為反爬機制,用request指令經常爬不到正常的網頁信息,返回412和爬到一堆亂碼是兩大難以解決的問題,因此我選擇使用selenium來編寫爬蟲,部分代碼如下:

from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC def get_request(url): #selenium爬蟲,返回網頁源碼while 1:driver = webdriver.Chrome(options=chrome_options) # 設置引擎為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

通過循環訪問頁面,直到判斷語句判定爬取了正確的內容后,返回所爬頁面的源碼。運用了selenium模擬訪問網頁,這種方法的優點是穩定,不會因為爬取到錯誤代碼而導致程序中止;缺點是selenium耗時較長。
順帶附上我爬取所有網址的部分代碼,使用的是request方法:

def parse_single_html(html):#爬取鏈接soup=BeautifulSoup(html.text,'html.parser')datas=[]title_nodes=(#返回了一個列表soup.find("ul",class_="zxxx_list").find_all("a"))for atitle in title_nodes:link = atitle["href"]datas.append(link)return datasdef download_all_htmls():htmls=[]for idx in range (41):if idx==0:url = 'http://www.nhc.gov.cn/xcs/yqtb/list_gzbd'else:url=f"http://www.nhc.gov.cn/xcs/yqtb/list_gzbd_{idx+1}"print("craw html:",url)while 1:con=requests.get(url,headers=headers)con.encoding = 'utf-8'print(con)#獲取并輸出if con.status_code ==200:#爬取成功則跳出循環breaktime.sleep(0.5)#重爬間隔htmls= htmls+parse_single_html(con)print(parse_single_html(con))print(htmls)time.sleep(0.5)f = open("htmls.txt", "w")for ahtml in htmls: # 將所得所有url導入txt文檔中f.write('http://www.nhc.gov.cn')f.write(ahtml + '\n')f.close()return htmls

數據處理

數據處理先利用BeautifulSoup處理網頁源碼,獲取到網頁中正文的文本信息(實現很方便),然后利用正則表達式提取出帶有關鍵字詞、目標格式的信息。部分代碼如下:

def deal_data():datas = open("data.txt", "w")#data.txt中存放提取的數據htmls=[]f=open("htmls.txt","r",encoding='utf-8')#讀取txt文件中存儲的網址line=f.readline()while line:htmls.append(line.rstrip('\n'))#輸入網頁時不能帶換行符,這里將其刪去line=f.readline()f.close()iu=0for urls in htmls:iu=iu+1if iu>972:breaksummary= len(htmls)print(urls)print('爬取網址',iu,'共有',summary,'個')url = urlscon = get_request(url) #爬取爬取texts = conresult = BeautifulSoup(texts, 'lxml') # html.parserdiv1 = result.find('title')#提取網頁標題,目的是獲取日期信息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')#處理網頁正文部分div_def = div_def.replace('(注:媒體引用時,請標注“信息來自國家衛生健康委員會官方網站”。)','')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]+|內蒙古[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('河北|山西|遼寧|吉林|黑龍江|江蘇|浙江|安徽|福建|江西|山東|河南|湖北|湖南|廣東|海南|四川|貴州|云南|陜西|甘肅|青海|臺灣|內蒙古|廣西|西藏|寧夏|新疆|北京|天津|上海|重慶|香港|澳門|臺灣',str(div_bentuxinzeng))pro1list=(prolist)num1list=(numlist)print(pro1list)print(num1list)#最終得到兩個一一對應的列表for i in range(len(pro1list)):#將數據寫入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]+|內蒙古[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('河北|山西|遼寧|吉林|黑龍江|江蘇|浙江|安徽|福建|江西|山東|河南|湖北|湖南|廣東|海南|四川|貴州|云南|陜西|甘肅|青海|臺灣|內蒙古|廣西|西藏|寧夏|新疆|北京|天津|上海|重慶|香港|澳門|臺灣',str(div_wuzhengzhuangxinzeng))pro2list = (prolist)num2list = (numlist)print(pro2list)print(num2list)for i in range(len(pro2list)):datas.write(div_date.group())datas.write(',,,')#控制格式導入excel中datas.write(pro2list[i])datas.write(',')datas.write(num2list[i] + '\n')

數據處理的難點在于一些早些網頁的文本格式和近期不同,要額外考慮,導致代碼冗長。

3.數據統計接口部分的性能改進

本次作業在花費時間方面,爬蟲耗時在我對其“改進”后成倍增長(反爬機制確實遭不住啊),時間關系,在本次作業中我沒有多的時間去探索一個更好的爬蟲方法,不過今后我還要探索更加省時還能正常爬取網頁的方法。
消耗最大的函數:deal_data()中的get_request(url)

4.每日熱點的實現思路

我通過分析每一天所爬的數據,人為制定出一個標準,主要通過判斷語句對數據進行分析,對當日中國本土以及各個省份的疫情情況作出簡單的判斷,與疫情數據一起寫入excel中。部分代碼如下:

summm1 = 0 #每日熱點模塊,根據人數對疫情進行分析研判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('新增本土確診人數為:')datas.write(num1list[i])datas.write('。防疫形勢嚴峻。\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('新增本土無癥狀感染者人數為:')datas.write(num2list[i])datas.write('。防疫形勢嚴峻。\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('新增本土確診人數為:')datas.write(str(summm1))if summm1 < 25:datas.write('。總體態勢良好。\n')elif summm1 < 50:datas.write('。仍有潛在危險。\n')elif summm1 < 200:datas.write('。形勢并不樂觀。\n')else:datas.write('。防疫形勢嚴峻。\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('新增本土無癥狀感染者人數為:')datas.write(str(summm2))if summm2 < 50:datas.write('。總體態勢良好。\n')elif summm2 < 200:datas.write('。仍有潛在危險。\n')elif summm2 < 1000:datas.write('。形勢并不樂觀。\n')else:datas.write('。防疫形勢嚴峻。\n')if (int(num2list[0]) >= summm2 / 2):datas.write(div_date.group())datas.write(',,,,,,,')datas.write(pro2list[0])datas.write('為重點防控省份。\n')

這種實現方法的優點:直觀,有嚴格的判定方法。
缺點:不夠全面,過于直板。

5.數據可視化界面的展示

數據可視化我選擇的是利用基于Pycharts的WPS-excel,操作簡單,內容直觀。通過利用excel所提供的數據透視表和透視圖技術,能夠實現數據的動態化展示和一定的交互功能。界面展示如下:

頁面左側是每日新增確診Top10和每日新增無癥狀Top15的省份,能夠直觀地看出全國的防疫重心應該放在哪個位置。右側是對某個省份的新增確診和無癥狀感染者的趨勢圖,利用折線統計圖實現了對某個省疫情情況有記錄的近10天的趨勢。
中間部分是日期的選取和省份的選取,分別對應左右兩側的功能。
港澳臺因為其特殊性,我單獨列出置于中下部,今日熱點置于右下方,會根據所選日期變化。

三、心得體會

本次個人編程任務我所耗時間略高于預計時間,其實我的估計時間已經放很寬了(個人認為),但實際用時更長,其主要原因是我在編程過程中遇到了比預想中更多的問題,從對抗網頁的反爬機制到數據處理、數據可視化,我的實際用時都遠超預計。我也是第一次感覺到即使熬夜學習,時間還是略顯緊湊的感覺。

發現自己的問題:學習容易精力不集中,有些效率低下,導致時間消耗過多。

今天回頭看看,我這用時約有四十多小時的作業雖然并不是很符合我最初的預想,但我還是成就感滿滿。在這個過程中,我所用到的所有技術幾乎都是從零學起的。這是從無到有的過程,我真覺得這四十多小時,我學到的東西比以前一個月的還多(以前太懶)。我學會了網頁爬取數據處理,這對我今后的發展肯定是大有所益的。

總結

以上是生活随笔為你收集整理的2022软工K班个人编程任务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。