#我的武器库系列#之网络爬虫

       关于网络爬虫即网站爬取,已不陌生,我们可以通过java的WebMgic或者Python的Urllib模块对网站进行爬取,本文的网站爬取其原理为:通过urllib模块Requuest网站内容;通过bs4提取网站内容的a标签;利用递归方式循环遍历网站中所有的a标签;通过hashlib模块对网站内容生成MD5值;以[URL]+[MD5]的形式存入本地文件;定时采集并根据原始MD5文件进行比对,查看被修改页面(比对代码原理很简单所以未上传,文中没有采集js与css,所以有部分缺陷)。

一、源代码

#coding:utf-8
import urllib.request
import hashlib
import re
import threading
from urllib import error
from bs4 import BeautifulSoup
urlMd5Set = set();
md5FileName = "UrlAndMD5201907110730.txt"#文件名称
path = "/xxx/Downloads/xxx/";#存储位置
host ="http://www.xxx.com";#爬取入口
pageFile = open(path+md5FileName,'a');#'r':读  'w':写'a':追加 'r+' == r+w(可读可写,文件若不存在就报错(IOError)) 'w+' == w+r(可读可写,文件若不存在就创建) 'a+' ==a+r(可追加可写,文件若不存在就创建)

def downloadHTMLHadle(url):
    downloadHTML(url);
    print('采集结束');
    pageFile.close();

#下载页面
def downloadHTML(url):
    url = url.rstrip();
    try:
        page = urllib.request.urlopen(url)#打开网页
        htmlcode = page.read()#读取页面源码
        title=re.findall('<title>(.+)</title>',htmlcode.decode('utf-8')); #获取页面title
        urlMd5 = getMD5(str(url));
        soup = BeautifulSoup(htmlcode, 'html.parser')   #文档对象
        tag = soup.find_all('td', attrs={'class':'header_bg'});
        htmlContent = str(htmlcode);
        if len(tag) >0:
           htmlContent=  htmlContent.replace(str(tag),"");
        saveHTML("URL:["+url+"]     MD5:["+getMD5(htmlContent)+"]\n");
        #saveHTML(str(urlMd5)+".html",htmlcode);
        for k in soup.find_all('a'): #获取a标签
            if k.get('href') and k.get('href') != "#": #踢出问题href
                href = k.get('href');
                if "http" not in href and( "html" in href or "shtml" in href ):
                    if getMD5(href) in urlMd5Set:
                        continue;
                    urlMd5Set.add(getMD5(href));
                    href = host+href.strip();  
                    print(href);
                    downloadHTML(href);
            #if getMD5(url) not in urlMd5Set:   #去重
                #保存页面,保存hash表
        return ;
    except  Exception as e:
        print(e);
        pass;


def saveHTML(content):
    pageFile.write(str(content));#写入
   
   
#获取md5
def getMD5(content):
    md5 = hashlib.md5();
    md5.update(content.encode("utf-8"));
    return md5.hexdigest();

#线程,有待完善
def craw(url, threadNum):
    for i in list(range(threadNum)):
        t = threading.Thread(target=downloadHTMLHadle,args=(url,));
        t.start();

def main():
    craw(host,1);


if __name__ == '__main__':
    main()

二、优化

        目前主流的木马检测技术分为两类:基于代码的静态分析和基于行为的动态分析。静态分析更多基于恶意特征库进行匹配,动态分析一般通过可控的运行环境对访问过程中的各种数据进行分析。

        文中可以根据MD5方式判断页面是否篡改,方式可用于初级阶段,后期频繁变化会产生很多告警。在优化方面大体可分为:采集管理、安全状态检测管理、木马检测管理等三大模块。安全状态检测可以分为:网站服务状态监测、全站链接监测、页面内容篡改检测、敏感词检测等方面。木马检测管理可以通过建立特征库(框架挂马、JS文件挂马、JS变形加密、Body挂马、CSS挂马、图片挂马、利用隐藏的frame引入网页木马、隐藏挂马等)进行匹配告警。以上为1.0版本,后期我们还可以利用人工智能的方式提取特征进行匹配。

发布了35 篇原创文章 · 获赞 3 · 访问量 2917

猜你喜欢

转载自blog.csdn.net/a59a59/article/details/95441047