二开webalive(判断网站存活,方便后续去重)

用法:

python38 whichAlive.py -f url.txt -t 5  --proxy 127.0.0.1:8080

python38 whichalive.py -f url.txt  -t 5 -d --try-again

二开内容:

1.  增加了识别标题的准确性。

2. 当获取不到标题的时候,响应内容计算hash值保存到标题中。

whichAlive.py代码:

import argparse
import csv
import datetime
import hashlib
import os
import re
import socket
import time
import urllib
import urllib.parse
from concurrent.futures import ALL_COMPLETED, ThreadPoolExecutor, waitimport requests
import urllib3
from bs4 import BeautifulSoup
import chardeturllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
DEBUG = False
TRYAGAIN = Falseclass whichAlive(object):def __init__(self, file, THREAD_POOL_SIZE=10, allow_redirect=False, PROXY={}):self.file = fileself.filename = ''.join(file.split('/')[-1].split('.')[:-1])self.timenow = str(time.time()).split(".")[0]self.outfilename = f'{self.filename}{self.timenow}.csv'self.errorfilename = f'error_{self.filename}{self.timenow}.txt'self.urllist = self.__urlfromfile()self.tableheader = ['no', 'url', 'ip', 'state', 'state_code', 'title', 'server', 'length', 'other']self.HEADER = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',}self.THREAD_POOL_SIZE = THREAD_POOL_SIZEself.allurlnumber = len(self.urllist)self.completedurl = -1self.allow_redirect = allow_redirectself.PROXY = PROXYdef run(self):self.completedurl += 1self.__writetofile(self.tableheader)tasklist = []start_time = datetime.datetime.now()t = ThreadPoolExecutor(max_workers=self.THREAD_POOL_SIZE)for k, url in enumerate(self.urllist):tasklist.append(t.submit(self.__scan, url, k+1))print(f'total {self.allurlnumber}')if wait(tasklist, return_when=ALL_COMPLETED):end_time = datetime.datetime.now()print(f'--------------------------------\nDONE, use {(end_time - start_time).seconds} seconds')print(f'outfile: {os.path.join(os.path.abspath(os.path.dirname(__file__)), "result", self.outfilename)}')def __scan(self, url, no, tryagainflag=False):def callback(no, url, ip, state, state_code, title, server, length, other):self.completedurl += 1thisline = [no, url, ip, state, state_code, title, server, length, other]nowpercent = '%.2f'%((self.completedurl/self.allurlnumber)*100)print(f'[{nowpercent}%] {url} {ip} {state} {title} {length}')self.__writetofile(thisline)ip = ''state = ''state_code = -1title = ''server = ''length = -1other = ''try:if DEBUG: print(f'[+] {no} {url}')u = urllib.parse.urlparse(url)ip = self.__getwebip(u.netloc.split(':')[0])if self.allow_redirect:r = requests.get(url=url, headers=self.HEADER, timeout=15, verify=False, proxies=self.PROXY, allow_redirects=True)titles = [self.__getwebtitle(r)]  # 添加最后的响应标题lengths = [str(self.__getweblength(r))]servers = [self.__getwebserver(r)]for response in r.history:titles.insert(0, self.__getwebtitle(response))lengths.insert(0, str(self.__getweblength(response)))servers.insert(0, self.__getwebserver(response))state = 'alive'state_code = '->'.join([str(i.status_code) for i in r.history] + [str(r.status_code)])title = '->'.join(titles)length = '->'.join(lengths)server = '->'.join(servers)else:r = requests.get(url=url, headers=self.HEADER, allow_redirects=False, timeout=15, verify=False, proxies=self.PROXY)state = 'alive'state_code = r.status_codetitle = self.__getwebtitle(r)length = self.__getweblength(r)server = self.__getwebserver(r)callback(no, url, ip, state, state_code, title, server, length, other)except requests.exceptions.ConnectTimeout as e:if DEBUG: print(f'[ConnectTimeout] {url} {e}')self.__errorreport(str(e))state = 'dead'callback(no, url, ip, state, state_code, title, server, length, 'ConnectTimeout')except requests.exceptions.ReadTimeout as e:if DEBUG: print(f'[ReadTimeout] {url} {e}')self.__errorreport(str(e))state = 'dead'callback(no, url, ip, state, state_code, title, server, length, 'ReadTimeout')except requests.exceptions.ConnectionError as e:if DEBUG: print(f'[ConnectionError] {url} {e}')self.__errorreport(str(e))state = 'dead'callback(no, url, ip, state, state_code, title, server, length, 'ConnectionError')except Exception as e:if DEBUG: print(f'[ERROR] {no} {url} {e}')self.__errorreport(str(e))if TRYAGAIN and not tryagainflag:self.__scan(url, no, True)callback(no, url, ip, state, state_code, title, server, length, 'e')def __getwebtitle(self, response):try:detected_encoding = chardet.detect(response.content)['encoding']if detected_encoding is None:detected_encoding = 'utf-8'  # 默认编码content = response.content.decode(detected_encoding, errors='replace')soup = BeautifulSoup(content, 'html.parser')title_tag = soup.find('title')if title_tag:return title_tag.get_text(strip=True)else:# 如果未找到标题,计算内容的哈希值并返回content_hash = hashlib.md5(content.encode(detected_encoding, errors='replace')).hexdigest()return f'Hash-{content_hash[:8]}'  # 返回哈希值的前8位作为标题except Exception as e:if DEBUG: print(f'[getwebtitle ERROR] {e}')# 在无法解码内容的情况下返回哈希值content_hash = hashlib.md5(response.content).hexdigest()return f'Hash-{content_hash[:8]}'def __getwebip(self, domain):try:ip = socket.getaddrinfo(domain, 'http')return ip[0][4][0]except:return ''def __getweblength(self, response):try:return len(response.content)except Exception as e:if DEBUG: print(f'[getweblength ERROR] {e}')return -1def __getwebserver(self, response):try:return response.headers.get('server') if response.headers.get('server') else ''except:return ''def __urlfromfile(self):with open(self.file, 'r') as f:return [i.strip() for i in f.readlines()]def __writetofile(self, data: list):with open(f'result/{self.outfilename}', 'a', newline='', encoding='utf-8') as f:writer = csv.writer(f)writer.writerow(data)def __errorreport(self, message):with open(f'error/{self.errorfilename}', 'a', encoding='utf-8') as f:f.write(message + '\n')if __name__ == '__main__':parser = argparse.ArgumentParser(usage='whichAlive usage')parser.add_argument('-f', '--file', default='url.txt', help='URL lists file.')parser.add_argument('--proxy', default='', help='Set proxy, such as 127.0.0.1:8080')parser.add_argument('-t', '--thread', default=10, type=int, help='Set max threads, default 10')parser.add_argument('-d', '--debug', default=False, action='store_true', help='print some debug information')parser.add_argument('--try-again', default=False, action='store_true', help='If some error, try again scan that url once', dest='tryagain')args = parser.parse_args()DEBUG = args.debugTRYAGAIN = args.tryagainw = whichAlive(file=args.file,THREAD_POOL_SIZE=args.thread,allow_redirect=True,PROXY={'http': args.proxy, 'https': args.proxy})w.run()

