文章目录

  • 前言
  • 一、数据采集
  • 二、数据存储
  • 三、数据分析
  • 四、 数据可视化
    • 1、可视化要求
      • 1.1疫情地图
      • 1.2新增人数折线图
      • 1.3迁徙图
      • 1.4词云图
      • 1.5 情感分析图
    • 2、可视化结果
  • 链接

前言

这是上半年其中一门课程的作业,主要是基于Django框架开发的一个可视化平台,利用python爬虫从各大网站爬取数据,存储在MySQL中,最终页面由echarts和html共同构建,实现前后端的互动。系统用可视化的方式实时呈现疫情动态,让用户可以清晰、直观的了解当前疫情走势。


一、数据采集

这里代码过多,我找几个比较有代表性的进行展示,所有爬虫代码都会在最后提供链接

各省疫情数据爬取.py

import re
import requests
import pandas as pd
import json
data_city={}
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}
url = 'http://www.maps7.com/china_province.php'
page = requests.get(url,headers=headers)
file = page.text
for num in range(0,34):cities = []city=''province=''if (num == 33):one = re.findall('<a name="33"(.*)</a>', file)else:one = re.findall('<a name="' + str(num) + '" href=.*?>(.*?)<a name="' + str(num + 1) + '" href=.*?>', file)for i in one:if (num == 0):province = re.findall('(.*?)</a></h4>', i)else:province = re.findall('<h4>(.*?)</h4>', i)city = re.findall('<a href="/china/dianziditu.*?>(.*?)</a>', i)for i in province:if (len(city) != 0):for j in city:cities.append(j)else:cities.append(i)data_city[i.replace('省','').replace('市','')]=citiesdata_city["广西"] = data_city.pop("广西壮族自治区")
data_city["新疆"] = data_city.pop("新疆维吾尔自治区")
data_city["香港"] = data_city.pop("香港特别行政区")
data_city["澳门"] = data_city.pop("澳门特别行政区")
data_city["内蒙古"] = data_city.pop("内蒙古自治区")
data_city["宁夏"] = data_city.pop("宁夏回族自治区")
for i in data_city.keys():for j in data_city[i]:ci = jif len(j) != 2:j = j.replace('市', '').replace('区', '').replace('县', '')url = 'https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?province={0}&city={1}'.format(i, j)response = requests.post(url, headers=headers)data = json.loads(response.text)['data']date = []province = []confirm = []dead = []province_city = []heal = []try:for num in data:if num['date'] == '03.01':index = data.index(num)except:index = 0id = 1for num in range(index, index + 31):if len(str(id)) == 1:date.append('03.0' + str(id))id = id + 1else:date.append('03.' + str(id))id = id + 1province.append(i)province_city.append(ci)try:confirm.append(data[num]['confirm'])except:confirm.append(0)try:dead.append(data[num]['dead'])except:dead.append(0)try:heal.append(data[num]['heal'])except:heal.append(0)if province_city[0] == '朝阳区':dataframe = pd.DataFrame({'date': date, 'province': province, 'city': province_city, 'confirm': confirm, 'dead': dead,'heal': heal})dataframe.to_csv("各省疫情情况.csv", index=False, sep=',')else:dataframe = pd.DataFrame({'date': date, 'province': province, 'city': province_city, 'confirm': confirm, 'dead': dead,'heal': heal})dataframe.to_csv("各省疫情情况.csv", index=False, sep=',', header=False, mode='a')

微博评论爬取.py

