爬虫学习日记第八篇(爬取fofa某端口的协议排行及其机器数目,统计top200协议)
需求
找到最常用的200个协议

通过fofa搜索端口,得到协议排名前五名和对应机器的数目。
遍历端口,统计各个协议对应的机器数目(不准,但能看出个大概)
读写API
API需要会员,一天只能访问1000次。
import base64
import urllib
from time import sleep
import requests
res = {}
def onePort(j):text = 'port="' + str(j) + '"'text = base64.b64encode(text.encode("utf-8")).decode("utf-8")text = urllib.parse.quote(text)URL = f'https://fofa.info/api/v1/search/stats?fields=protocol&qbase64={text}&email=*****&key=*****'r = requests.get(URL)response_dict = r.json()print("当前端口为:",j)print(response_dict)protocols=response_dict['aggs']['protocol']for i in protocols:if i['name'] in res:res[i['name']] = res[i['name']] + i['count']else:res[i['name']] = i['count']print(res)for i in range(1,65535):onePort(i)sleep(10)
爬虫
页面动态加载,由于动态渲染的问题,有的请求返回结果为空。
单线程,未登录爬虫代码
import base64
import json
import urllib
from concurrent.futures import ThreadPoolExecutorfrom selenium import webdriver
from selenium.webdriver.chrome.service import Service
from lxml import etree
from time import sleep
#直接添加这四行代码
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless')
# options.add_argument('--disable-gpu')failed=[]
success=[]
res = {}
def onePort(j):s = Service(r".\chromedriver.exe")driver = webdriver.Chrome(service=s,options=options)text = 'port="' + str(j) + '"'text = base64.b64encode(text.encode("utf-8")).decode("utf-8")text = urllib.parse.quote(text)print(text)driver.get("https://fofa.info/result?qbase64=" + text)sleep(7)page_text = driver.page_source# print(page_text)tree = etree.HTML(page_text)protos = tree.xpath('//div[@class="hsxa-ui-component hsxa-meta-data-statistical-list hsxa-pos-rel"]/div[13]//li//a/text()')nums = tree.xpath('//div[@class="hsxa-ui-component hsxa-meta-data-statistical-list hsxa-pos-rel"]/div[13]//li//span/text()')for i in range(len(protos)):protos[i] = protos[i].strip(' ')protos[i] = protos[i].strip('\n')protos[i] = protos[i].strip(' ')nums[i] = nums[i].strip(' ')nums[i] = nums[i].strip('\n')nums[i] = nums[i].strip(' ')nums[i] = nums[i].replace(',', '')nums[i] = int(nums[i])if protos[i] in res:res[protos[i]] = res[protos[i]] + nums[i]else:res[protos[i]] = nums[i]print(protos)print(nums)if len(protos) == 0:failed.append(j)else:success.append(j)print("当前端口号:", j)print("失败列表:", failed)print("成功列表:", success)print(res)driver.quit()for j in range(5000,10000):onePort(j)
多线程未登录代码
一定要注意多线程同时读写问题,全局变量上锁
import base64
import json
import urllib
from concurrent.futures import ThreadPoolExecutor
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from lxml import etree
from time import sleep
import threading# 直接添加这四行代码
from selenium.webdriver.chrome.options import Optionsoptions = Options()
options.add_argument('--headless')
# options.add_argument('--disable-gpu')failed = []
success = []
res = {}
lock = threading.Lock() # 创建线程锁def onePort(j):s = Service(r".\chromedriver.exe")driver = webdriver.Chrome(service=s, options=options)text = 'port="' + str(j) + '"'text = base64.b64encode(text.encode("utf-8")).decode("utf-8")text = urllib.parse.quote(text)print(text)driver.get("https://fofa.info/result?qbase64=" + text)sleep(7)page_text = driver.page_source# print(page_text)tree = etree.HTML(page_text)protos = tree.xpath('//div[@class="hsxa-ui-component hsxa-meta-data-statistical-list hsxa-pos-rel"]/div[13]//li//a/text()')nums = tree.xpath('//div[@class="hsxa-ui-component hsxa-meta-data-statistical-list hsxa-pos-rel"]/div[13]//li//span/text()')with lock: # 使用线程锁保护对res变量的读写操作for i in range(len(protos)):protos[i] = protos[i].strip(' ')protos[i] = protos[i].strip('\n')protos[i] = protos[i].strip(' ')nums[i] = nums[i].strip(' ')nums[i] = nums[i].strip('\n')nums[i] = nums[i].strip(' ')nums[i] = nums[i].replace(',', '')nums[i] = int(nums[i])if protos[i] in res:res[protos[i]] = res[protos[i]] + nums[i]else:res[protos[i]] = nums[i]print(protos)print(nums)if len(protos) == 0:failed.append(j)else:success.append(j)print("当前端口号:", j)print("失败列表:", failed)print("成功列表:", success)print(res)driver.quit()with ThreadPoolExecutor(30) as t:for j in range(10000,10500):# 把下载任务提交给线程池t.submit(onePort, j)
手动登录获取cookie代码
# 填写webdriver的保存目录
s = Service(r".\chromedriver.exe")
driver= webdriver.Chrome(service=s)
# 记得写完整的url 包括http和https
driver.get('https://fofa.info')
# 程序打开网页后20秒内 “手动登陆账户”
time.sleep(20)
with open('cookies.txt','w') as f:# 将cookies保存为json格式f.write(json.dumps(driver.get_cookies()))driver.close()
登录账号的单线程爬虫
from selenium import webdriver
import time
import jsonfrom selenium.webdriver.chrome.service import Serviceimport base64
import json
import urllib
from concurrent.futures import ThreadPoolExecutor
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from lxml import etree
from time import sleep
from selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.chrome.options import Options
options = Options()
# options.add_argument('--headless')
# options.add_argument('--disable-gpu')
options.add_argument('user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.46"')failed=[]
success=[]
res = {}s = Service(r".\chromedriver.exe")
driver = webdriver.Chrome(service=s, options=options)driver.get('https://fofa.info')
# 首先清除由于浏览器打开已有的cookies
driver.delete_all_cookies()with open('cookies.txt', 'r') as f:# 使用json读取cookies 注意读取的是文件 所以用load而不是loadscookies_list = json.load(f)# 将expiry类型变为intfor cookie in cookies_list:# 并不是所有cookie都含有expiry 所以要用dict的get方法来获取if isinstance(cookie.get('expiry'), float):cookie['expiry'] = int(cookie['expiry'])driver.add_cookie(cookie)# 重新发送请求(这步是非常必要的,要不然携带完cookie之后仍然在登录界面)
driver.get('https://fofa.info')
# sleep等待页面完全加载出来,这一步很关键
time.sleep(3)j=2
text = 'port="' + str(j) + '"'
text = base64.b64encode(text.encode("utf-8")).decode("utf-8")
text = urllib.parse.quote(text)
print(text)
sleep(10)
driver.get("https://fofa.info/result?qbase64=" + text)
sleep(6)
page_text = driver.page_sourceprint(page_text)tree = etree.HTML(page_text)protos = tree.xpath('//div[@class="hsxa-ui-component hsxa-meta-data-statistical-list hsxa-pos-rel"]/div[13]//li//a/text()')
nums = tree.xpath('//div[@class="hsxa-ui-component hsxa-meta-data-statistical-list hsxa-pos-rel"]/div[13]//li//span/text()')for i in range(len(protos)):protos[i] = protos[i].strip(' ')protos[i] = protos[i].strip('\n')protos[i] = protos[i].strip(' ')nums[i] = nums[i].strip(' ')nums[i] = nums[i].strip('\n')nums[i] = nums[i].strip(' ')nums[i] = nums[i].replace(',', '')nums[i] = int(nums[i])if protos[i] in res:res[protos[i]] = res[protos[i]] + nums[i]else:res[protos[i]] = nums[i]
print(protos)
print(nums)
if len(protos) == 0:failed.append(j)
else:success.append(j)
print("当前端口号:", j)
print("失败列表:", failed)
print("成功列表:", success)
print(res)driver.quit()
登录用户多线程
import threadingfrom selenium import webdriver
import time
import jsonfrom selenium.webdriver.chrome.service import Serviceimport base64
import json
import urllib
from concurrent.futures import ThreadPoolExecutor
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from lxml import etree
from time import sleep
from selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless')
# options.add_argument('--disable-gpu')
options.add_argument('user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.46"')failed=[]
success=[]
res = {}
lock = threading.Lock()def onePort(j):s = Service(r".\chromedriver.exe")driver = webdriver.Chrome(service=s, options=options)driver.get('https://fofa.info')# 首先清除由于浏览器打开已有的cookiesdriver.delete_all_cookies()with open('cookies.txt', 'r') as f:# 使用json读取cookies 注意读取的是文件 所以用load而不是loadscookies_list = json.load(f)# 将expiry类型变为intfor cookie in cookies_list:# 并不是所有cookie都含有expiry 所以要用dict的get方法来获取if isinstance(cookie.get('expiry'), float):cookie['expiry'] = int(cookie['expiry'])driver.add_cookie(cookie)# 重新发送请求(这步是非常必要的,要不然携带完cookie之后仍然在登录界面)driver.get('https://fofa.info')# sleep等待页面完全加载出来,这一步很关键time.sleep(3)text = 'port="' + str(j) + '"'text = base64.b64encode(text.encode("utf-8")).decode("utf-8")text = urllib.parse.quote(text)print(text)driver.get("https://fofa.info/result?qbase64=" + text)sleep(6)page_text = driver.page_sourcetree = etree.HTML(page_text)protos = tree.xpath('//div[@class="hsxa-ui-component hsxa-meta-data-statistical-list hsxa-pos-rel"]/div[13]//li//a/text()')nums = tree.xpath('//div[@class="hsxa-ui-component hsxa-meta-data-statistical-list hsxa-pos-rel"]/div[13]//li//span/text()')with lock: # 使用线程锁保护对res变量的读写操作for i in range(len(protos)):protos[i] = protos[i].strip(' ')protos[i] = protos[i].strip('\n')protos[i] = protos[i].strip(' ')nums[i] = nums[i].strip(' ')nums[i] = nums[i].strip('\n')nums[i] = nums[i].strip(' ')nums[i] = nums[i].replace(',', '')nums[i] = int(nums[i])if protos[i] in res:res[protos[i]] = res[protos[i]] + nums[i]else:res[protos[i]] = nums[i]print(protos)print(nums)if len(protos) == 0:failed.append(j)else:success.append(j)print("当前端口号:", j)print("失败列表:", failed)print("成功列表:", success)print(res)driver.quit()with ThreadPoolExecutor(1) as t:for j in range(3679,4000):# 把下载任务提交给线程池t.submit(onePort, j)相关文章:
爬虫学习日记第八篇(爬取fofa某端口的协议排行及其机器数目,统计top200协议)
需求 找到最常用的200个协议 通过fofa搜索端口,得到协议排名前五名和对应机器的数目。 遍历端口,统计各个协议对应的机器数目(不准,但能看出个大概) 读写API API需要会员,一天只能访问1000次。 import…...
LeetCode 1425. 带限制的子序列和【动态规划,单调队列优化】2032
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
强化学习问题(7)--- Python和Pytorch,Tensorflow的版本对应
1.问题 之前下载的python3.8,在对应Pytorch和Tensorflow时没太在意版本,在运行一些代码时,提示Pytorch和Tensorflow版本过高,直接降下来,有时候又和Python3.8不兼容,所以又在虚拟环境搞一个Pyhon3.7&#x…...
Python —— UI自动化之使用JavaScript进行元素点亮、修改、点击元素
1、JavaScript点亮元素 在控制台通过JavaScript语言中对元素点亮效果如下: 将这个语句和UI自动化结合,代码如下: locator (By.ID,"kw") # 是元组类型 web_element WebDriverWait(driver,5,0.5).until(EC.visibility_of_eleme…...
input表单的23个type属性
在HTML中,<input>标签用于创建输入框。type属性用于指定输入框的类型。以下是23个可能的type属性及其用途: text:普通文本输入框。password:密码输入框,输入的内容会显示为圆点或星号。email:电子邮…...
优先级总结
目录 越小越优先 1.路由协议 2.路由开销 3.STP 4.Ethernet-trunk(LACP) 越大越优先 1.VRRP 2.Router-id 3.DR/BDR 越小越优先 1.路由协议 取值范围:0~255 直连路由0 静态路由/默认路由60 RIP路由100 OSPF路由10或150 BGP路由255 2…...
Windows 11中无法通过默认应用更改文件关联
这里写自定义目录标题 现象解决方法 这里以.md格式文件为例。 现象 在 Windows 11 计算机上安装第三方软件后,关联 JPG、JPE、JPEG、PNG、MPG、MPEG、MD 等文件类型和其他文件类型的能力可能会受到阻碍。以下是尝试更改上述文件类型的文件关联时可能遇到的问题。 …...
小插曲 -- 使用Visual Studio Code远程连接香橙派
在之前的学习中,代码的修改和保存都依赖于“vi”指令,而不得不承认vi指令的编辑界面非常原始,所以,如果可以将代码编辑放到更友好的环境里进行无疑是一件大快人心的事情。 本节介绍如何通过Visual Studio Code来进行远程连接: Vi…...
留意差距:弥合网络安全基础设施的挑战
您最近一直在关注日益增加的网络威胁吗?如果您发现自己沉浸在 IT 或技术中,那么您可能会永远追求与时俱进。每天都会出现新的漏洞,这对保持消息灵通提出了巨大的挑战。 构建和维护能够应对复杂攻击者的网络安全基础设施所面临的挑战是真实存…...
【vSphere 8 自签名证书】企业 CA 签名证书替换 vSphere Machine SSL 证书Ⅰ—— 生成 CSR
目录 替换拓扑图证书关系示意图说明 & 关联博文 1. 默认证书截图2. 使用certificate-manager生成CSR2.1 创建存放CSR的目录2.2 记录PNID和IP2.3 生成CSR2.4 验证CSR 参考资料 替换拓扑图 证书关系示意图 默认情况下,VMCA 与 Machine SSL的关系是 本系列博文要…...
TypeScript中extends的用法
介绍 extends 关键字在 TypeScript 中有多种应用,包括泛型约束、继承类、接口继承和条件类型。通过灵活使用 extends,TypeScript 提供了丰富的工具来增强类型安全性,使代码更具表现力和可维护性。 1. 约束接口的继承 extends 关键字也可用于…...
手把手创建属于自己的ASP.NET Croe Web API项目
第一步:创建项目的时候选择ASP.NET Croe Web API 点击下一步,然后配置: 下一步:...
【Javascript】数组的基本操作
目录 声明 字面量形式 构造函数声明 访问数组中的元素 数组的长度 增删改查 增 通过索引添加数据 在数组后面添加数据 在数组前添加数据 删 删除数组中最后一个元素 删除数组中第一个元素 改 查 数组是⼀种列表对象,它的原型中提供了遍历和修改元素的…...
Jupyter Notebook 设置黑色背景主题
Jupyter Notebook 设置黑色背景主题 # 包安装 pip install jupyterthemes -i https://mirrors.aliyun.com/pypi/simple pip install --upgrade jupyterthemes # 查看可用主题 jt -l # monokai暗背景,-f(字体) -fs(字体大小) -cellw(占屏比或宽度) -ofs(输出段的字…...
1 Go的前世今生
概述 Go语言正式发布于2009年11月,由Google主导开发。它是一种针对多处理器系统应用程序的编程语言,被设计成一种系统级语言,具有非常强大和有用的特性。Go语言的程序速度可以与C、C相媲美,同时更加安全,支持并行进程。…...
面试-Redis-缓存击穿
问:什么是缓存击穿 ? 怎么解决 ? 答:缓存击穿的意思是对于设置时间过期的key,当key过期时,恰好有大量对这个key的请求发送过来,此时这些请求发现这个key过期,就会打到数据库加载数据并设置缓存ÿ…...
80个国内可用的Chatgpt网页版(2023.10.21更新)
ChatGPT:革命性的人工智能语言模型 ChatGPT,一款能够与人类进行自然流畅对话的人工智能语言模型,通过大量训练数据和先进算法,展现出卓越的自然语言处理能力。它能理解并回应人类问题,提供准确、连贯且有意义的答案&a…...
Android 10.0 Launcher3定制化之动态时钟图标功能实现
1.概述 在10.0的系统产品rom定制化开发中,在Launcher3中的定制化的一些功能中,对于一些产品要求需要实现动态时钟图标功能,这就需要先绘制时分秒时针表盘,然后 每秒刷新一次时钟图标,时钟需要做到实时更新,做到动态时钟的效果,接下来就来分析这个功能的实现 如图: 2.动…...
HTTPS、SSL/TLS,HTTPS运行过程,RSA加密算法,AES加密算法
1、为什么网站要使用安全证书 我们所处的网络环境是复杂多样的,大致分为两类,一类是可信的网络服务商,比如直接连的电信运营商的网络,网线,4G,5G;另一类是不可信的网络,比如WIFI&am…...
python之Scrapy爬虫案例:豆瓣
运行命令创建项目:scrapy startproject scrapySpider进入项目目录:cd .\scrapySpider\运行命令创建爬虫:scrapy genspider douban movie.douban.com目录结构说明|-- scrapySpider 项目目录 | |-- scrapySpider 项目目录 | | |-- spider…...
国家电网投标人的福音:一个专治ECP压缩包痛点的轻量工具
你是不是也受够了? 每天蹲守国家电网ECP平台,点开标包看到的却是层层嵌套的压缩包——.zip 里套 .zip,.zip里混着 .doc 和 .docx和.xlsx .xls。想判断一个项目能不能投,光下载解压就要花一小时。更头疼的是,市面上 乙方…...
kali 软件源设置为国内站点配置详解
Kali Linux 国内镜像源配置指南备份原始源列表执行以下命令备份原始配置文件:sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak阿里云镜像源配置sudo tee /etc/apt/sources.list << EOF deb https://mirrors.aliyun.com/kali kali-rolling main non-…...
从GKCTF 2021 CheckBot看CSRF攻击的实战应用
1. CSRF攻击初探:从CheckBot题目说起 第一次看到GKCTF 2021的CheckBot题目时,我眼前一亮——这简直是个教科书级的CSRF实战案例。题目设计得很巧妙:你需要让一个自动化的bot(可以理解为模拟管理员行为的程序)点击你构造…...
Agent深度问题
一. skills和sub agent的区别 在 AI Agent 架构体系中,Skills(技能) 和 Sub Agent(子智能体) 是两种核心的能力扩展方案,二者的核心差异在于是否具备独立推理规划能力、是否拥有独立上下文生命周期,可通俗理解为「工具箱里的专用工具」与「可独立干活的专项专家」的区别…...
AI净界RMBG-1.4在电商场景的应用:自动生成商品白底图实战
AI净界RMBG-1.4在电商场景的应用:自动生成商品白底图实战 1. 电商商品图的痛点与解决方案 在电商运营中,商品主图的质量直接影响转化率。平台要求主图必须是纯白背景,但传统处理方法面临三大难题: 成本高:专业摄影师…...
Pixel Couplet Gen应用场景:银行APP春节活动——客户姓名定制像素春联
Pixel Couplet Gen应用场景:银行APP春节活动——客户姓名定制像素春联 1. 项目背景与价值 在数字化时代,传统节日活动也需要创新形式来吸引年轻用户。银行APP作为金融服务入口,如何在春节这样的重要节日提升用户活跃度和品牌亲和力…...
免安装定时音乐播放工具,适用于校园上下课铃声与考试提示音自动播放
温馨提示:文末有资源获取方式免安装绿色音乐定时播放器这是一款无需安装的绿色版定时音乐播放软件,专为学校等教育场景设计。 用户只需双击主程序即可运行,无需复杂配置或注册表修改,真正实现即开即用,方便快捷。适用于…...
Qwen-Image-2512像素艺术生成实战:从提示词设计到风格控制全流程
Qwen-Image-2512像素艺术生成实战:从提示词设计到风格控制全流程 1. 像素艺术创作新选择 最近在尝试用AI生成像素艺术时,发现了一个特别有意思的组合:Qwen-Image-2512模型加上专门优化的Pixel Art LoRA。这个搭配能生成质量惊人的像素风格图…...
别再被‘ANOMALY: meaningless REX prefix’弹窗搞懵了!手把手教你排查Python环境、杀软和系统监控的锅
解码"ANOMALY: meaningless REX prefix":从Python环境到系统监控的全链路排查指南 当你正在Windows终端中专注地执行命令,突然弹出一个令人困惑的警告——"ANOMALY: meaningless REX prefix used"。这个看似晦涩的错误不仅打断了你的…...
别再手动拆PDF了!用Python+Unstructured库,5分钟搞定RAG数据预处理
别再手动拆PDF了!用PythonUnstructured库,5分钟搞定RAG数据预处理 每次面对堆积如山的PDF技术文档时,你是否也经历过这样的崩溃瞬间?用传统工具提取的文本丢失了所有表格和排版格式,手动调整段落边界时鼠标点到手抽筋&…...