mysql数据库去重语句:使用weblive的结果

navicat 导入 --  编码选择第一个 系统默认编码 -- 分隔符选无。就能导入全部的weblive结果了。


1. 给每行插入序列id:

ALTER TABLE results2 ADD id INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST;


2. 通过`host`,`status`,`contentLength`,`banner`,`title` 字段删除重复,保留最大的id

DELETE FROM results2 WHERE id NOT IN (SELECT id  FROM (SELECT MAX(id) id FROM results2 GROUP BY `ip`,`state_code`,`title`,`Length`,`server`) cc);

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

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

相关文章

【设计模式】设计模式的八大原则

设计模式的八个原则: 依赖倒置原则: 高层次的代码(稳定)不应该依赖低层次的代码(变化)抽象的代码不应该依赖具体的代码。 开放封闭原则:类模块应该开放扩展的,而其原先的代码尽量封…

mfc140u.dll错误是什么情况?如何将mfc140u.dll丢失的解决方法详细分析

mfc140u.dll是 Microsoft Foundation Class (MFC) 库的一部分,通常与 Visual Studio 2015 及其后续版本相关联。如果系统中缺少 mfc140u.dll,可能会导致依赖该库的应用程序无法启动,并显示错误消息,如“程序无法启动,因…

分类预测|基于麻雀优化支持向量机的Adaboost集成的数据分类预测Matlab程序SSA-SVM-Adaboost

分类预测|基于麻雀优化支持向量机的Adaboost集成的数据分类预测Matlab程序SSA-SVM-Adaboost 文章目录 一、基本原理SSA-SVM-Adaboost 分类预测原理和流程总结 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 SSA-SVM-Adaboost 分类预测原理和流程 1. 麻雀优化算…

408算法题leetcode--第二天

