博客列表
Python自动下载整个网站的漫画
实现源码: import requests import os import bs4 def download_comics(): url = 'https://xkcd.com/3216/' floder_name = 'xkcd_comics' os.makedirs(floder_name, exist_ok=True) count = 0 while not url.endswith('#') and count < 5: print(f"正在访问网页: {url}") headers = {'UserAgent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'} res = requests.get(url, headers=headers) res.raise_for_status() soup = bs4.BeautifulSoup(res.text, 'html.parser') comic_elem = soup.select('#comic img') if comic_elem == []: print("未在该页面找到图片!!!") else: comic_url = 'https:' + comic_elem[0].get('src') print(f'下载图片:{comic_url}') res = requests.get(comic_url, headers=headers) res.raise_for_status() image_name = os.path.basename(comic_url) image_path = os.path.join(floder_name, image_name) with open(image_path, 'wb') as image_file: for chunk in res.iter_content(100000): image_file.write(chunk) prev_link = soup.select('a[rel="prev"]')[0] url = 'https://xkcd.com' + prev_link.get('href') count += 1 print("所有漫画下载完毕!!请看xkcd_comics文件夹") if __name__ == '__main__': download_comics() 注意:处于网络问题可能有访问不了的情况!
March 20, 2026
《Nginx 恶意攻击 IP 自动分析与封禁拦截器》
背景:Nginx 服务器遭到恶意爬虫的疯狂扫描,/var/log/nginx/error.log 文件瞬间暴增了上万行。 如果手动去找是哪些 IP 在攻击,然后一条条加进防火墙,费时费力 解决方案:通过Python自动化脚本运用 os 和 re库来自动化提取恶意IP;并放入Shell脚本中,根据实际情况决定是否执行脚本 操作:检查下列代码(有解释);并根据自身实际情况修改,将py代码与自身想要检索的日志放在同一个目录下 代码与逻辑: import re import os #============配置区============= LOG_FILE = 'error.log' OUTPUT_FILE = 'ban_ips.sh' THERESHOLD = 50 #报警阈值 WHERELIST = ['192.168.1.6', '10.0.0.6'] #白名单 #============================== def main(): ip_Regex = re.compile(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}') ip_Counts = {} #空字典当“计数器” print(f"正在分析日志文件: {LOG_FILE}") if not os.path.exists(LOG_FILE): print("找不到日志文件,请检查路径。") return with open(LOG_FILE, 'r', encoding='utf-8', errors='ignore') as file: for line in file: match = ip_Regex.search(line) if match: ip = match.group() if ip in WHERELIST: continue if ip in ip_Counts: ip_Counts[ip] += 1 else: ip_Counts[ip] = 1 malicious_ips = [] for ip, count in ip_Counts.items(): if count >= THERESHOLD: malicious_ips.append(ip) print(f"发现恶意IP {ip} 攻击了 {count} 次!!!") if malicious_ips: with open(OUTPUT_FILE, 'w', encoding='utf-8') as out_file: out_file.write("#!/bin/bash\n") out_file.write("# 自动生成的防火墙封禁脚本\n\n") for ip in malicious_ips: cmd = f"firewall-cmd --permanent --add-rich-rule='rule family=\"ipv4\" source address=\"{ip}\" drop' \n " out_file.write(cmd) out_file.write("\nfirewall-cmd --reload\n") out_file.write(f"echo '所有恶意ip已经被写入文件{OUTPUT_FILE}'\n") print(f"\n 已经生成封禁IP脚本{OUTPUT_FILE}") print(f" 您只需要执行:bash {OUTPUT_FILE} 即可封禁恶意IP") else: print("\n 日志很干净没有发现恶意IP") if __name__ == '__main__': main() 执行结果如下: 终端中: [root@SERVER nginx]# python3 ./ips_blocker.py 正在分析日志文件: error.log 发现恶意IP 141.101.69.127 攻击了 896 次!!! 发现恶意IP 172.71.126.94 攻击了 583 次!!! 已经生成封禁IP脚本ban_ips.sh 您只需要执行:bash ban_ips.sh 即可封禁恶意IP Shell脚本中: #!/bin/bash 自动生成的防火墙封禁脚本 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="141.101.69.127" drop' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.71.126.94" drop' firewall-cmd --reload echo '所有恶意ip已经被写入文件ban_ips.sh'
March 19, 2026
Python--机器人自动备份文件到自动递增ZIP
项目背景: 将/app/config 目录下的配置文件备份一下,免得一会更新代码搞坏了。 于是熟练地敲下:tar -czvf config_bak_20260318.tar.gz /app/config。 过了半小时,因为改错地方需要再备份一次只能再敲一次,并且小心翼翼地把文件名改成 config_bak_20260318_v2.tar.gz,生怕覆盖了上一个版本。 解决方案: 通过Python编写’自动备份机器人‘;只需要告诉他要备份哪个文件夹,即可自动扫描里面所有文件并递自动增生成版本号,将其安全压缩成 ZIP 文件 准备: Python自带的两个强大标准库: os:用于进入文件夹 ,遍历文件,检查文件是否存在 zipfile:用于创建和写入 ZIP 压缩包 流程图: 接收文件夹路径 ==> 检查当前目录 ==> 备份并剔除重复文件名 代码及解释: import zipfile import os def backupToZip(folder): # 1. 确保传入的文件夹路径是绝对路径 folder = os.path.abspath(/root/frp) # 提取文件夹的名字,比如 '/var/log/nginx' 会提取出 'nginx' folder_name = os.path.basename(folder) # 2. 自动判定版本号 (核心逻辑) number = 1 while True: # 拼接即将生成的 ZIP 文件名 zip_filename = f'{folder_name}_backup_V{number}.zip' # 如果这个文件不存在,说明我们找到了一个可用的新版本号!跳出循环 if not os.path.exists(zip_filename): break # 如果存在,编号加 1,继续找下一个 import zipfile import os #import sys def backupToZip(folder): """ 将整个文件夹的内容备份到一个带有递增版本号的 ZIP 文件中。 """ # 1. 确保传入的文件夹路径是绝对路径 folder = os.path.abspath(folder) # 提取文件夹的名字,比如 '/var/log/nginx' 会提取出 'nginx' folder_name = os.path.basename(folder) # 2. 自动判定版本号 (核心逻辑) number = 1 while True: # 拼接即将生成的 ZIP 文件名 zip_filename = f'{folder_name}_backup_{number}.zip' # 如果这个文件不存在,说明我们找到了一个可用的新版本号!跳出循环 if not os.path.exists(zip_filename): break # 如果存在,编号加 1,继续找下一个 number = number + 1 # 3. 创建 ZIP 压缩文件 print(f'备份机器人正在创建备份归档: {zip_filename} ...') backup_zip = zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) # 4. 遍历目录树并添加到 ZIP 文件中 # os.walk 会像剥洋葱一样,一层层遍历文件夹里的所有内容 for foldername, subfolders, filenames in os.walk(folder): print(f'正在添加文件夹: {foldername} ...') # 把当前文件夹本身加进压缩包 backup_zip.write(foldername) # 把当前文件夹里的所有文件加进压缩包 for filename in filenames: # 安全防范:防止脚本把刚刚生成的 ZIP 包自己也打包进去(无限套娃) if filename.startswith(f'{folder_name}_backup_') and filename.endswith('.zip'): continue # 获取文件的绝对路径并写入压缩包 file_path = os.path.join(foldername, filename) backup_zip.write(file_path) # 5. 收工关门 backup_zip.close() print(f'报告老板,备份完成!已成功生成:{zip_filename}') # ================= 运行区 ================= if __name__ == '__main__': # if len(sys.argv) < 2: # print("用法错误!请在命令后面加上你要备份的文件夹路径。") # print("例如: python backup.py /var/log/nginx/error.log") # target_folder = sys.argv[1] # 假设我们要备份有/root/aaa这个路径文件夹 target_folder = '/root/aaa' if os.path.exists(target_folder): backupToZip(target_folder) else: print(f"找不到文件夹: {target_folder},请检查路径!") 注意:sys库可以让别人引用脚本变得方便
March 19, 2026
电话号码和 E-mail 提取器
提取电话和邮箱 导入库 import re, pyperclip 创建手机号正则表达式(手机号格式) phoneRegex = re.compile(r'\d{3}\S?\d{4}\S?\d{4}') 创建邮箱正则表达式(邮箱格式) emailRegex = re.compile(r'''( [a-zA-Z0-9._%+-] + # 用户名部分 \S # @ 符号 [a-zA-Z0-9.-] + # 域名部分 (\.[a-zA-Z]{2,4}) # 最后的后缀 (.com/.cn) )''', re.VERBOSE) 从剪贴板获取文本 text = str(pyperclip.paste()) 提取匹配项 matches = [] for groups in phoneRegex.findall(text): matches.append(groups) #纯文本内容,所有全部加入 for groups in emailRegex.findall(text): matches.append(groups[0]) #最外层大括号内容全部加入 将结果存回剪贴板 if len(matches) > 0: pyperclip.copy('\n'.join(matches)) print('提取成功,已存入剪贴板!') else: print('未发现电话或邮箱。')
March 19, 2026
内存告急,快加swap!!!
内存不足创建swap空间 痛点:云服务器的内存太小,又想要极致性价比 解决方案: 创建swapfile的大文件放在swap下 - 创建swap空间: - - 创建swapfile空间 ==> 转为swap ==> 激活swap并加入linux ==> 配置永久挂载 - if - - input file - - of - - output file - bs - - block size 每次读取多少 - - count - - 读取次数 - dd if=/dev/zero of=/tmp/swapfile bs=1M count=1000 - - - mkswap /tmp/swapfile - - free -h - - chmod 600 /tmp/swapfile - - mkswap /tmp/swapfile - - swapon /tmp/swapfile - free -h - - - 先卸载当前的 Swap 文件 - - swapoff /tmp/swapfile - - 使用 swapon -a 命令(它会读取 /etc/fstab 中的所有 swap 条目并尝试挂载) - - swapon -a - vim /etc/fstab(修改) - /swapfile swap swap defaults 0 0 - free -h - 再次查看挂载情况
March 17, 2026
SSH 配置踩坑
SSH服务—Github 远程连接报错排查 远程连接到github时出现报错,不能连接 估计是公钥路径不对,git不能在基础目录~/.ssh/ 下看到相关文件 尝试: 删除原来的公钥,重新建一个在正确目录下 ssh-keygen -t ed25519 -C "xxx@xxx.com" 填自己邮箱,生成ssh密钥 将公钥内容复制到github中的ssh管理页面中添加公钥 成功后页面会有提示 - 痛点:用add一个个添加推出文件重新加载是容易重新输入造成记忆压力 - 解决痛点: - - 用git bash在 ~/.ssh/ 下创建config路由表以此管理不同密钥 - 后续管理多个免密钥服务时非常方便,强烈推荐使用!!! 用私钥测试是否匹配: ssh -T -i ~/.ssh/id_rsa git@github.com 用git bash写在~/.ssh/config的内容: — 第 1 把钥匙:专门给个人的 GitHub 用 —Host github.com HostName github.com User git # 填入你刚才测试成功的,属于 GitHub 的私钥路径(不要带 .pub) IdentityFile ~/.ssh/id_ed25519
March 15, 2026
Github Pages绑定域名
Github Pages绑定域名并用cloudFlare加速 - 假设域名为: - github.fighting.top - 需要在github ==> Settings ==> pages ==> 添加域名:github.fighting.top - - 随即官方会给您发需要在您的域名厂商那添加的: record 和 txt记录;用于身份验证 - 你需要提前在cloudFlare托管好自己的根域名,并且添加需要绑定Pages的三级域名(github.fighting.top) - 三级域名添加: - - 用CNAME记录,加github前缀,后面写用户名.github.io - 注意:先不开小黄云 - 再添加一个TXT类型,用于身份验证: - - 提供官方给的信息: - - CNAME record number - 两个添加完成后需要等github官方授权,或者自己可以先用绑定的域名查看网站要用http协议,因为https需要等dns验证完后在仓库的setting选项栏点强制https后才生效 - - 有的浏览器会有cookie等信息记录强制指定到https导致网页打不开,这时候需要使用无痕页面查看网站 - - 注意:Pages绑定域名后需要在config_yaml中把baseurl和url修改;否则会指向错误页面 - 一段时间后可以在github的仓库中的setting和头像页的setting查看dns检查情况,成功验证后即可勾选https和dns的verity
March 12, 2026
NFS挂载文件系统
操作步骤: - NFS原理: - NFS <==> RPC <==> Client - - RPC服务: port mapper - Server(配置): - dnf install rpcbind nfs-utils - - 安装相关软件 - systemctl enable rpcbind/nfs-server - - systemctl start rpcbind/nfs-server - - rpcinfo -p - - vim /etc/export(写入挂载信息): - - /data 10.0.0.0/24(rw,all_squash) - rw 表示读写 | all_squash表示压缩所有客户端用户为nfsnobody - systemctl reload nfs - 平滑重载nfs,避免restart 60s 夯住 - - mkdir -p /data/ - 递归创建目录(挂载目录) - - ls -ld /data/ - 查看目录属性 - - id nfsnobody - 查看用户uid和gid - - chown -R nfsnobody.nfsnobody /data/ - 设置用户,用户组所属 - - df -h - 产看磁盘挂载情况 - 配置文件: - /etc/exports - /var/lib/nfs/etab - Client(配置): - showmount -e 10.0.0.61 - 查看挂载情况 - - useradd nfsnobody - - exportfs -arv - - 刷新配置 - - mount -t nfs 10.0.0.61:/data/ /mnt/ - - df -h /mnt/ - 查看挂载情况 - - install nfs-utils -y - - touch /mnt/ababa.txt - - - df -h - - 查看挂载情况 - rpcinfo -p - - 打印中转详细信息 - 可尝试在/mnt/下写文件,注意:服务器需要开启!!! - umount -lf /mnt/ - - 强制卸载挂载的磁盘 - 配置文件: - - /etc/rc.local - /proc/mounts - nfs永久挂载(配置前先启动服务端): - vim /etc/fstab(写在文件里): - - 10.0.0.61:/data/ /mnt/ nfs defaults 0 0
March 12, 2026
用Nginx搭建站点
一、基础站点配置 1. 站点信息 域名(server_name):buy.fighting.top 站点根目录(root):/app/code/buy/ 首页文件:/app/code/buy/index.html 2. Nginx 配置 编辑配置文件: vim /etc/nginx/conf.d/buy.fighting.top.conf 写入: server { listen 80; server_name buy.fighting.top; root /app/code/buy; location / { index index.html; } location /admin/ { allow 172.16.1.0/24; deny all; } } 3. 关键概念 URL http://buy.fighting.top/admin URI /admin/ URL = 域名 + URI Nginx 实际匹配的是 URI 创建测试文件 mkdir -p /app/code/buy/admin/ echo “购物网站” > /app/code/buy/index.html echo “admin” > /app/code/buy/admin/index.html 5. 本地测试 curl -H “Host: buy.fighting.top” http://127.0.0.1 curl -H “Host: buy.fighting.top” http://127.0.0.1/admin/ 二、进阶:静态资源缓存优化
March 12, 2026
Nginx--网站搭建
先挑选一个自己喜欢的云服务器: 阿里云/腾讯云/。。。 - cloudFlare配置name server: - 常规配置: - A策略 二级域名开头 ip - 二级域名可单独配置一个: - A策略 @ ip - ==公网server防火墙一定要放行,否则不显示页面!!!== - firewall-cmd --permanent --add-service=http - firewall-cmd --permanent --add-service=https - 平缓重载: - firewall-cmd --reload - 最后检查: - firewall-cmd --list-all - Nginx(不同下载方式file/dir可能不同): - 主配置文件: - 修改:/etc/nginx/nginx.conf - server { listen 80 server_name **自己的域名**; root **网站目录**; location / { /是基于网站目录结构 index index.html; } } - 检查配置是否错误: - nginx -t - 平滑重载: - systemctl reload nginx - 创建目录: - mkdir -p /.../ - 创建首页文件: - touch /.../index.html - echo "Welcome to my website" >> /.../index.html - 要在两个文件中添加的内容 "你的ip 你的域名" - windows下面win键+r 输入drivers 访问etc下的hosts - 若提示权限不足可通过hosts文件属性修改administrator权限 - linux: /etc/hosts - 即可访问您的域名 注意:如果是自己的真实域名不用改hosts文件,但要注意防火墙放行 && cloudFlare的子域名添加,以及cloudFlare中设置为flexible
March 8, 2026