问题:
在使用小旋风蜘蛛池向谷歌添加自己的站点地图时,会出现无法识别的错误,因为每次访问https://域名/sitemap/google.xml的时候数据都会改变
解决思路:
那么我们可以通过访问这个会改变数据的xml来自己获取自己的xml并作为一个不会变数据的xml来进行提交
python代码
import requests
from xml.etree import ElementTree as ET
import re
import os
import argparse
parser = argparse.ArgumentParser(description='站点目录自动生成 output.xml')
parser.add_argument('domain',help='域名')
def fetch_sitemap(domain):
url = f'https://{domain}/sitemap/google.xml'
headers = {
'Host': f'{domain}',
'Cache-Control': 'max-age=0',
'Sec-Ch-Ua': '"Chromium";v="103", ".Not/A)Brand";v="99"',
'Sec-Ch-Ua-Mobile': '?0',
'Sec-Ch-Ua-Platform': '"Windows"',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/536.36 (KHTML, like Gecko) Chrome/105.0.5060.53 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-User': '?1',
'Sec-Fetch-Dest': 'document',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # 抛出异常如果请求不成功
except requests.exceptions.RequestException as e:
print(f"Error fetching sitemap: {e}")
return None
return response.text
def merge_xml(xml_list):
# 创建一个根元素
root = ET.Element("root")
# 遍历每个XML字符串,解析为Element对象,并添加到根元素下
for xml_string in xml_list:
try:
xml_element = ET.fromstring(xml_string)
root.extend(xml_element)
except ET.ParseError as e:
print(f"Error parsing XML: {e}")
# 创建一个新的XML树
merged_tree = ET.ElementTree(root)
# 返回合并后的XML字符串
return ET.tostring(root, encoding='utf-8').decode('utf-8')
def save_to_file(data, output_file):
with open(output_file, 'w', encoding='utf-8') as file:
file.write(data)
print(f"")
xmlchange()
def xmlchange():
# 读取原始XML文件
with open('output1.xml', 'r', encoding='utf-8') as file:
xml_content = file.read()
# 删除所有ns0:前缀
xml_content = re.sub(r'ns0:', '', xml_content)
# 修改文件的第一行
xml_content = '<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><url>' + \
xml_content.split('\n', 1)[1]
xml_content = re.sub(r'</root>', '</urlset>', xml_content)
# 将修改后的内容写回文件
with open('output.xml', 'w', encoding='utf-8') as file:
file.write(xml_content)
# 删除output1.txt文件
if os.path.exists('output1.xml'):
os.remove('output1.xml')
print("Successful")
# 调用函数并传入XML文件路径
if __name__ == "__main__":
args = parser.parse_args()
output_file = "output1.xml"
num_requests = 10
sitemap_data_list = []
for _ in range(num_requests):
sitemap_data = fetch_sitemap(args.domain)
if sitemap_data:
sitemap_data_list.append(sitemap_data)
merged_sitemap = merge_xml(sitemap_data_list)
if merged_sitemap:
save_to_file(merged_sitemap, output_file)
使用方法
-
num_requests为请求次数,按照需要的xml量填写
-
python getxml.py "域名"
- 输出output.xml
添加宝塔定时任务
#!/bin/bash
# 执行Python脚本
python3 /root/getxml.py 你的域名
# 检查Python脚本是否成功执行
if [ $? -eq 0 ]; then
# 移动output.xml到指定文件夹
mv output.xml 网站根目录
echo "成功移动文件到 网站根目录"
else
echo "Python脚本执行失败"
fi
使用方法
- 先将getxml.py(上方python文件)放入你的root目录下
- 然后将定时任务内的"你的域名"和"网站根目录"写好
- 可设置多个域名,实现某时间段为某域名的站点地图
即可直接向谷歌提交https://域名/output.xml为你的站点地图
温馨提示:记得安装pip3包,否则python文件执行会报错!