当前位置:淡墨SEO首页 > SEO工具 > flask-celery异步执行sitemap任务并生成文件

flask-celery异步执行sitemap任务并生成文件

admin2年前 (2022-09-05)SEO工具6020

此次主要是将python生成的sitemap文件,转入到flask做出的api接口上,这样每次进行api请求就可以获取到网站的所有的url并生成sitemap文件。首先看看运行效果。

本地地址请求接口url:http://127.0.0.1:5100/sitemap?site=http://www.seoyiwu.com

运行命令:

1、宝塔服务器开启redis服务(安装一下redis就行了)

image.png

2、启动celery异步执行任务命令 : celery --app=run.celery worker -P eventlet -l INFO

image.png

3、启动flask命令 python run.py


image.png


接下来用postman进行测试看看。可以看到返回一个任务id,这个任务id代表任务执行的状态,是否执行完毕

image.png



如果没有执行完毕则返回 当前执行步骤

image.png

执行完毕后,就会返回执行终止状态以及返回了sitemap文件

image.png

然后我们在当前目录可以看到生成的sitemap文件,可以看到已经生成成功。

image.png

好了,接下来看看代码的实现流程:

一、flask创建任务,成功celery实例

创建celery队形,并配置好redis数据库


image.png


二、sitemap任务

这是celery异步执行的任务,放到一个方法里。

@celery.task(bind=True)
def proSitemap(self,urls):
    allUrls = set()
    rootUrl = urls[0]
    while True:
        with ThreadPoolExecutor(max_workers=10) as executor:
            urls = executor.map(getsitemap_url,urls)
            urls = [url for url in urls if url][0]
        urls = set(urls) - allUrls
        if not urls:break
        for url in urls:
            if url.find(rootUrl) == -1:continue
            allUrls.add(url)
            self.update_state(state='PROGRESS',meta={'status':f'正在抓取的url: {url}'})
        urls = list(urls)
       
    allUrls = sorted(list(allUrls),key=lambda url:len(url))
    print(allUrls)
    return {'rootUrl':rootUrl,'allUrls':allUrls,'status':200,'result':'生成完毕'}


三、请求接口

配置好请求接口,生成sitemap任务运行api

@app.route('/sitemap', methods=['GET'])
def sitemap():
    site = request.args.get('site','')
    urls = [site]
    task = proSitemap.apply_async(args=[urls])
    print(task.id)
    return jsonify({
        'Location':request.host_url  + url_for('taskstatus',task_id=task.id).replace('/status','status')
    })
       

@app.route('/status/<task_id>')
def taskstatus(task_id):
    task = proSitemap.AsyncResult(task_id)
    if task.state == 'PENDING':
        response = {
            'state':task.state,
            'status':'pending'
        }
    elif task.state != 'FAILURE':
        rootUrl = task.info.get('rootUrl',0)
        allUrls = task.info.get('allUrls',1)
       
        response = {
        'state':task.state,
        'status':task.info.get('status',100),
        'rootUrl':rootUrl,#rootUrl,
        'allUrls':allUrls,#allUrls,
    }
        if 'result' in task.info:
            makeSitemap(rootUrl,allUrls)
            response['result'] = task.info['result']
    else:
        response = {
            'state':task.state,
            'status':str(task.info)
        }
    return jsonify(response)


四、生成sitemap文件

def makeSitemap(rootUrl,allUrls):
    fw = open('sitemap.xml', 'w', encoding="utf-8")
    fw.write('<?xml version="1.0" encoding="UTF-8"?>')
    fw.write(
        '\n<urlset xmlns="http://video.sitemaps.org/schemas/sitemap/0.9">'
    )
    for url in allUrls:
        fw.write('\n\t<url>')
        fw.write('\n\t\t<loc>' + url + '</loc>')
        fw.write("\n\t\t<lastmod>" +time.strftime('%Y-%m-%d', time.localtime(time.time())) +
            "</lastmod>")
        fw.write('\n\t\t<changefreq>daily</changefreq>')
        if re.findall(rootUrl + "$", url) or re.findall(
                rootUrl + "/$", url):
            fw.write('\n\t\t<priority>1.0</priority>')
        elif re.findall(rootUrl + "[^/]*/$",
                        url) or re.findall(
                            rootUrl + "/[^/]*/$", url):
            fw.write('\n\t\t<priority>0.8</priority>')
        elif re.findall(rootUrl + "[^/]*/[^/]*$",
                        url) or re.findall(
                            rootUrl + "/[^/]*/[^/]*$", url):
            fw.write('\n\t\t<priority>0.6</priority>')
        else:
            fw.write('\n\t\t<priority>0.4</priority>')

        fw.write('\n\t</url>')
    fw.write('\n</urlset>')


整体的核心步骤就这些了,接下来我们就可以将代码上传到服务器中,然后就可以在服务器调用,方便随意使用,也可以在服务器里开启一个定时任务进行定时更新sitemap文件。如果需要生成sitemap的朋友,可以私信我,获取免费接口生成!

扫描二维码推送手机访问

文章内容均为原创,禁止转载!

本文链接:http://www.seoyiwu.com/news/13.html

相关文章

pyqt5制作某so狗主动提交url并反馈快照更新

pyqt5制作某so狗主动提交url并反馈快照更新

一、主动提交某so狗的主动提交需要账号密码登录,然后再进行post请求,那么自然而然需要保持cookie一致或者session会话一直,这里用到session会比较方便。1、请求验证码验证码的源码是svg标签格式,需要通过对svg转成验证码图片,然后才能进行识别,这里识别用到了第三方打码平台,其实有...

自然语言关键词生成文章API接口请求

自然语言关键词生成文章API接口请求

本次主要介绍通过自然语言将关键词生成一篇原创文章,以及制作文章生成的接口api,方便需要生产内容的用户进行调用。下面就逻辑和使用方法给做个介绍。首先是逻辑原理,原理就是人工智能深度学习,进行关键词的模型训练。从而会对目标词块也就是关键词进行相关性的输出。核心技术就不再讲解了,不是那么容易的。一时半会...

某讯视频用python解析数据并下载视频mp4格式

某讯视频用python解析数据并下载视频mp4格式

国庆祝福祖国生日快乐。偶尔间,想做做视频剪辑,需要下载视频素材,但是在平台上的视频似乎不支持手动下载。自然学了python,可以试着用代码去下载视频,在这块找到相应的教学内容,本次内容主要是分享用python如何去获取下载某讯视频。下面为大家讲解一下。就拿最近比较火的昆仑神宫来做下视频解析下载,首先...

某163企业邮箱js逆向登录解析

某163企业邮箱js逆向登录解析

平时我们发邮件时,如果用网页端发送邮件那么就需要登录,登录之后需要手动进行邮件发送的一些操作。如果我们用python逆向登录后,就可以在用接口模拟网页进行邮件的发送。问题主要是解决逆向登录,那么后面发送只要保持cookie就可以调用接口发送了。下面讲解一下逆向登录原理。首先是登录企业邮箱网页地址然后...

搜狗站长平台推送,站点和非站点都可提交

搜狗站长平台推送,站点和非站点都可提交

日常做网站seo的时候,离不开对url的推送,这也是对应站长平台提供的链接提交服务,本次就搜狗站长平台批量提交,做一个推送讲解和示例。封装软件发货传送门》》搜狗站长平台推送视频演示:如下图就是网页推送的界面,如果每次都要手动去输入提交,想必效率和耐心都跟不上,而且想要做到批量提交,肯定要借助一个开发...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。