爬虫学习日记第八篇(爬取fofa某端口的协议排行及其机器数目,统计top200协议)

news2024/11/17 0:02:06

需求

找到最常用的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 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 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 Options

options = 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 json

from selenium.webdriver.chrome.service import Service

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
from selenium.webdriver.chrome.options import Options

from 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 (iPod; U; CPU iPhone OS 2_1 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20"')

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而不是loads
    cookies_list = json.load(f)

    # 将expiry类型变为int
    for 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_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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1113521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用护眼灯到底好不好?好用热门的护眼台灯推荐

现在市面上做护眼灯的品牌非常多,有的是脚踏实地,真正做保护消费者眼睛的产品,有的则是夸大宣传,以次充好来收割很多不明真相的群众。其实护眼灯的防蓝光是做不到完全无蓝光的,那些宣传完全无蓝光的商家,完…

doc与docx文档转html,格式样式不变(包含图片转换)

最近做一个富文本的需求,要求把文档内容转换到富文本内,文档中的格式也好,样式也好,图片啥的都要一致展示;踩了不少坑,据说word文档其实是一个压缩包,我不是特别清楚但是也能理解,自…

爬虫用什么库更事半功倍?

1、首先,我们需要安装 TypeScript 和 superagent 库。在命令行中运行以下命令来安装它们: npm install typescript npm install superagent2、创建一个新的 TypeScript 项目,并在项目中创建一个名为 crawler 的文件夹。在 crawler 文件夹中&a…

Qt判断一个点在多边形内还是外(支持凸边形和凹变形)

这里实现的方法是转载于https://blog.csdn.net/trj14/article/details/43190653和https://blog.csdn.net/WilliamSun0122/article/details/77994526 来实现的,并且按照Qt的规则进行了调整。 以下实现方法有四种,每种方法的具体讲解在转载的博客中有说明&…

低代码到底是什么?

究竟什么样的新技术,才能真正解放IT生产力,加速社会数字化转型,Make The World Great Again?我认为是低代码(Low-Code)。 “Low-Code”是什么?“Code”是指代码,但这个“Low”字是啥…

DFS(分布式文件系统)与 DFSR(分布式文件系统复制)的区别

DFS(分布式文件系统)和 DFSR(分布式文件系统复制)是两种不同的技术,尽管它们在名称上有一些相似之处,但它们的用途和功能有所不同。 DFS(分布式文件系统) DFS 是一种用于创建和管理…

tinker官网加载demo的使用流程

tinker官网加载demo的使用流程 0,首先开接入指南: https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97 1,在gradle 找到tinker的插件,来判断tinker是否集成成功。 2,安装一个现在有…

TikTok:年轻一代的创新驱动力与社会影响

在当今数字媒体和社交网络的时代,TikTok已经崭露头角,成为一个风靡全球的短视频平台,尤其受到年轻一代的热烈欢迎。 但TikTok不仅仅是一个娱乐应用,它也代表着年轻一代的创新驱动力和社会影响力的集大成者。本文将深入探讨TikTok…

【微信小程序】6天精准入门(第4天:自定义组件及案例界面)附源码

一、自定义组件 1、介绍 从小程序基础库版本 1.6.3 开始,小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。 开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用;也可以将复杂的页…

LiveQing视频点播流媒体RTMP推流服务功能-支持视频点播分屏大屏展示视频轮巡分组播放RMP推流直播大屏展示

LiveQing支持视频点播分屏大屏展示视频轮播分组播放RMP推流直播大屏展示 1、分屏展示2、轮巡播放3、RTMP推流视频直播和点播流媒体服务 1、分屏展示 LiveQing支持将视频点播、鉴权直播,拉转直播视频流,进行分屏播放。 2、轮巡播放 3、RTMP推流视频直播和…

CRC16计算FC(博途SCL语言)

CRC8的计算FC,相关链接请查看下面文章链接: 博途SCL CRC8 计算FC(计算法)_博途怎么计算crc_RXXW_Dor的博客-CSDN博客关于CRC8的计算网上有很多资料和C代码,这里不在叙述,这里主要记录西门子的博途SCL完成CRC8的计算过程, CRC校验算法,说白了,就是把需要校验的数据与多项式…

企业数字化转型时,会遇到的5大挑战

企业数字化转型时,会遇到的5大挑战添加链接描述 数字化转型已然是当今商业战略的一大基石,根据Gartner的《2023年度董事会调查》显示,有89%的企业将数字业务视为其增长的核心。但该研究的另一项统计数据也显示:在这些企业中&…

会议OA小程序【会议管理,个人中心页面布局】

目录 一. 自定义组件介绍 1.1 概念 1.2 创建自定义组件 二. 会议管理页面布局 使用自定义组件 页面布局及样式 三. 个人中心页面布局 一. 自定义组件介绍 1.1 概念 从小程序基础库版本 1.6.3 开始,小程序支持简洁的组件化编程。所有自定义组件相关特性都需…

新服务入驻生产环境 CICD 全流程、自动化脚本教程

文章目录 背景CICD百花齐放 “四部曲”实现优势涉及文件核心流程ci.ymlMakefilepackage.shnoah_control 小结 背景 新服务功能完成测试后,将会进行生产环境的入住,对外提供产品、功能支持。那么如何规范的、安全的、自动化的把本地服务移植到生产环境呢…

uniapp无感刷新token实现过程

路漫漫其修远兮,前端道路逐渐迷茫,时隔好久好久终于想起了我还有一个小博客,最近在一直在弄uniapp,属实有被恶心到,但也至少会用了,最近实现了一个比较通用的功能,就是无感刷新token&#xff0c…

如何下载和安装 Linux Red Hat 9.0安装包

【微|信|公|众|号:厦门微思网络】 官网: www.xmws.cn 【限时优惠】RHCE9.0培训考证-红帽官方授权中心-CSDN博客通过这门课程,您将能够更好的理解企业级需求和解决方案,提升您的战略思 维和决策能力并助力您为企业升级使用新的技…

【C++】引用之带你“消除”C语言版数据结构教材的一些困惑(虽然是C++的内容,但是强烈建议正在学习数据结构的同学点进来看看)

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 引用的概念 引用的特性 引用的使用场…

Django实现音乐网站 ⒇

使用Python Django框架做一个音乐网站, 本篇音乐播放器-添加播放音乐功能实现。 目录 创建播放器数据表 设置表结构 执行创建表 命令 执行 数据表结构 添加单个歌曲 创建路由 加入播放器视图 模板处理 基类方法 子页面调用 优化弹窗 加入layui文件 基…

DPDK收发包流程分析

一、 前言 DPDK是intel工程师开发的一款用来快速处理数据包的框架,最初的目的是为了证明传统网络数据包处理性能低不是intel处理器导致的,而是传统数据的处理流程导致,后来随着dpdk的开源及其生态的快速发展,dpdk成为了高性能网络数据处理的优秀框架。本篇文章主要介绍DPDK…

游戏动态库缺失

缺哪个动态库就搜哪个,再下载下来。 百度网盘:链接:https://pan.baidu.com/s/1TlxLtL3hg_iCCvtCzT7bXw 提取码:8888 文件下载完之后要放到指定的位置 C:\Windows\System32