# -*- coding: utf-8 -*-
import requests, random, re
import time
import os
import csv
import sys
import json
import importlib
importlib.reload(sys)
from fake_useragent import UserAgent
from lxml import etree
import pandas as pd
import http.cookiejar as cookielib
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36','X-Requested-With': 'XMLHttpRequest'
}cookies = cookielib.LWPCookieJar("Cookie.txt")
cookies.load(ignore_discard=True, ignore_expires=True)
# 将cookie转换成字典
cookie_dict = requests.utils.dict_from_cookiejar(cookies)
comments_ID = []
title_user_ids=[]
commentss=[]
dates=[]
article_urls=[]
title_user_NicNames=[]
title_user_genders=[]
reposts_counts=[]
comments_counts=[]
attitudes_counts=[]
def get_title_id():'''爬取战疫情首页的每个主题的ID'''for page in range(1,31):  # 每个页面大约有18个话题headers = {"User-Agent":"Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",}time.sleep(1)# 该链接通过抓包获得api_url = 'https://m.weibo.cn/api/feed/trendtop?containerid=102803_ctg1_600059_-_ctg1_600059&page=' + str(page)rep = requests.get(url=api_url, headers=headers,cookies=cookie_dict)for json in rep.json()['data']['statuses']:comment_ID = json['id']comments_ID.append(comment_ID)def spider_title(comment_ID):try:article_url = 'https://m.weibo.cn/detail/' + comment_IDarticle_urls.append(article_url)html_text = requests.get(url=article_url, headers=headers,cookies=cookie_dict).text# 楼主IDtitle_user_id = re.findall('.*?"id": (.*?),.*?', html_text)[1]title_user_ids.append(title_user_id)# 楼主昵称title_user_NicName = re.findall('.*?"screen_name": "(.*?)",.*?', html_text)[0]title_user_NicNames.append(title_user_NicName)# 楼主性别title_user_gender = re.findall('.*?"gender": "(.*?)",.*?', html_text)[0]title_user_genders.append(title_user_gender)# 转发量reposts_count = re.findall('.*?"reposts_count": (.*?),.*?', html_text)[0]reposts_counts.append(reposts_count)# 评论量comments_count = re.findall('.*?"comments_count": (.*?),.*?', html_text)[0]comments_counts.append(comments_count)# 点赞量attitudes_count = re.findall('.*?"attitudes_count": (.*?),.*?', html_text)[0]attitudes_counts.append(attitudes_count)except:passdef get_page(comment_ID, max_id, id_type):params = {'max_id': max_id,'max_id_type': id_type}url = ' https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id'.format(comment_ID, comment_ID)try:r = requests.get(url, params=params, headers=headers)if r.status_code == 200:return r.json()except requests.ConnectionError as e:passdef parse_page(jsondata):if jsondata:items = jsondata.get('data')item_max_id = {}item_max_id['max_id'] = items['max_id']item_max_id['max_id_type'] = items['max_id_type']return item_max_iddef write_csv(jsondata):comments=''for json in jsondata['data']['data']:comments_text = json['text']comment_text = re.sub('<(S*?)[^>]*>.*?|<.*? />', '', comments_text)  # 正则匹配掉html标签comments+=comment_textreturn commentsdef main():count_title = len(comments_ID)for count, comment_ID in enumerate(comments_ID):print("正在爬取第%s个话题,一共找到个%s话题需要爬取" % (count + 1, count_title))num=int(count/18)+1date='6月'+str(num)+'日'dates.append(date)spider_title(comment_ID)m_id = 0id_type = 0try:for page in range(1, 2):  # 用评论数量控制循环jsondata = get_page(comment_ID, m_id, id_type)comments=write_csv(jsondata)results = parse_page(jsondata)m_id = results['max_id']id_type = results['max_id_type']commentss.append(comments)except:passif __name__ == '__main__':get_title_id()main()if len(commentss)<len(dates):article_urls = article_urls[:len(commentss)]dates = dates[:len(commentss)]title_user_ids = title_user_ids[:len(commentss)]title_user_NicNames = title_user_NicNames[:len(commentss)]title_user_genders = title_user_genders[:len(commentss)]reposts_counts = reposts_counts[:len(commentss)]comments_counts = comments_counts[:len(commentss)]attitudes_counts = attitudes_counts[:len(commentss)]else:commentss=commentss[:len(dates)]dataframe = pd.DataFrame({'article_url': article_urls, 'date': dates, 'title_user_id': title_user_ids, 'title_user_NicName': title_user_NicNames, 'title_user_gender': title_user_genders,'reposts_count': reposts_counts,'comments_count': comments_counts,'attitudes_count': attitudes_counts,'comments': commentss})dataframe.to_csv("微博评论数据.csv", index=False, sep=',')

获取cookie.py

