从0到1搭建个人网站 九-实现真实用户的 pv 计算
优质
小牛编辑
127浏览
2023-12-01
pv计算如何过滤爬虫
首先我们要理解爬虫是干什么的,爬虫是抓取你网页的内容,之后用于自己的搜索引擎或者做数据挖掘或者盗用,因此爬虫想要的其实是你的网页里的文本内容,也可能需要样式、布局等,但因为抓取效率的考虑,不会渲染里面的js,也不会抓取里面的图片链接,所以利用这一点,我们找到一个方法可以很好的过滤爬虫的干扰
创建js文件动态生成gif图片
创建web/static/web/my/pv.js,内容如下:
// 为了过滤爬虫,上报的信息是通过js渲染进行的,同时渲染出来的是个图片,这样可以过滤大部分爬虫,同时异步加载和更新pv,不影响用户体验
$(function()
{
var gif_url = '/report/pv.gif?url=' + window.location.href;
var report ="<img id='report_gif' src='" + gif_url + "'>";
$("#report").html(report);
$("#report").css('height', 0);
$("#report").css('width', 0);
});
把这个js添加到所有网页公共的模板的head标签中,即base.html模板
<script src="{% static '/web/my/pv.js' %}"></script>
并在base.html的body中增加如下节点,这样js里动态生成gif就会放到这里:
<div id="report"></div>
下面我们创建一个1像素大小的gif文件,并放到web/static/web/images/onepixel.gif路径下
为了响应这个动态gif的浏览器请求,我们实现如下方法:
在web/views.py中添加:
import os
import re
from django.conf import settings
report_url_pattern = re.compile(r'.*blogId=(\d+).*')
def report_pv(request):
if 'url' in request.GET:
url = request.GET['url']
m = re.match(report_url_pattern, url)
if m:
blog_id = int(m.group(1))
blog = BlogPost.objects.get(id=blog_id)
blog.pv = blog.pv + 1
blog.save()
image_data = open(os.path.join(settings.BASE_DIR, 'web/static/web/images/onepixel.gif'), "rb").read()
return HttpResponse(image_data, content_type="image/gif")
在urls.py添加
url(r'^report/pv.gif$', views.report_pv, name='report_pv'),
好了,现在大功告成,这样我们通过浏览器访问可以正常统计到pv,而爬虫过来就不会统计上去了