一个网站可能存在N个地址,例如选中一个分类词条就是一个URL地址,那么怎么能全部遍历到,一个不漏的检查其加载是否正常呢,这里我们可以运用到查询数据库,利用正则自动拼接URL,遍历所有链接,以下分享一下代码
1:创建一个无头浏览器
2:连接数据库
3:调用飞书方法,直接复制后修改下飞书机器人地址即可,通用的(钉钉,短信也有自己的封装好的方法)
4:创建一个检查网页是否加载正常的方法(check_entries),我这里使用的是模拟用户打开浏览器,进行滑动行为,然后看页面是否存在我想要的内容,若这些内容曝光则代表正常,失败则报警(大家可以根据自身需要进行修改或者写自己需要的)
5:检查一组URL地址的可用性,并将结果通过飞书消息发送出去。具体步骤如下:
(1)定义一个字典url_sql_dict,其中键是URL前缀,值是对应的SQL查询语句。
(2)遍历字典中的每个URL前缀和SQL查询语句。
(3)如果SQL查询语句为空,则直接检查URL地址是否正常。如果正常,打印"地址正常";否则,打印"URL异常",并通过飞书消息发送报警信息。
(4)如果SQL查询语句不为空,则执行SQL查询语句,获取查询结果。
(5)遍历查询结果列表,打印字段值。
(6)判断链接是否已经包含了.html后缀。如果包含,则直接检查URL地址是否正常;否则,拼接URL链接部分路径,并添加.html后缀。
(7)如果URL地址正常,打印"地址正常";否则,打印"URL异常",并通过飞书消息发送报警信息。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
import urllib.parse
import time
import requests
import json
# 创建一个 Chrome 选项对象,用于设置无头模式
options = Options()
options.add_argument("--headless") # 开启无头模式
options.add_argument("--disable-gpu") # 禁用 GPU 加速
# 创建一个 webdriver 对象,传入选项参数
driver = webdriver.Chrome(options=options) # 找到浏览器驱动位置
# 导入 pymysql 库,并创建一个数据库连接对象
import pymysql
conn = pymysql.connect(
host='rm-uf6mp542XXXXXXXXXXo.mysql.rds.aliyuncs.com',#数据库链接
user='root',#数据库账号
password='XXXXXXXXXX',#数据库密码
db='XXXXXXXXXX',#库名
charset='utf8mb4',
)
class FeishuTalk:
# 飞书机器人地址
chatGPT_url = 'https://open.feishu.cn/open-apis/bot/v2/hook/6ee0be57-847a-46a5-95e5-bbee62289b28'
# 调用机器人发消息方法
def sendTextmessage(self, content):
url = self.chatGPT_url
headers = {
"Content-Type": "application/json; charset=utf-8",
}
payload_message = {
"msg_type": "text",
"content": {
# @ 单个用户 <at user_id="ou_xxx">名字</at>
"text": content + "<at user_id=\"bf888888\">XXX</at>"
# @ 所有人 <at user_id="all">所有人</at>
# "text": content + "<at user_id=\"all\">test</at>"
}
}
response = requests.post(url=url, data=json.dumps(payload_message), headers=headers)
return response.json
# 创建一个检查埋点曝光是否正常的方法
def check_entries(driver, url):
try:
driver.set_page_load_timeout(15)
driver.get(url)
time.sleep(2) # 等待3秒钟防止页面未加载完毕
driver.maximize_window() # 放大浏览器
time.sleep(1)
js = "var q=document.documentElement.scrollTop=1500" # 向下滑动1500像素
driver.execute_script(js) # 执行向下滑动操作
time.sleep(2)
flag = True
while True:
# 获取所有接口请求信息
entries = driver.execute_script("return window.performance.getEntries()")
# 判断埋点是否异常
for entry in entries:
entry_url = entry['name']
# 将URL进行解码,还原特殊字符
entry_url = urllib.parse.unquote(entry_url)
# 获取请求URL
if 'https://md.XXXX.com/s.gif' in entry['name'] or 'https://md.XXXX.com/c.gif' in entry[
'name'] or 'https://md.XXXX.com/i.gif' in entry['name']:
if "bhv_type=exposure" in entry_url:
flag = False
return True # 返回True
break
if flag:
return False
driver.quit()
except TimeoutException:
return False
if __name__ == '__main__':
try:
with conn.cursor() as cursor:
# 定义 URL 前面的路径和 SQL 语句的字典
url_sql_dict = {
'https://www.XXXX.com/':"",
'https://XXXX.com/XXXX/': "SELECT 字段 FROM 表名 条件 ",
'https://BB./BB.com//BB/': "SELECT 字段 FROM 表名 条件 ",
}
# 遍历 URL 前面的路径和 SQL 语句的字典
for url_prefix, sql in url_sql_dict.items():
# 判断 SQL 语句是否为空
if sql == "":
# 直接检查 URL 是否正常
url = url_prefix
try:
if check_entries(driver, url):
print(url,'地址正常') # 打印检查结果
else:
print("URL 异常")
content = 'URL 异常,请检查 ' + url # 定义报警信息
FeishuTalk().sendTextmessage(content) # 发送飞书报警
except Exception as e:
print("URL 检查出错:", e)
content = 'URL 检查出错,请检查网络连接和驱动设置'
FeishuTalk().sendTextmessage(content)
else:
# 查询 URL 链接部分路径的字段
cursor.execute(sql)
# 获取查询结果
results = cursor.fetchall()
# 遍历查询结果列表
for result in results:
print(result[0]) # 打印字段值
# 判断链接是否已经包含了 .html 后缀
if result[0].endswith('.html'):
# 直接检查 URL 是否正常
url = url_prefix + result[0]
else:
# 拼接 URL 链接部分路径
url = url_prefix + result[0] + '.html'
# 检查 URL 是否正常
try:
if check_entries(driver, url):
print(url,'地址正常') # 打印检查结果
else:
print("URL 异常")
content = 'URL 异常,请检查 ' + url # 定义报警信息
FeishuTalk().sendTextmessage(content) # 发送飞书报警
except Exception as e:
print("URL 检查出错:", e)
content = 'URL 检查出错,请检查网络连接和驱动设置'
FeishuTalk().sendTextmessage(content)
except Exception as e:
print("查询出错:", e)
content = '查询出错,请检查数据库连接和SQL语句'
FeishuTalk().sendTextmessage(content)
driver.quit()
time.sleep(2)
finally:
conn.close()
driver.quit()