【记录】使用 Python 爬取 Malpedia 信息

说明

由于业务需要获取近三年勒索家族病毒信息,因此尝试使用 python 爬取 Malpedia 的家族列表

代码首先检查是否为 Windows 或 Linux 系统,然后获取详细信息页面路径并访问,检查页面中是否包含 ransom 字符串,并检查最新报告时间是否在 2021 年之后,如果条件全部满足,则记录家族名称及详细信息页面路径。

注意,由于检查某家族是否和 勒索 相关的方式只是通过 “页面中是否包含 ransom 字符串” 的方式,因此结果并不准确,可能会有漏报或误报,误报的方式通过人工再次检查,漏报不做处理

代码

from bs4 import BeautifulSoup
import urllib.request
import warnings

warnings.filterwarnings("ignore")
base_url = 'https://malpedia.caad.fkie.fraunhofer.de'
url = base_url + '/families'

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}


def get_page(url):
    # 获取详细信息页面
    req = urllib.request.Request(url=url, headers=headers)
    res = urllib.request.urlopen(req, timeout=100)
    html=res.read().decode('utf-8')
    soup=BeautifulSoup(html)

    # 检查页面是否包含 ransom 字符串
    content = soup.select('.col-xl-12')
    content = [str(x) for x in content]
    content = ''.join(content)
    #print(content)
    if 'ransom' not in content.lower():
        return False

    # 检查时间是否在 2021 年之后
    for item in soup.select('.clickable-row-newtab'):
        date = item.select('.date')[0].text
        year = int(date.split('-')[0])
        if year > 2020:
            return True
    return False

if __name__ == "__main__":
    f = open('result.txt', 'w')

    # 获取主页面
    req = urllib.request.Request(url=url, headers=headers)
    res = urllib.request.urlopen(req, timeout=100)
    html=res.read().decode('utf-8')
    soup=BeautifulSoup(html)
    # 检查每个病毒家族信息
    for item in soup.select('.clickable-row'):
        os = item.select('.os > .fa-windows')  # 检查操作系统信息
        if not os:
            os = item.select('.os > .fa-linux')
            if not os:
                continue
        title = item.select('.common_name')[0].text  # 获得家族名称
        title = title.strip()
        page = base_url + item['data-href']  # 获得详细信息页面路径
        print(title)
        #print(page)

        status = get_page(page)

        if status:
            f.write(title + '\t' + page + '\n')  # 将结果写入文件
            print(title + '\t' + page + '\n')
        #time.sleep(1)

    f.close()

你可能感兴趣的:(记录,python,开发语言,安全,网络安全)