Blog

Blog

PHODAL

博客反爬虫 策略二——Django RSS添加原文链接

看了看第一篇,想了想过去写爬虫的策略是一个个元素的找,再看看《策略一——根据User Agent》。看来是不能实现的,想了想,最后只想到了RSS订阅这事。

最后效果图:

anti crawler from rss

策略考虑

看了看所谓的垃圾站的一些文章,发现都是原文的,也没有一些特有的元素。有种用RSS订阅过来的感觉,那么显然在我们的文章加一个原文链接的作用可能不是很大。

  • 如果对方的rank比你高,你的文章就很容易被Google定为抄袭
  • 对方可以在link上加nofollow,Google从理论上是支持这个的,实现有可能会继续往下走。

于是策略上就有两部分:

  • 减少原文字数
  • 加原文链接

不良影响:

  • 影响RSS阅读用户。

但是从理论上来说,如果用户有兴趣的话,读原文可能是不错的。只能后面再看看,是否真的有影响了。

Mezzanine Django RSS 扩展

看了看Mezzanine的feed代码,发现改起来也不难。

添加url route

在根目录的urls.py中添加

urlpatterns += patterns("feed.view",
   url("^blog/feeds/(?P<format>.*)%s$" % "/",
       "blog_post_feed", name="blog_post_feed")
)

添加package

新建一个python package,结构如下:

|______init__.py
|____feeds.py
|____view.py

我们的view.py内容是:

from __future__ import unicode_literals

from django.http import Http404
import feeds


def blog_post_feed(request, format, **kwargs):
    try:
        return {"rss": feeds.PostsRSS, "atom": feeds.PostsAtom}[format](**kwargs)(request)
    except KeyError:
        raise Http404()

与之对应的feeds.py则大部分源自mezzanine.blog.feeds,除了修改了item_description方法,原来的方法是

def item_description(self, item):
    return richtext_filters(item.content)

变成了

def item_description(self, item):
    copy_info = "\n原文:[" + \
                super(PostsRSS, self).item_title(item) + "](" + \
                super(PostsRSS, self).item_link(item) + ")"
    return richtext_filters(item.content[0:300]) + richtext_filters(copy_info)

变化

  • 添加了原文链接
  • 限定了字符数300

关于我

Github: @phodal     微博:@phodal     知乎:@phodal    

微信公众号(Phodal)

围观我的Github Idea墙, 也许,你会遇到心仪的项目

QQ技术交流群: 321689806
comment

Feeds

RSS / Atom

最近文章

关于作者

Phodal Huang

Engineer, Consultant, Writer, Designer

ThoughtWorks 技术专家

工程师 / 咨询师 / 作家 / 设计学徒

开源深度爱好者

出版有《前端架构:从入门到微前端》、《自己动手设计物联网》、《全栈应用开发:精益实践》

联系我: h@phodal.com

微信公众号: 最新技术分享

标签