Python批量查询恶意地址信息

python学习续集,之前已经学习过一部分的基础,学习了差不多15天左右吧,都是零散的学习,因为上班加班的缘故,基本上平均下来每天2小时学习时间。
在偶然情况下发现工作群里有人发出下面的疑问在这里插入图片描述
突然想到python好像可以做到,就上网查了一下,涉及可以查询恶意地址信息的有以下几个网址。

一、需求解决思路

(一)、寻找可获取到恶意IP信息的网站

可获取目标数据网站:

  1. 360威胁情报中心
  2. 安恒威胁情报中心
  3. 绿盟威胁情报中心(NTI)
  4. 奇安信威胁情报中心
  5. VenusEye威胁情报中心
(二)、目前掌握以及项目所使用的技术分析

爬虫是一种按照一定规则,自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析已成为如今主流的爬取策略。

项目预计需要使用的技术知识

  1. python基础知识
  2. python requests库 #向网站请求的模块,相似的还有urllib2和urllib3,requests相对于urllib模块更简洁,对于我这样的新手比较简单
  3. python json库 #JSON,文件存储格式,全称为JavaScript Object Notation,以对象和数组的组合来表示数据
  4. python xlwt、xlrd库 #excel读取和写入模块

Python爬虫步骤:

  1. 准备工作

    通过浏览器查看分析目标网页,确认目标数据链接

  2. 获取数据

    通过http库向目标站点发起请求,请求可以包含额外的header等信息,如果服务器能正常响应,会得到一个Response,这就是所要获取的页面内容

  3. 解析内容

    得到的内容可能是HTML,JSON等格式,可以用页面解析库、正则表达式等进行解析

  4. 保存数据

    保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件

(三)、分析目标网站数据获取链接

1、360威胁情报中心

第一步>>以浏览器方式正常访问目标网站
在这里插入图片描述

夭折——未登录情况下出现验证模块 #后续深入学习后再更,(◡‿◡)目前寻找模式比较单一的网站,验证模块其实也是一种反爬技术,爬虫会增加服务器负担,所以如果你是管理员,你会讨厌爬虫的。

2、安恒威胁情报中心

… 0.0,继续夭折 #未登录情况下出现验证模块

3、绿盟威胁情报中心(NTI)、

。。。。。。,还是夭折 #未登录情况下出现验证模块

4、奇安信威胁情报中心

还是需要验证,继续夭折 #未登录情况下出现验证模块

5、VenusEye威胁情报中心

第一步>>以浏览器方式正常访问目标网站

在这里插入图片描述
在这里插入图片描述

(),终于,未登录情况下查询恶意IP信息的网站找到了

第二步>>使用浏览器F12抓包工具查找可获取信息的URL

在这里插入图片描述

在这里插入图片描述

从图中可知,浏览器向URL:https://www.venuseye.com.cn/ve/ip 以POST方式发送请求,携带查询参数:52.4.209.250

,图中Response Headers里的content-type表明,网站返回的是JSON数据

import requests	#注入requests模块以使用该模块的函数

url = 'https://www.venuseye.com.cn/ve/ip'	#请求目标链接
head = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}   #设置请求头,表明为“浏览器”的身份,绕过被识别出是Python爬虫
data = {
    'target': '52.4.209.250'
}   # 设置携带需查询的参数

req =requests.post(url=url, headers = head, data=data)  #发起post请求,目标链接为url,头部信息为head,携带参数为data
print(req.status_code)  #输出请求状态码

在这里插入图片描述

输入结果为200,证明请求成功!

参考:常见的错误代码及错误原因

状态码说明详情
200成功服务器已成功处理了请求
400错误请求服务器无法解析该请求
404未找到服务器找不到请求的网页
418被反爬程序返回的数据服务器的反爬程序识别出请求为Python爬虫

以上是一些Python爬数据时常见的状态码。

请求成功后,可尝试输出response结果

...#将req.status_code改为req.content.decode()
print(req.content.decode())	#content是二进制文本,decode为解码,相反的encode为编码

输出以下结果:

在这里插入图片描述

