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. SpringData概述

    Spring Data : Spring 的一个子项目.用于简化数据库访问,支持NoSQL 和 关系数据存储.其主要目标是使数据库的访问变得方便快捷. SpringData 项目所支持 NoSQL 存 ...

  2. ubuntu14.04 安装apache+mysql+php

    1.安装apache sudo apt-get update sudo apt-get install apache2 这时http://你机器的ip,就可以访问了. 2.安装mysql sudo a ...

  3. php 发送邮件类

    //******************** 配置信息 ********************************            $smtpserver = "smtp.263 ...

  4. office 2010 安装时出错 MSXML版本6.10.1129.0

    微软下载网址:https://www.microsoft.com/zh-cn/download/details.aspx?id=6276&751be11f-ede8-5a0c-058c-2ee ...

  5. 来自MSDN的RibbonGadgets练习

    来自MSDN的RibbonGadgets练习 RibbonGadgets是少见的来自官方的资源. 如果选择Menu Items = 集合,则会有向下的小箭头,同时会出现下来菜单. 这个都关系叫做gal ...

  6. 20145322何志威《网络对抗》逆向及Bof基础

    20145322何志威<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...

  7. 常用<meta>

    转自:http://segmentfault.com/a/1190000002407912 w3c -- <meta>标签:http://www.w3school.com.cn/tags/ ...

  8. CPA定律——一致性,可用性和分区容错性

    按照美国著名科学家 Eric Brewer 在 2000 年提出的理论,当技术架构从集中式架构向分布式架构演进,会遇到 “CAP 定律”的瓶颈. CAP 说明一个数据处理系统不能同时满足一致性,可用性 ...

  9. UVA 11475 Extend to Palindrome(hash)题解

    题意:问你最少加几个字母使所给串变成回文串. 思路:一开始打算将正序和逆序都hash,然后用提取前缀后缀的方法来找,但是RE了,debug失败遂弃之.后来发现可以直接hash,一边hash一边比较.我 ...

  10. 总结关于express vue-cli

    零零散散,拼起来,花了不少时间,这回把一些东西拼一下吧,免得到时又得重头开始,Blog还没弄好,打算用这些重新写一个,稍接不上,就落后了,这是技术,技术是不断更新换代的,明天这个框架,可以后天就有一个 ...