精华内容
下载资源
问答
  • JAVA 统计网站的访问量PV,UV

    热门讨论 2014-06-18 23:17:45
    Java+Spring+Mysql+C3P0 统计网站的访问量,比如PV(页面浏览量),UV(独立访客数),将统计结果保存到MYSQL数据库中。解压后有项目log和Mysql的建库脚本。
  • 如何提高CSDN博客的访问量

    千次阅读 多人点赞 2019-11-03 10:05:03
    虽然不是很多,但小菌已经非常满足了,毕竟在CSDN上开源分享,总结经验才是最重要的,访问量,点赞数,评论数等附加数据则是用来评判博客内容质量好坏以及其本身受欢迎程度。最近小菌去浏览了一下博客周排行榜以及总排行榜...

            开设CSDN博客也有几天时间了,博客的访问量已逐步逼近7000。虽然不是很多,但小菌已经非常满足了,毕竟在CSDN上开源分享,总结经验才是最重要的,访问量,点赞数,评论数等附加数据则是用来评判博客内容质量好坏以及其本身受欢迎程度。最近小菌去浏览了一下博客周排行榜以及总排行榜的那些博客专家,IT大佬们的博客,不仅粉丝数,获赞数,浏览量让小菌望尘莫及,其博客内容的深度更是让本菌自叹不如(大佬就是大佬(T_T))。同时我也在思考如何向排行榜这个"福地"看齐,首当其冲便是提高博客访问量。于是我在经过仔细的研究之后,总结出了以下方案,决定晒出来与小伙伴们一起分享~
    在这里插入图片描述

    正面例子

    多写常用知识点的博客

            这一点还是非常的好理解,毕竟常用知识不管在哪个领域受用人群往往都是最多的,而且常用知识一般都偏向于基础化,使用频率高。只要你总结的到位,靠谱,不管发布在哪都是很容易受到大量用户的"追捧"!

    想办法提高百度排名,注意标题不要写的太复杂

            百度作为全球最大的中文搜索引擎及最大的中文网站,每日的搜索量,浏览量是相当大的。只要你能在百度上搜索到自己的文章,并且还有一个不错的位置,并且自带一个好的标题,那么访问量日过万(短期)不是问题。(下面附上百度链接提交入口,需要审核)百度搜索资源平台
    在这里插入图片描述
            对了,这种情况下,一个好的标题就显得非常重要!那什么样的标题才算的上好的标题呢?注意标题一定要精炼,精炼,精炼!(重要的事总要说三遍)像有的文章内容质量不错,结果标题起的不清不楚,平淡无奇,这样做就很容易使博客埋没在"贫民区"。精炼的标题可以让人理解起来更方便,并且小菌还建议大家可以在标题后面适当的增加一些诱人词汇吸引大家的关注,无形之中增加了在同类文章,博客中的竞争力。像写篇介绍Java基础的博客,你就可以用《Java零基础入门学习(小白也能看懂!)》类似的大家可以自行发挥!

    写国内比较新的技术

            这个就对自身学识有一定的要求了。在IT圈,新的技术不管在哪就像娱乐新闻一样走到哪里都自带流量。像近几年比较火的"区块链",“大数据”,“云计算”,“AI”…如果你有幸在这些领域工作,写出"高访问量"的文章应该不是很难!尤其是中短期,效果很好!

    区块链
    在这里插入图片描述
    云计算
    在这里插入图片描述

    大数据

    在这里插入图片描述

    人工智能

    在这里插入图片描述

    成系列的写技术文章,有利于增加评论,粉丝,中长期能够大幅度提高日常访问量

            像下面几位大佬学习!(仅举出几个例子,还有很多!)
    在这里插入图片描述

    成系列的专栏,利于增加粉丝,亦能提高日常访问量

            这里以博客专家二师兄-公众号-程序新视界为例
    在这里插入图片描述
    在这里插入图片描述

    "硬核"外挂–脚本刷CSDN访问量

            这里小菌不提倡大家这么做,但作为一个新用户名的话,前期刷点访问量美化数据还是有点用的(真香,哈哈٩(๑❛ᴗ❛๑)۶)。直接上脚本吧,同样还是用python写的。

    脚本1:循环刷一个用户下的所有博文

    import requests
    import re
    import time
    payload = ""
    # 请求头
    headers = {
        "Accept": "*/*",
        "Accept-Encoding": "gzip, deflate, br",
        "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
        "Cookie": "l=AurqcPuigwQdnQv7WvAfCoR1OlrRQW7h; isg=BHp6mNB79CHqYXpVEiRteXyyyKNcg8YEwjgLqoRvCI3ddxqxbLtOFUBGwwOrZ3ad; thw=cn; cna=VsJQERAypn0CATrXFEIahcz8; t=0eed37629fe7ef5ec0b8ecb6cd3a3577; tracknick=tb830309_22; _cc_=UtASsssmfA%3D%3D; tg=0; ubn=p; ucn=unzbyun; x=e%3D1%26p%3D*%26s%3D0%26c%3D0%26f%3D0%26g%3D0%26t%3D0%26__ll%3D-1%26_ato%3D0; miid=981798063989731689; hng=CN%7Czh-CN%7CCNY%7C156; um=0712F33290AB8A6D01951C8161A2DF2CDC7C5278664EE3E02F8F6195B27229B88A7470FD7B89F7FACD43AD3E795C914CC2A8BEB1FA88729A3A74257D8EE4FBBC; enc=1UeyOeN0l7Fkx0yPu7l6BuiPkT%2BdSxE0EqUM26jcSMdi1LtYaZbjQCMj5dKU3P0qfGwJn8QqYXc6oJugH%2FhFRA%3D%3D; ali_ab=58.215.20.66.1516409089271.6; mt=ci%3D-1_1; cookie2=104f8fc9c13eb24c296768a50cabdd6e; _tb_token_=ee7e1e1e7dbe7; v=0",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64;` rv:47.0) Gecko/20100101 Firefox/47.0"
    }
    # 获得文章列表urls
    def getUrls(url):
    
        # 发送请求
        resp = requests.request("GET", url, data=payload, headers=headers)
        #设置解码方式
        resp.encoding=resp.apparent_encoding
        #这里会用设置的解码方式解码
        html_source = resp.text
        # 正则表达式,取出网页中的url链接(一些寻找注入点的工具也是这么做出来的)
        urls = re.findall("https://[^>\";\']*\d",html_source)
        new_urls=[]
        for url in urls:
            if 'details' in url:
                if url not in new_urls:
                    new_urls.append(url)
        return new_urls
    
    # 这里替换成你要刷访问量博客的首页  
    urls = getUrls("你的博客首页地址")
    while True:
        for url in urls:
            requests.request("GET", url, data=payload, headers=headers)
            print(url, "Ok")
            time.sleep(5)
        time.sleep(5)
    

    脚本2:定时刷指定url的博文

    # -*- coding: utf-8 -*-
     
    import urllib2 
    import random
    import time
    import requests
     
    proxy_list=[]
     
    def get_proxy_list():
        global proxy_list
        print "导入proxy_list...".decode('utf-8')
        #ip文件可以浏览我上文链接文章“多线程爬虫——抓取代理ip”
        f=open("ip.txt")
        #从文件中读取的line会有回车,要把\n去掉
        line=f.readline().strip('\n')
        while line:
            proxy_list.append(line)
            line=f.readline().strip('\n')
        f.close()
     
    def start():
        #总次数和有效次数
        times=0
        finished_times=0
        #无限刷
        while 1:
            user_agent_list=[
                {'Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0)'},
                {'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)'},
                {'Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0)'},
                {'Opera/9.80(WindowsNT6.1;U;en)Presto/2.8.131Version/11.11'},
                {'Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1'},
                {'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER'},
                {'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)'},
                {'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0'},
                {'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36'},  
                {'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36'} 
            ]
     
            referer_list=[
                {'http://blog.csdn.net/dala_da/article/details/79401163'},
                {'http://blog.csdn.net/'},
                {'https://www.sogou.com/tx?query=%E4%BD%BF%E7%94%A8%E7%88%AC%E8%99%AB%E5%88%B7csdn%E8%AE%BF%E9%97%AE%E9%87%8F&hdq=sogou-site-706608cfdbcc1886-0001&ekv=2&ie=utf8&cid=qb7.zhuye&'},
                {'https://www.baidu.com/s?tn=98074231_1_hao_pg&word=%E4%BD%BF%E7%94%A8%E7%88%AC%E8%99%AB%E5%88%B7csdn%E8%AE%BF%E9%97%AE%E9%87%8F'}
            ]
            #想要刷的blog的url
            url='http://blog.csdn.net/dala_da/article/details/79401163'
            #随机user_agent和Referer
            header={'User-Agent':random.choice(user_agent_list), 
                    'Referer':random.choice(referer_list)
            }
            #依次从proxy_list中取
            ip=proxy_list[times%len(proxy_list)]
            #设置代理,格式如下
            proxy_ip = 'http://' + ip
            proxy_ips = 'https://' + ip
            proxy = {'https': proxy_ips, 'http': proxy_ip}
        
            try:
                response=requests.get(url, headers=header, proxies=proxy)
            except:
                #无响应则print出该代理ip
                print '代理出问题啦:'.decode('utf-8')+proxy["https"]
                time.sleep(0.1)
            else:
                print ('已刷%d次,%s')%(finished_times+1,proxy["https"])
                time.sleep(random.random())
                finished_times+=1
     
            times+=1
            #每当所有的代理ip刷过一轮,延时15秒
            if not times%len(proxy_list):
                time.sleep(15)
     
    if __name__=="__main__":
        get_proxy_list()
        start()
    

            上述的两个脚本是小菌在网上搜索到的,并亲自测试过,短期内是没问题。但貌似目前已经被CSDN的服务端修复了,毕竟现在爬虫这么猖狂,反爬虫的技术也一直在升级!感兴趣的小伙伴们可以自行去测试,研究一下反爬机制哦~

    反面教材

            说了那么多正面例子,让我们来看看反面教材(小菌表示懒得打码了(▼ヘ▼#))。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
            虽然不是什么"正义人士",但本菌坚决抵制"标题党"们的这种行为,好好的CSDN口碑就是被这些人士给弄得乌烟瘴气的!

    总结

            关于如何快速提高CSDN的访问量,本次的分享就到这里了,小伙伴们不妨去试试看啦(反面例子就不要去试了)~有什么疑惑或者好的建议欢迎评论区积极留言,小菌都会积极回复哒(๑╹◡╹)ノ"""喜欢的小伙伴们记得点赞关注小菌吖。点赞加关注,小白不迷路…
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • python爬虫增加访问量

    万次阅读 多人点赞 2019-08-20 16:37:19
    看着自己少得可怜的访问量,突然有一个想用爬虫刷访问量的想法,主要也是抱着尝试的心态,学习学习。 第一版:网上借鉴了一下 以下代码运行在 python3 import urllib.request import time # 使用build_opener...

        看着自己少得可怜的访问量,突然有一个想用爬虫刷访问量的想法,主要也是抱着尝试的心态,学习学习。

     

    第一版:网上借鉴了一下           以下代码运行在 python3

    import urllib.request
    import time
    
    # 使用build_opener()是为了让python程序模仿浏览器进行访问
    opener = urllib.request.build_opener()
    opener.addheaders = [('User-agent', 'Mozilla/5.0')]
    
    
    # 专刷某个页面
    print('开始刷了哦:')
    tempUrl = 'https://blog.csdn.net/Lin_QC/article/details/88966839'
    
    
    
    for j in range(2000):
        try:
            opener.open(tempUrl)
            time.sleep(7)
            print('%d %s' % (j, tempUrl))
        except urllib.error.HTTPError:
            print('urllib.error.HTTPError')
            time.sleep(1)
        except urllib.error.URLError:
            print('urllib.error.URLError')
            time.sleep(1)
    

    该代码主要就是利用爬虫打开网页来进行访问量的刷新,但是,该方法遇到了瓶颈,当刷新到一定访问量时,csdn的服务器会阻止该ip的访问,也就刷新不了访问量了。

    所以,也就衍生了第二版。

    我们可以在  一些网站上看到很多代理ip,使用这些代理ip,可以防止服务器阻止访问。

    首先,编写了一个获取代理ip的文件,经我本人实验,国内http代理ip较为稳定,所以我们爬取某些页面,例如

    'https://www.xicidaili.com/wt/1'

    的代理ip信息,并将它们存储在proxy文件里,以下代码是基于 python2的,注意不要弄错版本

    proxy_IP.py文件

    import urllib2
    import BeautifulSoup
    
    User_Agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0'
    header = {}
    header['User-Agent'] = User_Agent
    
    url = 'https://www.xicidaili.com/wt/1'
    req = urllib2.Request(url, headers=header)
    res = urllib2.urlopen(req).read()
    
    soup = BeautifulSoup.BeautifulSoup(res)
    ips = soup.findAll('tr')
    f = open("proxy", "w")
    
    for x in range(1,len(ips)):
        ip = ips[x]
    
        tds = ip.findAll("td")
        ip_temp = tds[1].contents[0]+","+tds[2].contents[0]+"\n"
    
        print tds[1].contents[0]+"\t"+tds[2].contents[0]
        f.write(ip_temp)

    通过执行以上代码,我们就可以获得大量代理ip,接下来就是使用这些ip进行对博客的访问。

    csdnfake.py

    import urllib2
    import socket
    import time
    import random
    
    socket.setdefaulttimeout(3)
    
    user_agent_list = [
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
        'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
        'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
        'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)',
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
        'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
        'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)',
        'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0',
        'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
    ]
    f = open("proxy")
    lines = f.readlines()
    proxys = []
    
    for i in range(0,len(lines)):
        ip = lines[i].strip().split(",")
        proxy_host = "http://"+ip[0]+":"+ip[1]
        print "http://"+ip[0]+":"+ip[1]
        proxy_temp = {"http": proxy_host}
        proxys.append(proxy_temp)
    urls = {"https://blog.csdn.net/Lin_QC/article/details/88966839",
           "https://blog.csdn.net/Lin_QC/article/details/88930018",
           "https://blog.csdn.net/Lin_QC/article/details/88642949",
           "https://blog.csdn.net/Lin_QC/article/details/84568170",
           "https://blog.csdn.net/Lin_QC/article/details/84451279",
           "https://blog.csdn.net/Lin_QC/article/details/84927503",
           }
    
    j=1
    for i in range(100):
        for proxy in proxys:
            for url in urls:
                try:
                    user_agent = random.choice(user_agent_list)
                    proxy_support = urllib2.ProxyHandler(proxy)
                    opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
                    urllib2.install_opener(opener)
                    req = urllib2.Request(url)
                    c = urllib2.urlopen(req)
                    print ("sucessful",j)
                    j+=1
                    time.sleep(5)  
                except Exception, e:
                    print proxy
                    print e
                    continue
    

    user_agent_list是一堆浏览器的代理头,可以模仿浏览器访问博客。

    每次访问休息五秒,主要是因为过快的访问对csdn无效。

     

    效果,刷过访问量的博客和没刷的差距明显

     

    其实,刷新访问量的行为是可耻的,本人也是被惨不忍睹的访问量激怒,好奇一试,之后还是会努力提高博客质量,靠实力提升访问量。

     

     

    2019 七月

    隔了很久,又来提这篇博客,个人感觉csdn又增强了反爬机制,上述的方法只能一定程度上提高访问量,到了一定限度就会由验证码页面拒绝,导致代码失效,然后过阵子又可以,其实这样的刷访问量效率是很低的,尽管我们可以在通过加入验证码识别丰富我们的代码,使它更有健壮性,但是我还是决定有空再尝试,个人感觉提高博客质量才是重点,并且有的时候蹭蹭热度 效果也还不错,就如下图:

     

     

    不过还是不要忘了,写博客主要还是分享自己的收获,或者记录一下自己的学习历程,方便日后再次拿起来用,不要太在意访问量

     

    2019年11月

    很遗憾,服务器的安全机制越来越强,目前代码已经失去作用

     

    展开全文
  • 实现用户访问量/功能访问量的统计信息的查询-接上篇过滤器 拦截器前言1、情景分析与介绍1.1 数据库表1.1.1 设计表1.1.2 visit_records_number用户访问数 数据展示1.1.3 visit_records_function各功能的用户点击量 ...

    前言

    上一篇链接:SpringBoot拦截器与过滤器 实现用户访问量/功能访问量的统计

    真正在公司中的实践:NoSQL + RDBMS 一起使用才是最强的

    技术没有高低之分,就看你如何去使用!(提升内功,思维的提高!多思考!)

    云计算的长征之路:阿里云的这群疯子,阿里巴巴的架构演进!

    1、情景分析与介绍

    经过上篇过滤器 拦截器实现了,用户访问量/功能访问量在redis的统计,并将统计信息定时持久化到数据库后
    现在:
    我们要让后台人员直观的看到
        1.访客数的波动情况
        2.各主要功能用户点击量的波动情况
    然后我们对这些数据进行分析
        1.访客数变少
            我们就要分析原因,加大宣传,
        2.某功能热门
            我们就不断推出新功能,持续吸流,提高并发能力
        等等…

    最终实现的功能接口
    在这里插入图片描述

    1.1 数据库表

    1.1.1 设计表

    在这里插入图片描述

    1.1.2 visit_records_number用户访问数 数据展示

    在这里插入图片描述

    1.1.3 visit_records_function各功能的用户点击量 数据展示

    在这里插入图片描述

    2、SpringBoot各业务逻辑层

    2.1 VisitHandle Control层 控制业务逻辑

    package com.hut.weekcp.server.handle;
    
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiOperation;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import com.hut.weekcp.server.entity.ResultVO;
    import com.hut.weekcp.server.iservice.ITalkService;
    import com.hut.weekcp.server.iservice.IVisitService;
    
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    
    @RequestMapping("/api/visit")
    @Api(tags = "后台管理:用户访问量/功能访问量")
    @RestController
    
    public class VisitHandle {
        @Autowired
        IVisitService visitService;
    
        @Autowired
        ITalkService talkService;
    
        @GetMapping("/visitor/today")
        @ApiOperation(value = "  今天的用户访问数")
        public ResultVO doGet(@RequestParam("token") String token,
                              @RequestParam(value = "date", required = false, defaultValue = "") String date) {
            Calendar cal = Calendar.getInstance();
            String day = cal.get(Calendar.DATE) + "";
            String month = (cal.get(Calendar.MONTH) + 1) + "";
            String year = cal.get(Calendar.YEAR) + "";
            return new ResultVO(200, visitService.getDateVisit(year, month, day));
        }
    
        @GetMapping("/visitor/recentWeek")
        @ApiOperation(value = "  获取近7天的用户访问数(天)")
        public ResultVO doWeekGet(@RequestParam("token") String token,
                                  @RequestParam(value = "date", required = false, defaultValue = "") String date) {
            return new ResultVO(200, visitService.getWeekVisit());
        }
    
        @GetMapping("/function/recentWeek")
        @ApiOperation(value = "  获取近7天各功能的用户点击量(天)")
        public ResultVO dofunctionWeekGet(@RequestParam("token") String token,
                                  @RequestParam(value = "date", required = false, defaultValue = "") String date) {
            return new ResultVO(200, visitService.dofunctionWeekGet());
        }
    
    
        @GetMapping("/visitor/recentMonth")
        @ApiOperation(value = "  获取近30天的用户访问数(天)")
        public ResultVO doDayGet(@RequestParam("token") String token,
                                 @RequestParam(value = "date", required = false, defaultValue = "") String date) {
            return new ResultVO(200, visitService.getMonthVisit());
        }
    
        @GetMapping("/function/recentMonth")
        @ApiOperation(value = "  获取近30天各功能的用户点击量(天)")
        public ResultVO dofunctionDayGet(@RequestParam("token") String token,
                                 @RequestParam(value = "date", required = false, defaultValue = "") String date) {
            return new ResultVO(200, visitService.getfunctionMonthVisit());
        }
    
        @GetMapping("/function/recentYear")
        @ApiOperation(value = "  获取近一年各月各功能的用户点击量(月)")
        public ResultVO dofunctionYearGet(@RequestParam("token") String token,
                                         @RequestParam(value = "date", required = false, defaultValue = "") String date) {
            return new ResultVO(200, visitService.dofunctionYearGet());
        }
    
        @GetMapping("/visitor/byMonth")
        @ApiOperation(value = "  获取某年某月各天用户访问数(天)")
        public ResultVO getVisitByMonth(@RequestParam("token") String token,
                                        @RequestParam("month") String month,
                                        @RequestParam("year") String year,
                                        @RequestParam(value = "date", required = false, defaultValue = "") String date) {
            return new ResultVO(200, visitService.getVisitByMonth(month, year));
        }
    
        @GetMapping("/visitor/byYear")
        @ApiOperation(value = "  获取某年各月的用户访问数(月)")
        public ResultVO byYear(@RequestParam("token") String token,
                                   @RequestParam("year") String year,
                                   @RequestParam(value = "date", required = false, defaultValue = "") String date) {
            return new ResultVO(200, visitService.byYear(year));
        }
    
        @GetMapping("/visitor/recentYear")
        @ApiOperation(value = "  获取近一年各月的用户访问数(月)")
        public ResultVO visitorRecentYear(@RequestParam("token") String token,
                                   @RequestParam(value = "date", required = false, defaultValue = "") String date) {
            return new ResultVO(200, visitService.visitorRecentYear());
        }
    
        @GetMapping("/function/getFunctionVisitorNumber")
        @ApiOperation(value = "  今天各功能的用户点击量")
        public ResultVO recentYear(@RequestParam("token") String token,
                                   @RequestParam(value = "date", required = false, defaultValue = "") String date) {
            return new ResultVO(200, visitService.getFunctionVisitorNumber());
        }
    }
    
    

    2.2 IVisitService Service层 控制业务

    2.2.1 接口 IVisitService

    package com.hut.weekcp.server.iservice;
    
    import com.hut.weekcp.server.entity.*;
    import com.hut.weekcp.server.entity.talk.TalkDO;
    import com.hut.weekcp.server.entity.user.UserDO;
    import org.apache.ibatis.annotations.Insert;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public interface IVisitService {
        /**
         * 获取今天的用户访问数
         * @return
         */
        Integer getDateVisit(String year, String month, String day);
    
        /**
         * 获取近30天的用户访问数
         * @return
         */
        List<VisitDO> getMonthVisit();
    
        /**
         * 获取某年某月各天用户访问数(天)
         * @return
         */
        List<VisitDO> getVisitByMonth(String month, String year);
    
        /**
         * 获取某年各月的用户访问数(月)
         * @return
         */
        List<Map> byYear(String year);
    
        /**
         * 获取近一年各月的用户访问数(月)
         * @return
         */
        List<Map> visitorRecentYear();
    
        /**
         * 今天各功能的用户点击量
         * @return
         */
        List<VisitRrecordsFunction> getFunctionVisitorNumber();
    
        /**
         * 获取近7天的用户访问数
         * @return
         */
        List<VisitDO> getWeekVisit();
    
        /**
         * 获取近7天各功能的用户点击量(天)
         * @return
         */
        Map<String,List<SimpleVisitRrecordsFunction>> dofunctionWeekGet();
    
        /**
         * 获取近30天各功能的用户点击量(天)
         * @return
         */
        Map<String,List<SimpleVisitRrecordsFunction>> getfunctionMonthVisit();
    
        /**
         *  获取近一年各月各功能的用户点击量(月)
         * @return
         */
        Map<String,List<SimpleVisitRrecordsFunction>> dofunctionYearGet();
    
        /**
         * 根据Url映射UrlModule信息
         * @return
         */
        UrlModuleDO getUrlModule(String Url);
    
        /**
         * 根据token查询userId
         * @return
         */
        Integer getUserId(String token);
    
    
    }
    

    2.2.1 实现类 VisitServiceImpl

    package com.hut.weekcp.server.serviceImpl;
    
    import com.hut.weekcp.server.entity.SimpleVisitRrecordsFunction;
    import com.hut.weekcp.server.entity.UrlModuleDO;
    import com.hut.weekcp.server.entity.VisitRrecordsFunction;
    import com.hut.weekcp.server.entity.talk.SimpleCommentDTO;
    import com.hut.weekcp.server.exception.NotSuchUserIdException;
    import com.hut.weekcp.server.utils.ConstantUtil;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Service;
    import com.hut.weekcp.server.entity.VisitDO;
    import com.hut.weekcp.server.iservice.IVisitService;
    import com.hut.weekcp.server.mapper.VisitMapper;
    
    import java.text.SimpleDateFormat;
    import java.util.*;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    @Service
    public class VisitServiceImpl implements IVisitService {
        @Autowired
        VisitMapper mapper;
    
        @Autowired
        //@Qualifier:表明我们自定义的RedisTemplate才是我们所需要的
        @Qualifier(value = "redisTemplates")
        private RedisTemplate redisTemplates;
    
        /**
         * 获取今天的用户访问数
         *
         * @return
         */
        @Override
        public Integer getDateVisit(String year, String month, String day) {
            //直接从redis统计最新的 用户数量
            return getNewestVisitorsData();
        }
    
        /**
         * 获取近7天各功能的用户点击量(天)
         *
         * @return
         */
        public Map<String, List<SimpleVisitRrecordsFunction>> dofunctionWeekGet() {
            Map<String, List<SimpleVisitRrecordsFunction>> map = new LinkedHashMap<>();
            //今天最新的用户点击量(天)
            List<SimpleVisitRrecordsFunction> listToday = new ArrayList<SimpleVisitRrecordsFunction>();
            listToday = getNewDataSimple();
            String[] TadayYearMonthDay = getYearMonthDayByNumber(0);
            map.put(TadayYearMonthDay[0] + "年" + TadayYearMonthDay[1] + "月" + TadayYearMonthDay[2] + "日", listToday);
    
            //前6天的用户点击量(天)
            for (int i = -1; i >= -6; i--) {
                String[] YearMonthDay = getYearMonthDayByNumber(i);
                int year = Integer.parseInt(YearMonthDay[0]);
                int month = Integer.parseInt(YearMonthDay[1]);
                int day = Integer.parseInt(YearMonthDay[2]);
                List<SimpleVisitRrecordsFunction> list = mapper.dofunctionWeekGet(Integer.parseInt((YearMonthDay[0])) + "", Integer.parseInt(YearMonthDay[1]) + "", Integer.parseInt(YearMonthDay[2]) + "");
                map.put(YearMonthDay[0] + "年" + YearMonthDay[1] + "月" + YearMonthDay[2] + "日", list);
            }
            return map;
        }
    
        /**
         * 获取近30天各功能的用户点击量(天)
         *
         * @return
         */
        public Map<String, List<SimpleVisitRrecordsFunction>> getfunctionMonthVisit() {
            Map<String, List<SimpleVisitRrecordsFunction>> map = new LinkedHashMap<>();
            //今天最新的用户点击量(天)
            List<SimpleVisitRrecordsFunction> listToday = new ArrayList<SimpleVisitRrecordsFunction>();
            listToday = getNewDataSimple();
            String[] TadayYearMonthDay = getYearMonthDayByNumber(0);
            map.put(TadayYearMonthDay[0] + "年" + TadayYearMonthDay[1] + "月" + TadayYearMonthDay[2] + "日", listToday);
    
            //前6天的用户点击量(天)
            for (int i = -1; i >= -29; i--) {
                String[] YearMonthDay = getYearMonthDayByNumber(i);
                int year = Integer.parseInt(YearMonthDay[0]);
                int month = Integer.parseInt(YearMonthDay[1]);
                int day = Integer.parseInt(YearMonthDay[2]);
                List<SimpleVisitRrecordsFunction> list = mapper.dofunctionWeekGet(Integer.parseInt((YearMonthDay[0])) + "", Integer.parseInt(YearMonthDay[1]) + "", Integer.parseInt(YearMonthDay[2]) + "");
                map.put(YearMonthDay[0] + "年" + YearMonthDay[1] + "月" + YearMonthDay[2] + "日", list);
            }
            return map;
        }
        /**
         *  获取近一年各月各功能的用户点击量(月)
         * @return
         */
        public Map<String,List<SimpleVisitRrecordsFunction>> dofunctionYearGet(){
            Map<String, List<SimpleVisitRrecordsFunction>> map = new LinkedHashMap<>();
            Calendar cal = Calendar.getInstance();
            String todayYear = cal.get(Calendar.YEAR) + "";
    
            //12个月的用户点击量
            for (int i = 1; i <= 12; i++) {
                List<SimpleVisitRrecordsFunction> list = mapper.byFunctionYear(todayYear,i+"");
                map.put(todayYear+"年" + i+ "月", list);
            }
            return map;
        }
    
    
        /**
         * 获取近7天的用户访问数
         *
         * @return
         */
        public List<VisitDO> getWeekVisit() throws NotSuchUserIdException {
    
            List<VisitDO> list = mapper.getWeekVisit();
    
            //list可能不包含今天的用户访问数
            Calendar cal = Calendar.getInstance();
            String day = cal.get(Calendar.DATE) + "";
            boolean YesNo = false;
            for (VisitDO visitDO : list) {
                if (visitDO.getDay().equals(day)) {
                    YesNo = true;
                }
            }
            Integer NumberOfVisitors = 0;
            if (!YesNo) {//取出今天最新的用户访问数
                String month = (cal.get(Calendar.MONTH) + 1) + "";
                String year = cal.get(Calendar.YEAR) + "";
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                NumberOfVisitors = getNewestVisitorsData();
                VisitDO visitDO = new VisitDO();
                visitDO.setYear(year);
                visitDO.setMonth(month);
                visitDO.setDay(day);
                visitDO.setCreatTime(format.format(cal.getTime()));
                visitDO.setVisitors(NumberOfVisitors);
                list.add(visitDO);
            }
            return list;
        }
    
        /**
         * 获取近30天的用户访问数
         *
         * @return
         */
        @Override
        public List<VisitDO> getMonthVisit() {
            List<VisitDO> list = mapper.getMonthVisit();
    
            //list可能不包含今天的用户访问数
            Calendar cal = Calendar.getInstance();
            String day = cal.get(Calendar.DATE) + "";
            boolean YesNo = false;
            for (VisitDO visitDO : list) {
                if (visitDO.getDay().equals(day)) {
                    YesNo = true;
                }
            }
            Integer NumberOfVisitors = 0;
            if (!YesNo) {//取出今天最新的用户访问数
                String month = (cal.get(Calendar.MONTH) + 1) + "";
                String year = cal.get(Calendar.YEAR) + "";
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                NumberOfVisitors = getNewestVisitorsData();
                VisitDO visitDO = new VisitDO();
                visitDO.setYear(year);
                visitDO.setMonth(month);
                visitDO.setDay(day);
                visitDO.setCreatTime(format.format(cal.getTime()));
                visitDO.setVisitors(NumberOfVisitors);
                list.add(visitDO);
            }
            return list;
        }
    
        /**
         * 获取某年某月各天用户访问数(天)
         *
         * @return
         */
        public List<VisitDO> getVisitByMonth(String month, String year) {
            Calendar cal = Calendar.getInstance();
            String todayMonth = (cal.get(Calendar.MONTH) + 1) + "";
            String todayYear = cal.get(Calendar.YEAR) + "";
            String day = cal.get(Calendar.DATE) + "";
            List<VisitDO> list = mapper.getVisitByMonth(month, year);
    
            //如果查的是本月 ,list可能不包含今天的用户访问数
            if (todayYear.equals(year) && todayMonth.equals(month)) {
                boolean YesNo = false;
                for (VisitDO visitDO : list) {
                    if (visitDO.getDay().equals(day)) {
                        YesNo = true;
                    }
                }
                Integer NumberOfVisitors = 0;
                if (!YesNo) {//取出今天最新的用户访问数
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    NumberOfVisitors = getNewestVisitorsData();
                    VisitDO visitDO = new VisitDO();
                    visitDO.setYear(todayMonth);
                    visitDO.setMonth(todayYear);
                    visitDO.setDay(day);
                    visitDO.setCreatTime(format.format(cal.getTime()));
                    visitDO.setVisitors(NumberOfVisitors);
                    list.add(visitDO);
                }
            }
            return list;
        }
    
        /**
         * 获取某年各月的用户访问数(月)
         *
         * @return
         */
        public List<Map> byYear(String year) {
            List<Map> list = mapper.byYear(year);
            if (list.size() == 0) {
                return null;
            }
            return list;
        }
    
        /**
         * 获取近一年各月的用户访问数(月)
         * @return
         */
        public List<Map> visitorRecentYear(){
            Calendar cal = Calendar.getInstance();
            String todayYear = cal.get(Calendar.YEAR) + "";
            List<Map> list = mapper.byYear(todayYear);
            if (list.size() == 0) {
                return null;
            }
            return list;
        }
    
        /**
         * 今天各功能的用户点击量
         *
         * @return
         */
        public List<VisitRrecordsFunction> getFunctionVisitorNumber() {
            List<VisitRrecordsFunction> list = new ArrayList<VisitRrecordsFunction>();
            list = getNewData();
            return list;
        }
    
        //直接从redis统计最新的 用户数量
        private Integer getNewestVisitorsData() {
            Integer NumberOfVisitors = 0;
            Object object = redisTemplates.opsForHash().size(ConstantUtil.Redis.HASH_VISITOR_TNTERCEPTOR);
            if (object != null) {
                Long a = (long) object;
                NumberOfVisitors = a.intValue();
            }
            return NumberOfVisitors;
        }
    
        //得到前 i 天的Year Month Day
        private String[] getYearMonthDayByNumber(int i) {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            Calendar c = Calendar.getInstance();
            c.setTime(new Date());
    
            c.add(Calendar.DATE, i);
            Date start = c.getTime();
            String qyt = format.format(start);//前一天的字符串
            String[] arr1 = qyt.split("-");//分割为Year Month Day
            return arr1;
        }
    
        //redis取最新的各功能的用户点击量(Simple)
        private List<SimpleVisitRrecordsFunction> getNewDataSimple() {
            List<SimpleVisitRrecordsFunction> list = new ArrayList<SimpleVisitRrecordsFunction>();
            //从redis取最新的数据
            //记录用户功能访问信息
            List<String> Functions = mapper.getAllFunction();
            //利用redis hash 来统计各功能访问人数 key为功能 value是访问次数
            for (
                    String function : Functions) {
                if (!function.equals("")) {//                            Funtion                                    Funtion:
                    redisTemplates.opsForHash().put(ConstantUtil.Redis.HASH_Funtion, ConstantUtil.Redis.HASH_Funtion_PREX + function, 0);
                }
            }
    
            //遍历统计,所有用户访问过的功能
            List<Object> hValuesList = redisTemplates.opsForHash().values("VisitorInterceptor");
            if (hValuesList.size() > 0) {
                for (Object functionObject : hValuesList) {
                    List<String> functionList = (List<String>) functionObject;
                    for (String function : functionList) {
                        redisTemplates.opsForHash().increment(ConstantUtil.Redis.HASH_Funtion, ConstantUtil.Redis.HASH_Funtion_PREX + function, 1);
                    }
                }
            }
    
            Object objectKeyList = redisTemplates.opsForHash().keys(ConstantUtil.Redis.HASH_Funtion);
            if (objectKeyList != null) {
                Set<String> functionSet = (Set<String>) objectKeyList;
                //根据 key(功能)获得value(访问次数)
                for (String function : functionSet) {
                    Object object = (redisTemplates.opsForHash().get(ConstantUtil.Redis.HASH_Funtion, function));//key:"Funtion", value:"Funtion:cim匿名聊天有关"
                    if (object != null) {
                        Integer number = (int) object;
                        SimpleVisitRrecordsFunction simpleVisitRrecordsFunction = new SimpleVisitRrecordsFunction();
                        simpleVisitRrecordsFunction.setFunction(function);
                        simpleVisitRrecordsFunction.setNumber(number);
                        list.add(simpleVisitRrecordsFunction);
                    }
                }
            }
            //删除 统计各功能访问人数的redis hash
            redisTemplates.delete(ConstantUtil.Redis.HASH_Funtion);
            return list;
        }
    
        //redis取最新的各功能的用户点击量
        private List<VisitRrecordsFunction> getNewData() {
            List<VisitRrecordsFunction> list = new ArrayList<VisitRrecordsFunction>();
    
            Calendar cal = Calendar.getInstance();
            String day = cal.get(Calendar.DATE) + "";
            String month = (cal.get(Calendar.MONTH) + 1) + "";
            String year = cal.get(Calendar.YEAR) + "";
            String hour = cal.get(Calendar.HOUR_OF_DAY) + "";
            //从redis取最新的数据
            //记录用户功能访问信息
            List<String> Functions = mapper.getAllFunction();
            //利用redis hash 来统计各功能访问人数 key为功能 value是访问次数
            for (
                    String function : Functions) {
                if (!function.equals("")) {//                            Funtion                                    Funtion:
                    redisTemplates.opsForHash().put(ConstantUtil.Redis.HASH_Funtion, ConstantUtil.Redis.HASH_Funtion_PREX + function, 0);
                }
            }
    
            //遍历统计,所有用户访问过的功能
            List<Object> hValuesList = redisTemplates.opsForHash().values("VisitorInterceptor");
            if (hValuesList.size() > 0) {
                for (Object functionObject : hValuesList) {
                    List<String> functionList = (List<String>) functionObject;
                    for (String function : functionList) {
                        redisTemplates.opsForHash().increment(ConstantUtil.Redis.HASH_Funtion, ConstantUtil.Redis.HASH_Funtion_PREX + function, 1);
                    }
                }
            }
    
            Object objectKeyList = redisTemplates.opsForHash().keys(ConstantUtil.Redis.HASH_Funtion);
            if (objectKeyList != null) {
                Set<String> functionSet = (Set<String>) objectKeyList;
                //根据 key(功能)获得value(访问次数)
                for (String function : functionSet) {
                    Object object = (redisTemplates.opsForHash().get(ConstantUtil.Redis.HASH_Funtion, function));//key:"Funtion", value:"Funtion:cim匿名聊天有关"
                    if (object != null) {
                        Integer number = (int) object;
                        VisitRrecordsFunction visitRrecordsFunction = new VisitRrecordsFunction();
                        visitRrecordsFunction.setYear(year);
                        visitRrecordsFunction.setMonth(month);
                        visitRrecordsFunction.setDay(day);
                        visitRrecordsFunction.setHour(hour);
                        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                        visitRrecordsFunction.setCreatTime(format.format(cal.getTime()));
                        visitRrecordsFunction.setFunction(function);
                        visitRrecordsFunction.setNumber(number);
                        list.add(visitRrecordsFunction);
                    }
                }
            }
            //删除 统计各功能访问人数的redis hash
            redisTemplates.delete(ConstantUtil.Redis.HASH_Funtion);
            return list;
        }
    
    
        /**
         * 根据Url映射UrlModule信息
         *
         * @return
         */
        public UrlModuleDO getUrlModule(String Url) {
            return mapper.getUrlModule(Url);
        }
    
        /**
         * 根据token查询userId
         *
         * @return
         */
        public Integer getUserId(String token) {
            return mapper.getUserId(token);
        }
    
    }
    
    

    3、VisitMapper Dao层 与数据库进行交互,持久化

    package com.hut.weekcp.server.mapper;
    
    import com.hut.weekcp.server.entity.*;
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    import java.util.Map;
    
    public interface VisitMapper {
    
        @Insert("INSERT INTO visit(dayTime, hourTime, visitors) values (#{dayTime}, #{hourTime}, #{visitors})")
        void addVisitor(VisitDO visit);
    
        /**
         *记录访问人数
         * @return
         */
        @Insert("INSERT INTO visit_records_number(year, month, day,hour,visitors,creatTime) values (#{year}, #{month}, #{day},#{hour}, #{visitors}, #{creatTime})")
        void addVisitRecordsNumber(VisitDO visit);
    
        /**
         *记录用户功能访问信息
         * @return
         */
        @Insert("INSERT INTO visit_records_function(function,number,year, month, day,hour,creatTime) values (#{function}, #{number},#{year}, #{month}, #{day},#{hour},#{creatTime})")
        void addVisitRecordsFunction( VisitRrecordsFunction visitRrecordsFunction);
    
        /**
         *查询用户访问人数
         * @return
         */
        @Select("SELECT visitors FROM visit_records_number  WHERE year = #{year} and month = #{month} and day = #{day} and is_delete=0")
        Integer queryVisitor(String year,String month,String day);
    
        /**
         * 获取近7天的用户访问数
         * @return
         */
        @Select("SELECT year,month,day,creatTime,visitors FROM visit_records_number where `hour`=23 and is_delete=0 and DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(creatTime) order by creatTime asc")
        List<VisitDO> getWeekVisit();
    
        /**
         * 获取近1天各功能的用户点击量(天)
         * @return
         */
        @Select("SELECT function,number FROM visit_records_function where year = #{year} and  month=#{month}  and day=#{day} and  `hour`=23 and is_delete=0")
        List<SimpleVisitRrecordsFunction> dofunctionWeekGet(String year,String month,String day);
    
        /**
         * 获取近30天的用户访问数
         * @return
         */
        @Select("SELECT year,month,day,creatTime,visitors FROM visit_records_number where `hour`=23 and is_delete=0 and DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(creatTime) order by creatTime asc")
        List<VisitDO> getMonthVisit();
    
    
        /**
         * 获取某年某月各天用户访问数(天)
         * @return
         */
        @Select("SELECT year,month,day,creatTime,visitors FROM visit_records_number where `hour`=23 and month=#{month} and year = #{year} and is_delete=0 order by creatTime asc")
        List<VisitDO> getVisitByMonth(String month,String year);
    
        /**
         * 获取某年各月的用户访问数(月)
         * @return
         */
        @Select("select month as month,sum(visitors) as visitors from visit_records_number where year = #{year} and `hour`=23 and is_delete=0 group by month")
        List<Map> byYear(String year);
    
    
        /**
         * 获取近一年各月各功能的用户点击量(月)
         * @return
         */
        @Select("select function as function,sum(number) as number from visit_records_function where year=#{year} and month=#{month} group by function")
        List<SimpleVisitRrecordsFunction> byFunctionYear(String year ,String month);
    
        /**
         * 今天各功能分别多少用户使用
         * @return
         */
        @Select("select * from visit_records_function where year = #{year} and month = #{month} and day = #{day} and hour =0 and is_delete=0")
        List<VisitRrecordsFunction> getFunctionVisitorNumber(String year,String month,String day,String hour);
    
        /**
         * 根据Url映射UrlModule信息
         * @return
         */
        @Select("SELECT * FROM url_action_module  WHERE url = #{Url} and is_delete = 0")
        UrlModuleDO getUrlModule(String Url);
    
        /**
         * 查询所有映射功能
         */
        @Select("select `function` from url_action_module WHERE is_delete = 0 group by `function`")
        List<String>  getAllFunction();
    
        /**
         * 根据token查询userId
         * @return
         */
        @Select("SELECT user_id FROM qz_token  WHERE token = #{token} and is_delete = 0")
        Integer getUserId(String token);
    
    
        @Insert("INSERT into visitorinterceptor(userId, moduleId,function,url,year,month,day,hour) values (#{userId},#{moduleId},#{function},#{url},#{year},#{month},#{day},#{hour})")
        void setVisitorsModule(VisitorsModule visitorsModule);
    }
    
    
    展开全文
  • 网站用户访问量统计—Django

    千次阅读 2019-08-08 20:25:30
    最近准备弃用Django自带的admin,将个人博客网站接入hadmin后台模板,同时想要实现用户访问量统计功能。在网上查了一下具体实现方法。众说纷纭,有接入第三方的、有js实现的、有后端代码实现的,第三方的话很简单,...

    最近准备弃用Django自带的admin,将个人博客网站接入hadmin后台模板,同时想要实现用户访问量统计功能。在网上查了一下具体实现方法。众说纷纭,有接入第三方的、有js实现的、有后端代码实现的,第三方的话很简单,在前端页面上加入几行代码就可以了,但是查询访问量的时候貌似需要登录第三方网站才能查询,而我想要实现在网站上展示这些数据,其次安全性也是一个大问题,本着能造车轮就不闲着的原则,我自己动手写了一个简单的访问量统计功能,包括当日用户量、总用户量。同时添加了ip过滤功能——即同一ip同一天内访问多次时在后端只记录一次。

    实现思路:

    在数据库中建立两张数据表,分别存放总用户访问量和当日访问用户IP地址,找到一个用户访问网站大概率会经过的页面,在其后端代码中加上相应的功能代码。用户每访问一次该页面,后台获取用户IP地址,再拿该地址到数据库中比对查看是否已有数据,有的话不执行操作,否则将该IP地址存到数据库中(实现同一IP多次访问记录一次)。

    实现代码:

    model文件中创建两个表

    class Website_views(models.Model):
        """
        网站访问量统计表:字段ID、总访问量
        """
        nid = models.AutoField(primary_key=True)
        views = models.IntegerField()
    
    
    class view_ip(models.Model):
        """
        最近访问用户IP:字段ID、用户IP
        """
        nid = models.AutoField(primary_key=True)
        user_ip = models.CharField(max_length=15, null=False)
        create_time = models.DateTimeField(auto_now_add=True)
    
    

    将访问量统计功能封装成对应的函数

    def get_user_ip(request):
        if 'HTTP_X_FORWARDED_FOR' in request.META:        # 获取用户真实IP地址
            user_ip = request.META['HTTP_X_FORWARDED_FOR']
        else:
            user_ip = request.META['REMOTE_ADDR']
        obj = models.view_ip.objects.first()
        if not obj == None:                                # 判断数据表是否为空
            ct = obj.create_time
            if not ct.month == dt.datetime.now().month or not ct.day == dt.datetime.now().day:      # 判断表中数据是否为当日访问
                objs = models.view_ip.objects.all()         # 不是当日访问则迭代删除表中数据
                for i in objs:
                    i.delete()
            if not models.view_ip.objects.filter(user_ip=user_ip):  # 判断当日用户是否已经访问过本网站
                models.view_ip.objects.create(user_ip=user_ip)  # 将用户IP存入数据库
                total_views_add()                         # 网站总访问量+1
        else:
            # print(user_ip)
            models.view_ip.objects.create(user_ip = user_ip)
            total_views_add()
    
    
    def total_views_add():
        obj = models.Website_views.objects.first()
        if obj == None:
            models.Website_views.objects.create(views=1)
        else:
            total_views = models.Website_views.objects.first()
            total_views.views = total_views.views + 1
            total_views.save()
    
    

    当日访问用户IP地址表中的数据并不一定是当日的,因为假如8月5日有10个用户访问该网站,此时表中数据是这10个用户的IP地址,8月6日当有用户访问时,数据库中的数据还是8月5日的这个时候就要对数据进行有效判断,具体操作是每次有用户访问时都取数据表中第一条数据和datatime.now(获取当前时间),判断两者的month和day是否相等,相等则是同日内访问的有效数据,不相等则说明该用户是当天第一个访问本网站的用户,然后删除表中所有数据并将该用户IP地址存入表中。

    在对应函数中调用功能函数
    在这里插入图片描述

    效果展示:

    在局域网下分别通过主机、ipad、手机多次登录网站

    view_ip表

    view_ip表数据展示

    Website_views表

    Website_views表数据展示
    关于前端展示部分还没有实现,思路很简单获取总访问量直接取表中数据即可,获取当日访问量需要先进行数据有效判断,再统计表中数据的字段总数count。

    注:

    由于改版后的网站还未上线,只能在局域网下进行简单的测试,所以代码中可能还存在一些未知的bug。在网站上线后将进行系统测试并修复bug。
    Website_views表中只有一条记录,这样看来有些大材小用。其实也可以在static文件中创建一个txt文档用于保存总访问量数据,通过python对文本进行读写来模拟操作数据库,不过在代码上会稍微麻烦一些。
    原文地址: https://www.jhxblog.cn/article/?articleid=7

    展开全文
  • 博客刷访问量(基于代理实现)

    万次阅读 热门讨论 2018-04-25 12:07:47
    1.这样的刷流量,从技术上说,是不可能被后台检测的,根本就不可能,因为他就是一个真实的代理访问,再加上模拟文章访问和点击时间,基本就是无解。 2. 发出来,是感觉挺好玩的,之前看到同学写游戏的挂机外挂,...
  • csdn如何增加访问量

    千次阅读 热门讨论 2019-12-11 18:21:45
    按,访问量从高到底排序勒一下,发现访问最高的才5k左右,那家大牛,动不动一篇博客就是上w,大致总结勒一下,综合本人博客文章内容的一个访问量排名,发现提高访问量有如下几点: 1.标题得夸张,符合软件行业...
  • 我们通过美国和全球的自然流量吸引了访问量最高的前100个站点。 然后,我们使用了网站浏览器 和关键字浏览器(我们的竞争分析和关键字研究工具)来更深入地研究其中一些网站为什么受欢迎以及其流量来自何处。 让我们...
  • IP刷点击率网站访问量

    千次下载 热门讨论 2010-07-22 13:16:16
    刷博客/网店 所有博客/空间/网店全面开放,可放心提交。 刷新浪博客:全面开放。 刷搜狐博客:全面开放。 ...刷百度空间:首页及单篇均可提交。...刷blogcn博客:首页及单篇均可提交,如果刷首页,页面不要过长。...
  • Java刷Csdn访问量的小例子

    万次阅读 2021-09-06 10:35:24
    (也可以不使用,感觉没什么卵用) CountDownLatch 是用来控制线程的打印 后续Jsoup主要是用来读取页面当中 访问量的标签,获取到数据的访问量 休眠60,csdn用来预防快速点击页面 // 创建一个线程池,用来提交请求...
  • 记录网站访问量

    千次阅读 2020-06-30 11:43:46
    3、访问主页时增加访问量 4、前端获取点击量或在项目关闭前,将点击量存入数据库(ContextController) 数据库 create table context( click_num int ) dao层 接口 public interface ContextM.
  • //设置txt文档路径(count.txt用来记录总访问量,countday.txt用来记录日访问量) public static final String countPath="D:\\project\\src\\main\\webapp\\WEB-INF\\count.txt"; public static final String ...
  • 前言:相信很多写博客的朋友,会苦恼于博客访问量上不去的问题。博主最近工作比较新手动谢了个小程序,一个可以刷访问量的程序。当然主要是针对csdn博客。有了他 就再也不必担心博客访问量上不去的问题了。注:博客最...
  • 【代码】用最简单的方式刷网页访问量

    万次阅读 多人点赞 2018-08-22 21:15:17
    因为我觉得我写的博客还是蛮不错的,可以帮很多人少走一些弯路,而低的阅读量在搜索排名中是很不占优的,所以希望我的博客能让更多人受益,刷一点访问量啦,还请原谅。 看到网上那么多资料,感觉都太复杂,还要去买...
  • github博客加访问量标签

    千次阅读 2018-04-10 15:17:01
    4、在访问量数据未取回来之前,我不想让页面显示为诸如“本站总访问量 次”,显得太low,怎么办? 只需要如下css,不蒜子执行完毕会自动将标签显示出 < span id = "busuanzi_container_site_pv" style = ...
  • 快速提高 CSDN 访问量

    千次阅读 热门讨论 2017-07-24 09:36:33
    多写常用知识点的博客,想办法提高百度排名,注意标题不要写的太复杂写国内比较新的技术,中短期奇效,效果很好成系列的写技术文章,有利于增加评论,粉丝,中长期能够大幅度提高日常访问量成系列的专栏,利于增加粉丝,亦能...
  • 统计网站页面的访问量

    千次阅读 2016-10-24 16:16:21
    最近做的《食盐行业信用管理与公共服务系统》项目,需要做一个网站文章页面的访问量功能。自己的解决方案,可能很简陋,但是解决了问题,而且我也给出了详细的过程。请大家多多支持,参与谈论。博客写这么长不容易啊...
  • 测试访问量

    万次阅读 2017-08-22 18:50:21
    Just a test!
  • CSDN刷访问量专用博客

    千次阅读 热门讨论 2019-04-24 21:28:16
    该博客除创建会访问一次将不再手动点开 改博客为技术学习地址。 如果是手动点击进入的,麻烦留言。 让我知道减去多少次活人。 蟹蟹。
  • javaweb之统计网站访问量小案例

    千次阅读 2019-02-20 17:04:52
    javaweb之统计网站访问量小案例
  • 使用springboot+redis+spring aop+spring schedule实现页面访问量统计功能 思路介绍 页面访问访问量统计,常用的springboot项目中,我们的controller的获取文章的方法主要是 public class Controller{ @GetMapping...
  • 两行代码搞定博客访问量统计

    千次阅读 2018-10-29 21:29:00
    | 总访问量 <span id="busuanzi_value_site_pv"></span> 次 | 总访客数 <span id="busuanzi_value_site_uv"></span> 人 <!-- 不蒜子计数 --> 修改后的代码 加上设置的初始值20000, <!-- 不蒜子计数 --> ...
  • Web并发页面访问量统计实现

    万次阅读 热门讨论 2018-01-21 09:49:56
    Web并发页面访问量统计实现 页面访问量统计,可能在上学的时候就讲过如何简单实现,例如在servletContext中保存一个页页面访问次数,然后每访问一次加1;或者每访问一次就把操作记录保存到数据库,这样的处理方式,...
  • 在网站推广活动之前,业务方根据经验评估出的系统访问量PV,然后根据各个系统所占的流量比例,计算出每个子系统的访问量,比如商品列表1000万,商品详情1500万,下单500万等,然后根据每个系统和数据库的交互次数,来算出...
  • 如何查看服务器当前的并发访问量

    千次阅读 2020-04-14 08:37:06
    服务器访问人数可以通过命令:netstat -pnt |grep:80列出 比如此时请求服务器上一个页面,通过该命令可以查看结果,后面的ESTABLISHED表示服务器正在被访问,可以通过添加wc-l统计数量,最终命令是:netstat -pnt...
  • Redis统计用户访问量

    万次阅读 2019-06-04 10:49:28
    文章目录1. 使用Hash2. 使用Bitset3....当一个用户访问时,如果用户登陆过,那么我们就使用用户的id,如果用户没有登陆过,那么也可以在前端页面随机生成一个key用来标识用户,当用户访问的时候,我们...
  • node.js 刷csdn博客访问量

    万次阅读 2020-01-16 14:46:08
    身为一名前端技术人员利用node刷一下博客的访问量应该不过分吧··· 导入npm包 request以 npm 包的形式提供,是一个简单的 HTTP 客户端,通过它可方便地实现 HTTP 请求,可以用来请求网页; cherrio是用来分析dom...
  • linux如何查看服务器当前的并发访问量 服务器访问人数可以通过命令: netstat -pnt | grep :80 列出,比如此时请求服务器上一个页面,通过该命令可以查看结果,后面的ESTABLISHED表示服务器正在被访问,可以通过添加...
  • 如何实现网站访问量统计 不利用站长之家实现网站访问量统计 一行代码实现访问量统计 1. 访问http://www.amazingcounters.com/index.php网站 2. 进入网站后选择Sign Up 3. 选择一个能看的统计数字界面 4. 然后拉到底...
  • 用python实现刷网页访问量

    千次阅读 2019-06-19 16:24:26
    看到网上那么多资料,感觉都太复杂,还要去买什么ip,我的意图很简单,学习python和urllib库的使用,用最简单的代码实现这一功能,刷访问量本来就不太好,我发现很多访问量点进去一下就能加1,所以我这相当于是徒手...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,045,846
精华内容 818,338
关键字:

访问量