可以从代码再次确认response返回结果为JSON数据,查看浏览器抓包工具的的Preview可更直观的验证结果,Preview为Response的预览结果,内容是一样的,但Response显示的方式跟我们Python输出的结果是一样的

在这里插入图片描述

二、项目实现

经过前两步可以确认,VenusEye威胁情报中心是可以实现项目需求的目标网站,接下来就一步一步实现了,虽然python是面向对象的编程语言,但个人认为,在推敲过程中,还是以面向过程打底先,后面再形成系统的“面向对象”。

第一步,重复上述代码步骤,抓取目标URL的Response
import requests  # 注入requests模块以使用该模块的函数

url = 'https://www.venuseye.com.cn/ve/ip'  # 请求目标链接
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}  # 设置请求头,表明为“浏览器”的身份,绕过反爬程序(最简单的反爬程序)
data = {
    'target': '52.4.209.250'
}  # 设置携带需查询的参数

response = requests.post(url=url, headers=headers, data=data)  # 发起post请求,目标链接为url,头部信息为head,携带参数为data
第二步,以JSON形式输出Response信息

之所以要用JSON,是因为在获取到的response是一个对象,如果想访问对象里的数据,可以是用response.content.decode()response.text,都是获取response里的内容信息,但以这种方式输入结果,是一个字符串形式(str),不方便我们对里面的数据进行获取,所以这里就需要将response转为JSON形式,JSON是将数据转换成字典或数组,形成键值对形式,方便我们对里面的数据进行操作。

...
print(type(response))	# 输出response的类型
<class 'requests.models.Response'>
print(type(response.content.decode()))	# 输出response.content.decode()的类型
<class 'str'>
print(type(response.text))	# 输出response.text的类型
<class 'str'>

转换为JSON形式有两种方法:

1.直接使用json()

result = response.json() #将response转换成JSON形式再将结果赋值给result

2.导入json模块

import json
# json模块提供了编码和解码两种方式,load编码,dump解码,字符串时使用json.loads和json.dumps,文件时使用json.load和json.dump

...
result = json.loads(response)	# 将response转换成JSON形式再将结果赋值给result

这两种方法本质上是一样的,json()实际上是个方法,将第二种方式打包成一个方法,结果是一样的,相对来说,第一种方式更便捷,第二种方式更直观,新手推荐以第二种形式。

转换为json形式后,我们就可以直接选择我们需要的数据了,这里以取“IP地址,开放端口和更新时间"为目标数据进行提取,并将结果输出到excel表格里。

第三步,推导过程
import requests  # 注入requests模块以使用该模块的函数
import xlwt
import time
url = 'https://www.venuseye.com.cn/ve/ip'  # 请求目标链接
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}  # 设置请求头,表明为“浏览器”的身份,绕过被识别出是Python爬虫
data = {
    'target': '52.4.209.250'
}  # 设置携带需查询的参数

response = requests.post(url=url, headers=headers, data=data)  # 发起post请求,目标链接为url,头部信息为head,携带参数为data
result = response.json()
# 这里需要先将时间戳提取出来转换成固定格式的时间
a_time = result['data']['active_time']
timeArray = time.localtime(a_time)
strTime = time.strftime("%Y-%m-%d", timeArray)  
# 创建excel表格
book = xlwt.Workbook(encoding='utf-8') # 设置一个book对象的编码为utf-8
sheet = book.add_sheet('test', cell_overwrite_ok=True)  # 创建名为"test"的表单,cell_overwrite_ok设置cell是否可以复写,True是可以,Flase是不可以
titles_list = ['IP地址', '开放端口', '更新时间']  # 设置表格表头
for i in range(0, len(titles_list)):
    sheet.write(0, i, titles_list[i])  # 在第一行写入表头
    sheet.write(1, 0, str(result['data']['ip']))    # 在第二行,第一列写入IP地址
    sheet.write(1, 1, str(result['data']['ports'])) # 在第二行,第二列写入端口
    sheet.write(1, 2, strTime)  # 在第二行,第三列,写入时间
book.save('恶意IP查询.xlsx')

下面是输出的结果:

在这里插入图片描述

到这里基本的推导过程就结束了,(),接下来就是规整一下,设置成批量查询恶意IP的形式

第四步,面向对象编程
import requests
import time
import xlwt


