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状态码的检测的更多相关文章

  1. python笔记 利用python 自动生成条形码 二维码

    1. ean13标准条形码 from pystrich.ean13 import EAN13Encoder encode = EAN13Encoder(') encode.save('d:/barco ...

  2. python 使用异常代替返回状态码

  3. Shell揭秘——程序退出状态码

    程序退出状态码 前言 在本篇文章当中主要给大家介绍一个shell的小知识--状态码.这是当我们的程序退出的时候,子进程会将自己程序的退出码传递给父进程,有时候我们可以利用这一操作做一些进程退出之后的事 ...

  4. 用HTTP状态码实现提交表单后刷新页面不重复提交

    正常情况下,表单提交后如果用户刷新页面会重复提交表单,有些情况下我们不希望表单重复提交,利用HTTP协议中的307状态码重定向页面可以实现这个目的.实例如下: 表单页面代码: <form act ...

  5. Zabbix监控Low level discovery实时监控网站URL状态

    今天我们来聊一聊Low level discovery这个功能,我们为什么要用到loe level discovery这个功能呢? 很多时候,在使用zabbix监控一些东西,需要对类似于Itens进行 ...

  6. http指定状态码

    Http状态代码 1.指定状态码: setStatus HttpServletResponse的setStatus方法.如果响应的状态代码比较特殊,并且伴有相关的文档内容,那么一定要在用PrintWr ...

  7. python(30) 获取网页返回的状态码,状态码对应问题查询

    获取访问网页返回的状态码 html = requests.get(Url) respon = html.status_code 以下内容来自于维基百科:点击查看网页 1xx消息 这一类型的状态码,代表 ...

  8. [Python]网络爬虫(三):异常的处理和HTTP状态码的分类

    先来说一说HTTP的异常处理问题. 当urlopen不能够处理一个response时,产生urlError. 不过通常的Python APIs异常如ValueError,TypeError等也会同时产 ...

  9. python接口自动化(七)--状态码详解对照表(详解)

    简介 我们为啥要了解状态码,从它的作用,就不言而喻了.如果不了解,我们就会像个无头苍蝇,横冲直撞.遇到问题也不知道从何处入手,就是想找别人帮忙,也不知道是找前端还是后端的工程师. 状态码的作用是:we ...

随机推荐

  1. http之工作原理

    HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端.HTTP协议采用了请求/响应模型.客户端向服务器发送一个请求报文,请求报文包含请求的方法.URL. ...

  2. cookie的存取删

    存: document.cookie = "name=Kevin;expires="+new Date().getDate()+7; //有效期7天 取: function Get ...

  3. P1174 打砖块

    P1174 打砖块 普通分组背包:50pts 题解说的啥????(大雾) 看了半天 $s[0/1][i][j]$表示第$i$列用$j$发子弹,最后一发是1/否0打在该列上的价值 $f[0/1][i][ ...

  4. monit拉起服务

    check process hive_metastore matching "HiveMetaStore" start program = "/usr/bin/nohup ...

  5. 20145315 《Java程序设计》第五周学习总结

    20145315 <Java程序设计>第五周学习总结 教材学习内容总结 第八章 8.1语法与继承架构 8.1.1使用try,catch 所有的错误都会被打包为对象,使用try,catch可 ...

  6. Dijkstra算法补分

    要求 Dijkstra算法,求解附图顶点A的单源最短路径 在纸上画出求解过程,上传截图(注意图上要有自己的学号和姓名) 过程

  7. FromBottomToTop第十三周项目博客

    FromBottomToTop第十三周项目博客 本周项目计划 完成游戏核心算法以及界面相关类和怪物类 项目进展 用户可选择游戏模式,共有20张不同的地图. 炮台的建立和升级. 小怪的路径算法. 参考资 ...

  8. STM32.ADC

    ADC实验 原理图: 1.ADC配置函数 /* enable adc1 and config adc1 to dma mode */ ADC1_Init(); /** * @brief ADC1初始化 ...

  9. 从0开始学习 GITHUB 系列之「GIT 进阶」【转】

    本文转载自:http://stormzhang.com/github/2016/06/16/learn-github-from-zero5/ 版权声明:本文为 stormzhang 原创文章,可以随意 ...

  10. 如何借助 OVN 来提高 OVS 在云计算环境中的性能

    众所周知,OpenvSwitch 以其丰富的功能和不错的性能,已经成为 Openstack 部署中最受欢迎的虚拟交换机.由于 Openstack Neutron 的架构引入了一些性能问题,比如 neu ...