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小時內與您取得聯系。