寫在前面:
本文所有代碼已發布到github: web端:(https://github.com/wushenjiang/getWorldDataJava) 安卓端:(https://github.com/wushenjiang/GetWorldData),需要代碼的可以自行去clone。
3.23更新:原爬蟲代碼由於騰訊更改接口已失效,更新新的爬蟲代碼
4.4更新:騰訊又更改了接口,更新了新的爬蟲代碼
4.5更新:發現爬蟲代碼爬到的是舊數據,更新新的爬蟲代碼
2021年更新:服務器過期,刪除服務器地址
需求:
設計思想:
- 1.首先需要用Python寫的爬蟲(基本代碼來自於前幾天的博客https://www.cnblogs.com/wushenjiang/p/12466220.html,在其基礎上進行了修改以爬取全球數據) 爬取全球數據,並存到服務器數據庫。
- 2.編寫web端代碼,通過連接服務器數據庫獲取數據,並實現基本的查詢顯示(分表和圖兩種形式)。
- 3.編寫移動端代碼,連接同一個服務器數據庫以獲取數據,並實現基本的查詢顯示。
編程前准備:
- 1.首先需要准備一個服務器,這里采用了阿里雲的雲服務器(請讀者自行購買)。之后在服務器端部署mysql數據庫和tomcat和JDK以部署web項目,部署教程見鏈接:https://www.cnblogs.com/yijialong/p/9606265.html
- 2.web端為了美觀,使用了bootstrap框架。需要了解bootstrap的使用。
爬蟲代碼展示:
import pymysql
import requests
import json
# 放入要爬的url
url_foreign = "https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist"
url_inside = "https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5"
# 設置header做一個防爬機制
header = {"user-agent": "Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Mobile Safari/537.36"}
# 獲取response的json
response_foreign = requests.get(url_foreign, headers=header)
response_inside = requests.get(url_inside,headers=header)
data_foreign = json.loads(response_foreign.content.decode())
data_str_foreign = data_foreign['data']
data_inside = json.loads(response_inside.content.decode())
data_str_inside = data_inside['data']
data_json_inside = json.loads(data_str_inside)
# 連接數據庫
db = pymysql.connect(host='39.97.109.245', port=3306, user='root', password='abc456', db='yiqing', charset='utf8')
#使用cursor方法生成一個游標
cursor = db.cursor()
confirmed_total = 0
suspected_total = 0
dead_total = 0
healed_total = 0
# 更新時間
lastUpdateTime = data_json_inside['lastUpdateTime']
# 取出外國的數據
for foreignData in data_str_foreign:
countryName = foreignData['name']
confirmed = foreignData['confirm']
confirmed_total += confirmed
suspected = foreignData['suspect']
suspected_total += suspected
dead = foreignData['dead']
dead_total += dead
healed = foreignData['heal']
healed_total += healed
# 將外國數據上傳到數據庫
sql = "insert into worlddata(id,countryname,confirmed,suspected,dead,healed,lastupdateTime) values({},'{}','{}','{}','{}', '{}','{}')".format(0, countryName, confirmed, suspected, dead, healed, lastUpdateTime)
cursor.execute(sql)
db.commit()
# 取出中國的數據
ChinaName = data_json_inside['areaTree'][0]['name']
china_confirmed = data_json_inside['areaTree'][0]['total']['confirm']
confirmed_total += china_confirmed
china_suspected = data_json_inside['areaTree'][0]['total']['suspect']
suspected_total += china_suspected
china_healed = data_json_inside['areaTree'][0]['total']['heal']
healed_total += china_healed
china_dead = data_json_inside['areaTree'][0]['total']['dead']
dead_total += dead_total
# 將中國數據上傳到數據庫
sql_china = "insert into worlddata(id,countryname,confirmed,suspected,dead,healed,lastupdateTime) values({},'{}','{}','{}','{}', '{}','{}')".format(
0, ChinaName, china_confirmed, china_suspected, china_dead, china_dead, lastUpdateTime)
cursor.execute(sql_china)
db.commit()
# 將匯總數據上傳到數據庫
sql_total = "insert into worlddata(id,countryname,confirmed,suspected,dead,healed,lastupdateTime) values({},'{}','{}','{}','{}', '{}','{}')".format(0, 0, confirmed_total, suspected_total, dead_total, healed_total, lastUpdateTime)
cursor.execute(sql_total)
db.commit()
效果截圖:
APP截圖:
預估時間記錄日志:
PSP2.1 | 階段 | 時間 |
---|---|---|
Planning | 計划 | 3h45m |
- Estimate | 估計這個任務需要多少時間 | 3h45m |
Development | 開發 | |
- Analysis | 需求分析 | 1h30m |
- Coding Standard | 代碼規范 | 15m |
- Design | 具體設計 | 30m |
- Coding | 具體編碼 | 30m |
- Test | 測試 | 1h |
- Count | 總計 | 3h45min |
實際時間記錄日志:
PSP2.1 | 階段 | 時間 |
---|---|---|
Development | 開發 | |
- Analysis | 需求分析 | 2h |
- Coding Standard | 代碼規范 | 15m |
- Design | 具體設計 | 30m |
- Coding | 具體編碼 | 45m |
- Test | 測試 | 1h30min |
- Count | 總計 | 5h |
測試用例分享:
WEB:
- 1.國家 中國 表格
- 2.國家 美國 圖表
- 3.時間 2020-03-17 表格
- 4.時間 2020-03-17 圖表
- 5.時間 2020-03-18 圖表
APP:
- 1.國家 中國
- 2.時間 2020-03-17
- 3.時間 2020-3-17
- 4.國家 美
- 5.國家 意
總結:
本次作業也算是真正的體驗了一把如何開發真正的項目,從WEB開發到APP開發再到部署到服務器,整個體驗了一波如何構造一個小型項目,收益很大。由於安卓開發不是很熟練,所以花費了大量時間在查找資料和各種示例代碼上,因為對安卓組件的不熟悉,每做一個都要百度一下這個組件怎么使用,也是極大的浪費了時間。以后會抓緊學習安卓開發,爭取做出更好的APP。WEB端方面,正在學習SSM框架,等學習完后可能會將本項目進行重構。來日方長,加油吧自己。