# -*- coding: utf-8 -*-
import time
import base64
import rsa
import binascii
import requests
import re
from PIL import Image
import random
from urllib.parse import quote_plus
import http.cookiejar as cookielib
import jsonagent = 'mozilla/5.0 (windowS NT 10.0; win64; x64) appLewEbkit/537.36 (KHTML, likE gecko) chrome/71.0.3578.98 safari/537.36'
headers = {'User-Agent': agent}class WeiboLogin(object):"""通过登录 weibo.com 然后跳转到 m.weibo.cn"""# 初始化数据def __init__(self, user, password, cookie_path):super(WeiboLogin, self).__init__()self.user = userself.password = passwordself.session = requests.Session()self.cookie_path = cookie_path# LWPCookieJar是python中管理cookie的工具,可以将cookie保存到文件,或者在文件中读取cookie数据到程序self.session.cookies = cookielib.LWPCookieJar(filename=self.cookie_path)self.index_url = "http://weibo.com/login.php"self.session.get(self.index_url, headers=headers, timeout=2)self.postdata = dict()def get_su(self):"""对 email 地址和手机号码 先 javascript 中 encodeURIComponent对应 Python 3 中的是 urllib.parse.quote_plus然后在 base64 加密后decode"""username_quote = quote_plus(self.user)username_base64 = base64.b64encode(username_quote.encode("utf-8"))return username_base64.decode("utf-8")# 预登陆获得 servertime, nonce, pubkey, rsakvdef get_server_data(self, su):"""与原来的相比,微博的登录从 v1.4.18 升级到了 v1.4.19这里使用了 URL 拼接的方式,也可以用 Params 参数传递的方式"""pre_url = "http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su="pre_url = pre_url + su + "&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_="pre_url = pre_url + str(int(time.time() * 1000))pre_data_res = self.session.get(pre_url, headers=headers)# print("*"*50)# print(pre_data_res.text)# print("*" * 50)sever_data = eval(pre_data_res.content.decode("utf-8").replace("sinaSSOController.preloginCallBack", ''))return sever_datadef get_password(self, servertime, nonce, pubkey):"""对密码进行 RSA 的加密"""rsaPublickey = int(pubkey, 16)key = rsa.PublicKey(rsaPublickey, 65537)  # 创建公钥message = str(servertime) + '\t' + str(nonce) + '\n' + str(self.password)  # 拼接明文js加密文件中得到message = message.encode("utf-8")passwd = rsa.encrypt(message, key)  # 加密passwd = binascii.b2a_hex(passwd)  # 将加密信息转换为16进制。return passwddef get_cha(self, pcid):"""获取验证码,并且用PIL打开,1. 如果本机安装了图片查看软件,也可以用 os.subprocess 的打开验证码2. 可以改写此函数接入打码平台。"""cha_url = "https://login.sina.com.cn/cgi/pin.php?r="cha_url = cha_url + str(int(random.random() * 100000000)) + "&s=0&p="cha_url = cha_url + pcidcha_page = self.session.get(cha_url, headers=headers)with open("cha.jpg", 'wb') as f:f.write(cha_page.content)f.close()try:im = Image.open("cha.jpg")im.show()im.close()except Exception as e:print(u"请到当前目录下,找到验证码后输入")def pre_login(self):# su 是加密后的用户名su = self.get_su()sever_data = self.get_server_data(su)servertime = sever_data["servertime"]nonce = sever_data['nonce']rsakv = sever_data["rsakv"]pubkey = sever_data["pubkey"]showpin = sever_data["showpin"]  # 这个参数的意义待探索password_secret = self.get_password(servertime, nonce, pubkey)self.postdata = {'entry': 'weibo','gateway': '1','from': '','savestate': '7','useticket': '1','pagerefer': "https://passport.weibo.com",'vsnf': '1','su': su,'service': 'miniblog','servertime': servertime,'nonce': nonce,'pwencode': 'rsa2','rsakv': rsakv,'sp': password_secret,'sr': '1366*768','encoding': 'UTF-8','prelt': '115',"cdult": "38",'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack','returntype': 'TEXT'  # 这里是 TEXT 和 META 选择,具体含义待探索}return sever_datadef login(self):# 先不输入验证码登录测试try:sever_data = self.pre_login()login_url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)&_'login_url = login_url + str(time.time() * 1000)login_page = self.session.post(login_url, data=self.postdata, headers=headers)ticket_js = login_page.json()ticket = ticket_js["ticket"]except Exception as e:sever_data = self.pre_login()login_url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)&_'login_url = login_url + str(time.time() * 1000)pcid = sever_data["pcid"]self.get_cha(pcid)self.postdata['door'] = input(u"请输入验证码")login_page = self.session.post(login_url, data=self.postdata, headers=headers)ticket_js = login_page.json()ticket = ticket_js["ticket"]# 以下内容是 处理登录跳转链接save_pa = r'==-(\d+)-'ssosavestate = int(re.findall(save_pa, ticket)[0]) + 3600 * 7jump_ticket_params = {"callback": "sinaSSOController.callbackLoginStatus","ticket": ticket,"ssosavestate": str(ssosavestate),"client": "ssologin.js(v1.4.19)","_": str(time.time() * 1000),}jump_url = "https://passport.weibo.com/wbsso/login"jump_headers = {"Host": "passport.weibo.com","Referer": "https://weibo.com/","User-Agent": headers["User-Agent"]}jump_login = self.session.get(jump_url, params=jump_ticket_params, headers=jump_headers)uuid = jump_login.textuuid_pa = r'"uniqueid":"(.*?)"'uuid_res = re.findall(uuid_pa, uuid, re.S)[0]web_weibo_url = "http://weibo.com/%s/profile?topnav=1&wvr=6&is_all=1" % uuid_resweibo_page = self.session.get(web_weibo_url, headers=headers)# print(weibo_page.content.decode("utf-8")Mheaders = {"Host": "login.sina.com.cn","User-Agent": agent}# m.weibo.cn 登录的 url 拼接_rand = str(time.time())mParams = {"url": "https://m.weibo.cn/","_rand": _rand,"gateway": "1","service": "sinawap","entry": "sinawap","useticket": "1","returntype": "META","sudaref": "","_client_version": "0.6.26",}murl = "https://login.sina.com.cn/sso/login.php"mhtml = self.session.get(murl, params=mParams, headers=Mheaders)mhtml.encoding = mhtml.apparent_encodingmpa = r'replace\((.*?)\);'mres = re.findall(mpa, mhtml.text)# 关键的跳转步骤,这里不出问题,基本就成功了。Mheaders["Host"] = "passport.weibo.cn"self.session.get(eval(mres[0]), headers=Mheaders)mlogin = self.session.get(eval(mres[0]), headers=Mheaders)# print(mlogin.status_code)# 进过几次 页面跳转后,m.weibo.cn 登录成功,下次测试是否登录成功Mheaders["Host"] = "m.weibo.cn"Set_url = "https://m.weibo.cn"pro = self.session.get(Set_url, headers=Mheaders)pa_login = r'isLogin":true,'login_res = re.findall(pa_login, pro.text)# print(login_res)# 可以通过 session.cookies 对 cookies 进行下一步相关操作self.session.cookies.save()# print("*"*50)# print(self.cookie_path)if __name__ == '__main__':username = ""  # 用户名password = ""  # 密码cookie_path = "Cookie.txt"  # 保存cookie 的文件名称weibo = WeiboLogin(username, password, cookie_path)weibo.login()

