利用python完成多个url状态码的检测
import re
import requests
import json
from threading import Thread,Lock
from concurrent.futures import ThreadPoolExecutor list1 = []
list2 = []
code_list = [200,301,302,401] # 定义正确的状态码 class MyThread(Thread):
'''
用来获取线程的值
'''
def __init__(self,func,args=()):
super(MyThread, self).__init__()
self.func = func
self.args = args
def run(self):
self.result = self.func(*self.args)
def get_result(self):
try:
return self.result
except Exception:
return None def get_url():
'''
打开存放url的文件,并将结果返回出去
:return:
'''
try:
with open('hosts.txt','r',encoding='utf-8') as f:
data = f.readlines()
return data
except Exception: # 文件不存在则返回False
return False def verdictUrl():
'''
从hosts.txt文件中取出url,然后进行合法性检测
:return:
'''
url_list = []
comment_list = []
get_url_res = get_url()
if get_url_res:
for data in get_url_res:
url = data.split(',')[0]
comment = data.split(',')[-1]
try:
res = re.search(r'http\w{0,1}://(\w+\.){2}\w+.*', url).group()
url_list.append(res)
comment_list.append(comment)
except Exception:
print('url:%s 有误'%url)
return (url_list,comment_list)
else:
print('文件不存在......') def getStatusCode(url,comment):
'''
获取网站的状态码,并将它返回出去
:param url:
:param comment:
:return:
'''
global list1,list2
try:
res = requests.head(url)
if res.status_code in code_list:
lock.acquire() # 开始添加互斥锁
list1.append(res.status_code)
lock.release()
except requests.exceptions.ConnectionError:
status = 0 # 自定义状态码
lock.acquire()
list2.append(status)
lock.release()
else:
status = res.status_code # 将状态码赋值给status
finally:
return {'url':url,'StatusCode':status,'comment':comment} def sendDingDing(bc):
'''
用来接收getStatusCode的返回值以及钉钉发送消息
:param bc:
:return:
'''
ding_url = 'https://oapi.dingtalk.com/robot/send?access_token=e0bef403aded94c230953384353bc411a7fba57389ebd59bc0e63cc602ec175f'
HEADERS = {
"Content-Type": "application/json ;charset=utf-8"
}
bc = bc.result()
url = bc['url']
status = bc['StatusCode']
comment = bc['comment']
string_textMsg = {
'msgtype': 'text',
'text': { # 自行添加需要的内容
'content': 'url地址:%s\n'
'url名称:%s\n'
'状态码:%s\n'% (url, comment,status)
}
}
string_textMsg = json.dumps(string_textMsg) # 序列化到内存中
res = requests.post(ding_url, data=string_textMsg, headers=HEADERS)
if __name__ == '__main__':
lock = Lock() # 创建锁对象 pool = ThreadPoolExecutor(4) # 线程池
url,comment = verdictUrl()
res = zip(url,comment)
li = []
for i in res:
for j in range(4): # 开启多线程
t = MyThread(getStatusCode,args = (i[0],i[1]))
li.append(t)
t.start()
for t in li:
t.join() if len(list1)>3 or len(list2)>3: # 如果xxxxx,则交给sendDingDing处理
pool.submit(getStatusCode,i[0],i[1]).add_done_callback(sendDingDing)
需要注意的是:
1.需要在当前目录下创建hosts.txt文件,文件内容格式为:
https://www.baidu.com,百度首页
https://www.trc.com,泰然城首页
https://www.jd.com,京东商城
2.ding_url换成自己的钉钉机器人webhook链接,也可以换成微信报警
利用python完成多个url状态码的检测的更多相关文章
- python笔记 利用python 自动生成条形码 二维码
1. ean13标准条形码 from pystrich.ean13 import EAN13Encoder encode = EAN13Encoder(') encode.save('d:/barco ...
- python 使用异常代替返回状态码
- Shell揭秘——程序退出状态码
程序退出状态码 前言 在本篇文章当中主要给大家介绍一个shell的小知识--状态码.这是当我们的程序退出的时候,子进程会将自己程序的退出码传递给父进程,有时候我们可以利用这一操作做一些进程退出之后的事 ...
- 用HTTP状态码实现提交表单后刷新页面不重复提交
正常情况下,表单提交后如果用户刷新页面会重复提交表单,有些情况下我们不希望表单重复提交,利用HTTP协议中的307状态码重定向页面可以实现这个目的.实例如下: 表单页面代码: <form act ...
- Zabbix监控Low level discovery实时监控网站URL状态
今天我们来聊一聊Low level discovery这个功能,我们为什么要用到loe level discovery这个功能呢? 很多时候,在使用zabbix监控一些东西,需要对类似于Itens进行 ...
- http指定状态码
Http状态代码 1.指定状态码: setStatus HttpServletResponse的setStatus方法.如果响应的状态代码比较特殊,并且伴有相关的文档内容,那么一定要在用PrintWr ...
- python(30) 获取网页返回的状态码,状态码对应问题查询
获取访问网页返回的状态码 html = requests.get(Url) respon = html.status_code 以下内容来自于维基百科:点击查看网页 1xx消息 这一类型的状态码,代表 ...
- [Python]网络爬虫(三):异常的处理和HTTP状态码的分类
先来说一说HTTP的异常处理问题. 当urlopen不能够处理一个response时,产生urlError. 不过通常的Python APIs异常如ValueError,TypeError等也会同时产 ...
- python接口自动化(七)--状态码详解对照表(详解)
简介 我们为啥要了解状态码,从它的作用,就不言而喻了.如果不了解,我们就会像个无头苍蝇,横冲直撞.遇到问题也不知道从何处入手,就是想找别人帮忙,也不知道是找前端还是后端的工程师. 状态码的作用是:we ...
随机推荐
- Flask系列之源码分析(一)
目录: 涉及知识点 Flask框架原理 简单示例 路由系统原理源码分析 请求流程简单源码分析 响应流程简单源码分析 session简单源码分析 涉及知识点 1.装饰器 闭包思想 def wapper( ...
- word安装楷体gb2312方法。
1:下载:楷体gb2312.http://www.downza.cn/soft/7732.html 2: 双击安装,将会下载楷体2312 的压缩文件,解压得到楷体2312.ttf. 3: 打开控制 ...
- Good Bye 2018 Solution
A. New Year and the Christmas Ornament 签到. #include <bits/stdc++.h> using namespace std; int a ...
- Codeforces Round #533 (Div. 2) Solution
A. Salem and Sticks 签. #include <bits/stdc++.h> using namespace std; #define N 1010 int n, a[N ...
- HDU4642
#include<stdio.h> #include<string.h> int main() { int i,j,n,m; int t; scanf("%d&quo ...
- @Tranactional事务没有回滚
一.特性 先来了解一下@Transactional注解事务的特性吧,可以更好排查问题 1.service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务 ...
- JAVA面试题整理(7)-Redis
Redis面试题汇总 1.Redis用过哪些类型数据,以及Redis底层怎么实现 分析:是不是觉得这个问题很基础,其实我也这么觉得.然而根据面试经验发现,至少百分八十的人答不上这个问题.建议,在项目中 ...
- InstallShield 2015 LimitedEdition VS2012 运行bat文件
转载:http://www.cnblogs.com/fengwenit/p/4271150.html 运行bat文件 网上很多介绍如何运行bat的方法,但我这个是limted 版本,不适用. 1. ...
- HDU 6342 Expression in Memories(模拟)多校题解
题意:给你一个规则,问你写的对不对. 思路:规则大概概括为:不能出现前导零,符号两边必须是合法数字.我们先把所有问号改好,再去判断现在是否合法,这样判断比一边改一边判断容易想. 下面的讲解问号只改为+ ...
- Jwt访问api提示401错误 Authorization has been denied for this request
教程 http://bitoftech.net/2015/02/16/implement-oauth-json-web-tokens-authentication-in-asp-net-web-ap ...