essus是一个功能强大而又易于使用的远程安全扫描器,它不仅免费而且更新极快。安全扫描器的功能是对指定网络进行安全检查,找出该网络是 否存在有导致对手攻击的安全漏洞。该系统被设计为client/sever模式,服务器端负责进行安全检查,客户端用来配置管理服务器端。在服务端还采用 了plug-in的体系,允许用户加入执行特定功能的插件,这插件可以进行更快速和更复杂的安全检查。在Nessus中还采用了一个共享的信息接口,称之 知识库,其中保存了前面进行检查的结果。检查的结果可以HTML、纯文本、LaTeX(一种文本文件格式)等几种格式保存。
1、 打开浏览器输入IP加端口8834登录Nessus2、 输入账号密码,
3、 登录成功后,进入到首页
4、 点击侧边栏policies,显示策略界面
5、 点击new policy,显示策略模板
6、 选择advanced scan,填写策略名称
7、 点击permission,选择can use,设置所有人可用
8、 单击Plugins标签,该界面显示了所有插件程序,默认全部是启动的enabled。在该界面可以单击右上角Disable All按钮,禁用所有启动的插件程序。或直接点击enabled状态,即可禁用该插件。
9、 点击save即可看到新增的策略,表示该策略创建成功。
10、 策略创建成功后,必须要新建扫描任务才能实现漏洞扫描。点击My Scans到新增扫描任务界面,点击New scan新建扫描任务。可以选择默认扫描策略。
11、 也可以点击user Defined选择自定义添加的扫描策略
12、 输入任务名称,扫描IP地址。点击save即可看到新增的扫描任务。
13、 新增的扫描任务状态为空
14、 点击launch,启动扫描任务,可看到任务正在running,可停止或者暂停扫描任务
15、 扫描完成后即显示completed,点击该任务即可查看到扫描报告。右侧显示详细扫描任务详细信息,如扫描任务名称、状态、策略、扫描时间等。右下角以圆形图显示了漏洞的危险情况,分别使用不同颜色显示漏洞的严重性。
16、 关于漏洞的信息使用在该界面可以单击Host列中的显示的地址,显示扫描主机的漏洞情况,该列中的数字表示扫描到的信息数。本例中选择172.24.1.62地址。使用的自定义策略。
17、 点击某一漏洞,将显示具体的漏洞信息
18、 点击export,即可导出扫描报告,可选择Nessus、HTML、CSV和Nessus DB格式
19、 选择custom点击export可下载
20、 导出摘要显示如图
导出详细报告显示如图
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/guo_yan_gy/article/details/88840725
们使用Power BI Desktop来制作上面这个图形,需要历年保险保费收入的数据作为依据,网站上有数据公布:
这个页面的地址:
/web/site0/tab5205/info4129096.htm
每个月都会有一个对应的地址,要到那里找到这些个地址呢?
我们找到了这样一个页面:
这个页面里有我们需要的每个月的数据的连接,这样的页面一共有8个,这8个页面的URL是连续的。
web/site0/tab5205/module14413/page1.htm
就是page1到page8
我们打开Power BI Desktop的Power Query,建立一个1到8的表
并且把ID这一列设置成文本,这是第一步。
第二步:要建立一个查询,从web获取数据,设置乘csv格式
复制地址栏里的公式,备用。(实在记不住这些函数,这样偷点懒,嘻嘻)
第三步:回到开始的表,自定义列,用刚才复制的公式,修改一下。
page后面的数字用ID替换一下。
第四步:数据清理,我们要的是每个月的URL,这个过程稍微有点复杂,但是用到的功能很简单,就是符号分列,筛选,替换。
1、用<a href="分列,会直接把我们需要的URL分离出来
2、筛选出带有info的行
3、再分列,用双引号分列
至此已经得到了我们想要的URL.
4、为了能够区分年月,还需要做些处理,取title后面的列,提取出来年和月,这部分就略过了。结果是这样的:
第五步:获取具体数据,如果不记得函数,还是先建立一个自web的查询,复制公式,然后自定义列。
用URL替换网址后面的部分。
第六步:展开并整理数据,这里要注意几个地方
1、删除列要修改一下,保留年和月两列
2、筛选掉所有的非省市名称的行
3、统一所有的省市名称,自己想想办法吧
4、逆透视列
最终的结果:
剩下的工作就回到Power BI Desktop用DAX建立度量值,作图就可以了。
总结一下,如果想从网页中获得需要的信息,就要抓住关键信息,Web信息有几种格式,要从源码中找信息,就用CSV格式,要找网页中的信息,就用HTML格式。不管用PQ还是PY网络抓取数据,都是一个找规律的过程,找到了规律,就能行。
某网站读取表格里面的内容,简单处理后写入CSV文件。需要留意:查找某些字符是否存在,查找其位置,按照位置读取字符串内容,Python真的蛮灵活的。后续还会做两个文件的比较,以及文件内容的删除。让已实现的功能具有普适性,抽取函数供不同场景使用,这才有软件工程的思想。
实践Python
fileName="SplitNo";
nowTime=datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
filePath=fileName + nowTime + ".csv";
csvFile=open(filePath, 'w', newline='', encoding='utf-8')
writer=csv.writer(csvFile,dialect='excel')
head=["页数","序号","编号", "产品名称", "原始文本"]
writer.writerow(head)
startPage=1;
totalPage=1260;
wait.until(EC.presence_of_element_located((By.ID, "content")))
browser.find_element_by_id("page").clear()
browser.find_element_by_id("page").send_keys(str(startPage));
browser.find_elements_by_xpath('//input[@src="images/dataanniu_11.gif"]')[0].click();
time.sleep(3)
n=startPage;
while n < totalPage:
wait.until(EC.presence_of_element_located((By.ID, "content")))
content=browser.find_element_by_id("content");
oneThanOneLine=False;
for attr in content.find_elements_by_tag_name("a"):
text=str(attr.get_attribute('innerHTML'))
text=text.replace('\r', '').replace('\n', '').replace('\t', '')
print(str(text) + "查询位置:" + (str)(text.find(".")))
if text.find(".") !=-1:
csvRow=[]
csvRow.append(str(n))
pos=findPos(text)
if pos !=-1:
name=text[0:pos-1]
notext=text[pos:-1]
csvRow.append(name.split(".")[0])
csvRow.append(notext.split(" ")[0])
if name.__len__() > 1:
csvRow.append(name.split(".")[1])
csvRow.append(text)
writer.writerow(csvRow)
preText=text
oneThanOneLine=False
else:
preText=preText + text;
#p=re.compile(r'[<](.*?)[>]', re.S)
# matches=re.findall(cleanr, preText)\
#for match in matches:
# print(match)
cleanr=re.compile('<.*?>')
preText=re.sub(cleanr, '', preText)
print(preText)
oneThanOneLine=True
n=n + 1
wait.until(EC.presence_of_element_located((By.ID, "page")))
browser.find_element_by_id("page").clear()
browser.find_element_by_id("page").send_keys(str(n))
browser.find_elements_by_xpath('//input[@src="images/xxxx.gif"]')[0].click()
print("已经切换到新一页:" + str(n))
csvFile.close()
browser.close()
碰到的问题:
1、TypeError: expected string or bytes-like object
使用场景:content=browser.find_element_by_id("content");
tdList=re.findall(r'<td[^>]*>(.*?)</td>', str(content.get_attribute('innerHTML')), re.I | re.M)
if tdList:
for item in tdList:
print(item)
使用函数:re.findall(pattern,string,flag)
pattern匹配的是字符串,需要把第二个参数转化为string类型就可以。
2、对循环列表的最后一个元素进行特别处理
使用场景:aTag=attr.find_elements_by_tag_name("a")
if aTag.__len__()>1:
for aText in aTag:
if aTag.__len__() - 1==aTag.index(aText):
print(aText )
3、超时跳转使用wait元素比较靠谱些
wait.until(EC.presence_of_element_located((By.ID, "content")))
print(str(n) + "img[@src='images/dataanniu_07.gif'])")
content=browser.find_element_by_id("content");
content.find_elements_by_xpath('//img[@src="images/dataanniu_07.gif"]')[0].click();'''
4、查询某字符串里面的HTML字符
p=re.compile(r'[<](.*?)[>]', re.S)
matches=re.findall(p, preText)
for match in matches:
print(match)
5、清除某字符串里面的HTML字符
cleanr=re.compile('<.*?>')
preText=re.sub(cleanr, '', preText)
6、记录程序执行时间
import datetime
startTime=datetime.datetime.now()
endTime=datetime.datetime.now()
print(endTime - startTime).seconds
7、等待元素的方法
隐式等待:(WebDriver类下的)implicitly_wait(X),在X时间内,页面加载完成,进行下一步操作。首先Implicit Waits默认是等待时间是0,同时隐性等待是对driver起作用,所以只要设置一次即可,比强制等待更智能
缺点:非要加载到整个页面才能执行代码,这样影响代码的执行效率。一般情况下,我们想要的结果是只需加载到了我要定位的元素就执行代码,不需要等待整个页面的完全加载出来再执行代码。
Sleep显式等待:最简单的一种办法就是强制等待sleep(X),强制让浏览器等待X秒,不管当前操作是否完成,是否可以进行下一步操作,都必须等X秒的时间。
缺点是不能准确把握需要等待的时间;优点是使用简单,可以在调试时使用。
WebDriverWait显示等待:无需等待整个页面加载完成,只需加载到你要定位的元素就可以执行代码。
优点:代码执行效率快。是最智能的设置元素等待的方式。
缺点:需要导入webdriver下的expected_conditions、WebDriverWait、By三个包;写等待时间的代码稍显复杂。
*请认真填写需求信息,我们会在24小时内与您取得联系。