二、数据存储

在这里我是将爬取到的csv文件通过Navicat Premium 15存储到mysql中,当然你也可以在爬取过程中直接将数据存到MySQL或者直接读取csv文件。


三、数据分析

将下载好的微博疫情话题评论数据进行jieba分词,然后利用python自带的snownlp库对结果进行情感分析,最后将分析结果存到csv文件。
情感分析.py

from snownlp import SnowNLP
import jieba
import csv
import pandas as pd
topic_data={}
with open(r'C:\Users\15503\PycharmProjects\mysite\微博疫情话题评论.csv','r', encoding='utf-8') as f:reader = csv.reader(f)header_row = next(reader)topic,comment= [], []for row in reader:topic.append(row[0])comment.append(row[1])
words=[]
for line in comment:text=str(line).replace('[','').replace(']','').replace(',','').replace('\'','').replace(' ','').replace('\n','')seg_list = jieba.cut(text,cut_all=False)word=[]for i in seg_list:cut_words = SnowNLP(i).sentimentsif cut_words==0.5:num=0elif cut_words<0.5:num=-1else:num=1word.append(num)words.append(word)
positive=[]
negative=[]
neutral=[]
for i in words:positive.append(i.count(1))negative.append(i.count(-1))neutral.append(i.count(0))
topics=['钟南山院士指导研发快速检测试剂盒','我的治愈故事','如何科学节约口罩','环保酵素不可用于消毒','铁路客座率将控制在50%左右','防控新型冠状病毒肺炎临时指南']
dataframe = pd.DataFrame({'topic':topics,'positive':positive,'negative':negative,'neutral':neutral})
dataframe.to_csv("微博疫情评论分析结果.csv",index=False,sep=',',header=True)