class PL_qurry_ip:
    # 初始值,这里的初始值是设置相对固定的参数
    def __init__(self):
        self.url = 'https://www.venuseye.com.cn/ve/ip'  # 请求目标链接
        self.headers = {
                        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
                    }  # 设置请求头,表明为“浏览器”的身份,绕过被识别出是Python爬虫
        self.data = {
            'target':''
        }
        self.ip = []
        self.port = []
        self.a_time = []
        self.target = []

    # 读取文件里的IP
    def get_IP(self):
        with open('./ip.txt', 'r') as filename:    # 读取指定文件里的IP,放进self.target这个列表里,这里的文件必须跟程序在同一个根目录下
            for i in filename:
                self.target.append(i.rstrip('\n'))	# rstrip('\n')是去掉尾部的换行符
	
    # 请求数据
    def get_data(self):
        for j in self.target:   # 这里的for循环是逐一读取self.target里的IP
            self.data['target'] = j     # 将读取的IP赋值给data里的target键,data是个字典
            response = requests.post(url=self.url, headers=self.headers, data=self.data)
            result = response.json()
            try:                                # 试着运行
                for data in result['data']:		# 逐一读取result里的data键
                    if 'active_time' in data:	# 如果active_time存在,则执行以下步骤
                        a_time = result['data']['active_time']			# 这里三个步骤是将时间戳提取出来转换成固定格式的时间,因为存在这一步,所以有了需要确认active_time是否存在,因为如果这里可能会出现active_time不存在的情况,则会出现KeyError的bug
                        timeArray = time.localtime(a_time)
                        strTime = time.strftime("%Y-%m-%d", timeArray)
                        
                        self.a_time.append(strTime)		# 将转换的时间加进self.a_time列表,方便后面读取
                        self.ip.append(str(result['data']['ip']))	# 将读取的ip加进self.ip列表,方便后面读取,这里的str()是强制将获取的ip转换成string格式
                        self.port.append(str(result['data']['ports']))	# 将读取的ports加进self.port列表,方便后面读取,这里的str()是强制将获取的ports转换成string格式
            except KeyError:	# 出现KeyError的bug时
                self.a_time.append('无')		# 在a_time列表里加入无
	
    # 保存数据到文件
    def sava_excel(self):
        book = xlwt.Workbook(encoding='utf-8')  # 设置一个book对象的编码为utf-8
        sheet = book.add_sheet('test', cell_overwrite_ok=True)  # 创建名为"test"的表单
        titles_list = ['IP地址', '开放端口', '更新时间']  # 设置表格表头
        for i in range(0, len(titles_list)):
            sheet.write(0, i, titles_list[i])  # 在第一行写入表头
        for j in range(0, len(self.ip)):	# len()是获取self.ip列表的长度,列表里有多少个元素,len()就是几,for循环执行0到self.ip的个数
            sheet.write(j+1, 0, self.ip[j])	# 在excel表里的第二行,第一列写入self.ip里的元素
            sheet.write(j+1, 1, self.port[j].replace('[', '').replace(']', ''))	# 在excel表里的第二行,第二列写入self.port里的元素,replace是去掉数据里的中括号,将中括号替换成空
            sheet.write(j+1, 2, self.a_time[j])	# 在excel表里的第二行,第三列写入self.port里的元素
        book.save("批量查询恶意IP.xlsx")	# 保存为“批量查询恶意IP.xlsx”的文件


#主程序
if __name__ == '__main__':
    t = PL_qurry_ip()	# 建立一个t对象
    t0 = time.time()	# 设置一个程序开始前的时间
    t.get_IP()			# 执行t对象里的get_IP()方法
    t.get_data()		# 执行t对象里的get_data()方法
    t.sava_excel()		# 执行t对象里的sava_excel()方法
    print(time.time()-t0)	# 输出整个程序执行的时间

到这里,可以看出,从获取数据,到解析数据,再到处理数据,一个爬虫程序就结束了。以上的推导过程都是个人的编程推导思路,有哪些错误,请各位大神多多指导!!!!本人在编程方面是新手中的新手,虽然是计算机行业里的,但从未接触过编程项目。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pound

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值