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. Hadoop MapReduce Task的进程模型与Spark Task的线程模型

    Hadoop的MapReduce的Map Task和Reduce Task都是进程级别的:而Spark Task则是基于线程模型的. 多进程模型和多线程模型 所谓的多进程模型和多线程模型,指的是同一个 ...

  2. [css]单/多行居中&字体设置

    行高和字号 行高 CSS中,所有的行,都有行高.盒模型的padding,绝对不是直接作用在文字上的,而是作用在"行"上的. line-height: 40px; 文字,是在自己的行 ...

  3. cocos进阶教程(5)CC_CALLBACK_X系列的使用技巧

    CC_CALLBACK_1,CC_CALLBACK_2,CC_CALLBACK_3 这些都是std::bind的宏,数字1,2,3主要表示要占位的数量,也是将来传递参数的数量. // new call ...

  4. hdu5106 数位dp

    这题说的是给了一个二进制数R , 计算出 在[0,R) 区间内的数, 二进制中有n个1 个和 n<=1000; R<2^1000, 这样 用dp[len][lee] 表示在第len位的时候 ...

  5. 使用老毛桃安装Windows操作系统

    首先必须知道什么是PE系统? 当电脑出现问题而不能正常进入系统时候的一种“紧急备用”系统,通常放在U盘中,设置启动项优先级,使得电脑启动的时候加载PE系统. 如何在U盘中安装老毛桃(PE工具箱)? h ...

  6. aTool在线工具

    在线HTTP POST/GET接口测试工具 - aTool在线工具 地址:http://www.atool.org/httptest.php在线接口测试工具接口测试是测试系统组件间接口的一种测试.接口 ...

  7. 《Java入门第二季》第五章 阶段练习

    /** * ┏┓ ┏┓ * ┏┛┻━━━┛┻┓ * ┃ ┃ * ┃ ━ ┃ * ┃ > < ┃ * ┃ ┃ * ┃... ⌒ ... ┃ * ┃ ┃ * ┗━┓ ┏━┛ * ┃ ┃ Cod ...

  8. poj1942 Paths on a Grid(无mod大组合数)

    poj1942 Paths on a Grid 题意:给定一个长m高n$(n,m \in unsigned 32-bit)$的矩形,问有几种走法.$n=m=0$时终止. 显然的$C(m+n,n)$ 但 ...

  9. bzoj1623 / P2909 [USACO08OPEN]牛的车Cow Cars

    P2909 [USACO08OPEN]牛的车Cow Cars 显然的贪心. 按速度从小到大排序.然后找车最少的车道,查询是否能填充进去. #include<iostream> #inclu ...

  10. Spring Data JPA中CrudRepository与JpaRepository的不同

    使用Spring Data JPA CrudRepository 和JpaRepository 的好处: 继承这些接口,可以使Spring找到自定义的数据库操作接口,并生成代理类,后续可以注入到Spr ...