四、 数据可视化

1、可视化要求

1.1疫情地图

疫情地图主要展示了中国各省市新型冠状病毒确诊、治愈、死亡人数随时间的变化情况,地图上色块的深浅可以直观展示各省市疫情的轻重程度。通过时间轴的动态演示,可以观察从1月20日至今,疫情从开始、传播到爆发、控制的变化。同时,可以通过鼠标点击地图各省观察省内疫情的演变情况,方便更进一步了解各省疫情的发展情况。

1.2新增人数折线图

新增人数曲线展示了确诊、治愈、死亡人数随时间的变化情况,折线图可以具体展示各市三类人数的变化情况。

1.3迁徙图

为了实时展示在时间维度上的湖北省人口迁入迁出的情况,我们获取了百度人口迁徙数据,并以天为最小时间单位对比迁入迁出的情况。通过日期选择的方法,可以灵活对比任意两天的迁入迁出情况。可视化方法采用了点地图的方式,将迁入的密集来源地和迁出的主要目的地通过不同的颜色属性进行标度,以线路图的方式动态展示这一效果,对用户而言具有视觉友好性。直观展示出那些可能因为人员的大量流动需要带来的疫情防控压力。同时辅助疫情感染等数据视图战术人口空间移动管控对防疫的积极影响。

1.4词云图

本视图的数据主要分为国内热搜数据,来源包括微博,抖音等热搜榜;国外热评,来源是YouTube的疫情相关话题的热门评论。利用分词和主题词提取的数据挖掘手段,获取具体的关键词。可视化方法采用文本数据惯常的可视方法—词云图展示,文本尺寸属性表示该包含该文本的话题热度或者是评论认同度,这些指标主要通过检索次数、文章数量、评论次数、点赞次数等综合评价得到。该界面提供对国内热搜,国外热评两种方式,以及时间维度的选择,点击每个词汇可实现具体话题或者评论的弹窗显示,方便用户对详细信息进行了解。通过可视化分析,我们能够对国内外舆论焦点进行直观了解。

1.5 情感分析图

数据来源于微博相关热点话题下的评论。结合微博平台的语言特点以及疫情相关文本数据的情感特点,我们构建了情感关键词匹配库,并随着话题的变化对之进行不断的优化补充。基于这个匹配库,对评论进行情感分析,得到公众对于该话题的情感极性表征(分为消极,中性,积极)。可视化方法采用径向堆叠柱图,其中每一个扇形区域对应一个话题,该扇形区域内的红黑蓝三种颜色的径向长分别表示对该话题表达消极、中性、积极情感的评论数。

2、可视化结果


链接

GitHub由于限制并不能将整个框架都上传,只能放一些重要代码

GitHub:https://github.com/big-indoorsman/epidemic_visualization

CSDN:https://download.csdn.net/download/qq_40491826/12737384