1281. 整数的各位积和之差 1281. 整数的各位积和之差\思路:模拟,用取余获取每一位数时间复杂度:O(n的位数) O(logn),空间复杂度:O(1) class Solution { public:int subtractProductAndSum(int n) {int mul 1, sum …

开源FormCreate低代码表单组件的配置项和事件的详解

在使用开源FormCreate低代码表单时,您可以通过各种 props 来定制表单的行为和外观。这些参数允许您控制表单的生成规则、配置选项、双向数据绑定等,为复杂的表单场景提供了强大的支持。 源码地址: Github | Gitee FormCreate组件Props 以下是常用的 pr…

由于安装nvm 引发的vue : 无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

🎈亲爱的读者朋友们: 如果你觉得这篇文章对你有所帮助,恳请你为我点个赞👍。你的每一个赞都是对我辛勤创作的认可,是我继续前行的动力源泉。 同时,也欢迎你关注我的 CSDN 博客。在这里,我会持续…

探索数据可视化的奥秘:Seaborn库的魔力

文章目录 探索数据可视化的奥秘:Seaborn库的魔力背景:为何选择Seaborn?Seaborn是什么?如何安装Seaborn?简单函数介绍与示例场景应用示例常见问题与解决方案总结 探索数据可视化的奥秘:Seaborn库的魔力 背景…

深度剖析iOS渲染

iOS App 图形图像渲染的基本流程: 1.CPU:完成对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制。 2.GPU:GPU拿到CPU计算好的显示内容,完成纹理的渲染, 渲染完成后将渲…

c# Csv文件读写示例,如果文件存在追加写入

功能 1.写入 2.读取 导出文件效果 调用示例 注意示例中的ToDataTable()方法是自己的封装的扩展方法&#xff0c;源码在集合扩展方法-CSDN博客 private List<MarkDataModel> createMarkDataList(int count){var markDataModels new List<MarkDataModel>();for (…

Linux计算文件权限的mode和umask

文章目录 文件权限文件权限的三类用户文件权限的三种类型mode 的格式常见的权限设置示例 umask的作用umask 的作用例子常见 umask 设置 通过位操作计算权限解释公式的背景位操作解释具体例子 文件权限 在 Unix/Linux 系统中&#xff0c;文件权限通过 mode 来指定&#xff0c;通…

LINUX下载编译zlog

下载 Tags HardySimpson/zlog GitHub 解压编译 make 检查 $ ll src/libzlog.a -rw-rw-r-- 1 weiyu weiyu 745782 9月 9 19:17 src/libzlog.a

Python青少年简明教程:类和对象入门

Python青少年简明教程&#xff1a;类和对象入门 Python支持多种编程范式&#xff08;programming paradigms&#xff09;&#xff0c;即支持多种不同的编程风格和方法。初学者开始重点学习关注的编程范式&#xff0c;一般而言是面向过程编程和面向对象编程。面向过程编程&#…

RTMP播放器延迟最低可以做到多少?

技术背景 RTMP播放器的延迟可以受到多种因素的影响&#xff0c;包括网络状况、推流设置、播放器配置以及CDN分发等。因此&#xff0c;RTMP播放器的延迟并不是一个固定的数值&#xff0c;而是可以在一定范围内变化的。 正常情况下&#xff0c;网上大多看到的&#xff0c;针对R…

email2case生成case的过程是以哪个用户的触发的

在 Salesforce 中&#xff0c;通过 Email-to-Case 生成的 Case 其实是由一个特定的用户在后台系统中触发的&#xff0c;这个用户通常称为 Automated Case User。这个用户负责代表系统执行 Email-to-Case 的所有自动化操作。 1. Automated Case User Automated Case User 是一…

docker 重启容器且修改服务映射端口

要重启 Docker 容器并修改服务的映射端口,可以按照以下步骤进行操作: 1. 停止当前运行的容器 如果你想重新配置端口,通常需要先停止当前运行的容器。你可以使用以下命令停止容器: docker stop <container_name_or_id>2. 删除现有容器 为了修改端口映射,你需要删…

小琳AI课堂:LLaMA 3.1 开源大模型的全新里程碑

引言 大家好&#xff0c;这里是小琳AI课堂&#xff01;今天我们要聊的是Meta最新发布的开源大模型LLaMA 3.1。这个版本在AI界掀起了不小的波澜&#xff0c;不仅在参数规模上有显著提升&#xff0c;还在多项性能上实现了突破。让我们一起来看看LLaMA 3.1带来的新变化和意义吧&a…

爆改YOLOv8|利用SCConv改进yolov8-即轻量又涨点

1&#xff0c;本文介绍 SCConv&#xff08;空间和通道重构卷积&#xff09;是一种高效的卷积模块&#xff0c;旨在优化卷积神经网络&#xff08;CNN&#xff09;的性能&#xff0c;通过减少空间和通道的冗余来降低计算资源的消耗。该模块由两个核心组件构成&#xff1a; 空间重…

PHP轻量级高性能HTTP服务框架 - webman

摘要 webman 是一款基于 workerman 开发的高性能 HTTP 服务框架。webman 用于替代传统的 php-fpm 架构&#xff0c;提供超高性能可扩展的 HTTP 服务。你可以用 webman 开发网站&#xff0c;也可以开发 HTTP 接口或者微服务。 除此之外&#xff0c;webman 还支持自定义进程&am…

策略模式实现搜索功能

概念&#xff1a; 策略模式是一种行为设计模式&#xff0c;用于定义一系列算法&#xff0c;将他们封装起来&#xff0c;并使他们可以互相替换。使用策略模式可以让代码更加灵活&#xff0c;且易于扩展和维护 背景&#xff1a; 假设你有一个功能需要多种不同的算法或行为实现…

Obsidian git sync error / Obsidian git 同步失敗

Issue: commit due to empty commit message Solution 添加commit資訊&#xff0c;確保不留空白 我的設置&#xff1a;auto-backup: {{hostname}}/{{date}}/