疫情可视化与舆情分析相关推荐

  1. Python新冠疫情可视化分析系统 计算机专业毕业设计源码08504

    摘 要 文中首先对新冠疫情可视化分析的项目需求进行了背景分析,接着介绍了项目的总体设计思路,然后具体阐述了疫情数据库的设计.疫情数据的查询.疫情数据的展示,并分析了核心代码.文中利用MySQL数据库存 ...

  2. 切片分析报告格式_疫情舆情分析研判报告怎么撰写?2020舆情报告格式

    ​疫情舆情分析研判报告撰写不像疫情舆情信息监测与搜集工作那么容易,它需要从数据出发,以内容为支撑,要先对疫情舆情信息进行整理汇总,再处理.分析和研判.因此,报告撰写难度大,毕竟它是整个舆情分析研判最终 ...

  3. 【ECharts系列|02可视化大屏】 舆情分析,人口分析及警情警力活动情况的实现【下篇】

    简介:ECharts实现可视化大屏展示,包含人口分析,警情警力分析多张效果图, 完整的html+css+js+img:https://download.csdn.net/download/weixin ...

  4. 【ECharts系列|02可视化大屏】 舆情分析,人口分析及警情警力活动情况的实现【上篇】

    简介:ECharts实现可视化大屏展示,包含人口分析,警情警力分析多张效果图, 完整的html+css+js+img:https://download.csdn.net/download/weixin ...

  5. 用python做舆情分析系统_如何用Python做舆情时间序列可视化?

    如何批量处理评论信息情感分析,并且在时间轴上可视化呈现?舆情分析并不难,让我们用Python来实现它吧. 痛点 你是一家连锁火锅店的区域经理,很注重顾客对餐厅的评价.从前,你苦恼的是顾客不爱写评价.最 ...

  6. 用python做一个舆情分析系统_如何用Python做舆情时间序列可视化?

    如何批量处理评论信息情感分析,并且在时间轴上可视化呈现?舆情分析并不难,让我们用Python来实现它吧. 痛点 你是一家连锁火锅店的区域经理,很注重顾客对餐厅的评价.从前,你苦恼的是顾客不爱写评价.最 ...

  7. 【自嗨笔记#2】微博疫情舆情分析---舆情分析部分

    [ 自嗨笔记#2] 微博疫情舆情分析-舆情分析部分 利用前面抓取的信息,开始分析,这里可以说都是看到大佬的文章,模仿加上自己的想象加工,确实不太了解实际业务需求,如果有业内朋友看到,欢迎帮我指正,也欢 ...

  8. 【自嗨笔记#1】微博疫情舆情分析---信息爬取部分

    [ 自嗨笔记#1] 微博疫情舆情分析-爬取部分 作为一个疫情时入坑的"小学生",刚刚注册了csdn,这里想和大家交流下学习心得(自己解决代码错误的太难了!),一方面:想看看大家有没 ...

  9. 疫情舆情分析报告范文与写作基本格式详解

    疫情舆情分析研判报告撰写不像疫情舆情信息监测与搜集工作那么容易,它需要从数据出发,以内容为支撑,要先对疫情舆情信息进行整理汇总,再处理.分析和研判.因此,报告撰写难度大,毕竟它是整个舆情分析研判最终成 ...

最新文章

  1. 开源多年后,Facebook这个调试工具,再登Github热门榜
  2. python使用openCV把原始彩色图像转化为灰度图、使用矩阵索引的方式对数据数据进行剪裁(image cropping)
  3. JTextArea Demo
  4. Excel多因素可重复方差分析
  5. mysqli 返回一条结果_php中mysqli 处理查询结果集总结
  6. jq之fadeIn()
  7. 为Windows2008升级系统补丁
  8. 什么是全场景AI计算框架MindSpore?
  9. PowerVR 6XT/6XE系列移动GPU
  10. CentOS 7使用通过二进制包安装MySQL 5.7.18
  11. 期刊论文格式模板 电子版_期刊论文发表流程是怎样的呢?
  12. WPS JS 宏搜索带颜色的字的笔记
  13. Springboot集成Mybatis怎么在控制台打印sql语句
  14. 通过Web界面统一管理AD和Exchange的工具
  15. 华为od机试81出租车计费python
  16. vitrualbox虚拟机64位安装报错解决
  17. keytool 错误:Keystore was tampered with, or password was incorrect
  18. 聊聊Hive数据血缘——从Atlas没有列级血缘的Bug讲起
  19. sapjco3使用详解
  20. springboot微信公众号自定义菜单创建及响应

热门文章

  1. 11.5NOIP模拟赛
  2. js运行机制,宏观任务和微观任务
  3. SSM项目无效的列类型问题的解决
  4. Node之使用调试器
  5. 输入一个字符串,统计个数,输出字符数字等的个数
  6. Java工程师面试题之Spring Cloud(含答案)
  7. 报错:未将对象引用设置到对象实例
  8. u盘文件丢了怎么找回
  9. pythonchallenge闯关游戏_Python Challenge游戏攻略(一)
  10. Web自动化测试的理解