资讯专栏INFORMATION COLUMN

Python爬虫建站入门手记——从零开始建立采集站点(三:采集入库)

amuqiao / 1743人阅读

摘要:进入正题第三部分,采集入库。内容如下加上这个可以记住问题在的位置,方便以后更新或者其他操作都很直白,关于各个可以看看的文档。代码如下添加方法采集当前分页正在抓取分页这个地方写得很笨,之前该在加上这个属性。

上回,我已经大概把爬虫写出来了。
我写了一个内容爬虫,一个爬取tag里面内容链接的爬虫
其实还差一个,就是收集一共有哪些tag的爬虫。但是这里先不说这个问题,因为我上次忘了 这次又不想弄。。
还有个原因:如果实际采集的话,直接用http://segmentfault.com/questions/newest?page=1这个链接 获取所有问题,挨个爬就行。

进入正题

第三部分,采集入库。 3.1 定义数据库(or model or schema)

为了入库,我需要在Django定义一个数据库的结构。(不说nosql和mongodb(也是一个nosql但是很像关系型)的事)
还记得那个名叫web的app么,里面有个叫models.py的文件,我现在就来编辑它。

bashvim ~/python_spider/web/models.py

内容如下:

python# -*- coding: utf-8 -*-
from django.db import models

# Create your models here.


class Tag(models.Model):
    title = models.CharField(max_length=30)

    def __unicode__(self):
        return self.title


class Question(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField()
    tags = models.ManyToManyField(Tag, related_name="questions")
    sf_id = models.CharField(max_length=16, default="0") # 加上这个可以记住问题在sf的位置,方便以后更新或者其他操作
    update_date = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.title


class Answer(models.Model):
    question = models.ForeignKey(Question, related_name="answers")
    content = models.TextField()

    def __unicode__(self):
        return "To question %s" % self.question.title

都很直白,关于各个field可以看看 Django 的文档。

然后,我需要告诉我的python_spider项目,在运行的时候加载web这个app(项目不会自动加载里面的app)。

bashvim ~/python_spider/python_spider/settings.py

在INSTALLED_APPS里面加入web:

pythonINSTALLED_APPS = (
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "web",
)

下面,就可以用django自动生成数据库schema了

bashcd ~/python_spider
python manage.py makemigrations
python manage.py migrate

现在,我~/python_spider目录就产生了一个db.sqlite3文件,这是我的数据库。
把玩一番我的模型

python>>> from web.models import Answer, Question, Tag
>>> tag = Tag()
>>> tag.title = u"测试标签"
>>> tag.save()
>>> tag

>>> question = Question(title=u"测试提问", content=u"提问内容")
>>> question.save()
>>> question.tags.add(tag)
>>> question.save()
>>> answer = Answer(content=u"回答内容", question=question)
>>> answer.save()
>>> tag.questions.all() # 根据tag找question
[]
>>> question.tags.all() # 获取question的tags
[]
>>> question.answers.all() # 获取问题的答案
[]

以上操作结果正常,说明定义的models是可用的。

3.2 入库

接下来,我需要把采集的信息入库,说白了,就是把我自己蜘蛛的信息利用django的ORM存到django连接的数据库里面,方便以后再用Django读取用于做站。

入库的方法太多了,这里随便写一种,就是在web app里面建立一个spider.py, 里面定义两个蜘蛛,继承之前自己写的蜘蛛,再添加入库方法。

bashvim ~/python_spider/web/spider.py

代码如下:

python# -*- coding: utf-8 -*-
from sfspider import spider
from web.models import Answer, Question, Tag


class ContentSpider(spider.SegmentfaultQuestionSpider):

    def save(self): # 添加save()方法
        sf_id = self.url.split("/")[-1] # 1
        tags = [Tag.objects.get_or_create(title=tag_title)[0] for tag_title in self.tags] # 2
        question, created = Question.objects.get_or_create(
            sf_id=sf_id,
            defaults={"title":self.title, "content":self.content}
        ) # 3
        question.tags.add(*tags) # 4
        question.save()
        for answer in self.answers:
            Answer.objects.get_or_create(content=answer, question=question)
        return question, created


class TagSpider(spider.SegmentfaultTagSpider):

    def crawl(self): # 采集当前分页
        sf_ids = [url.split("/")[-1] for url in self.questions]
        for sf_id in sf_ids:
            question, created = ContentSpider(sf_id).save()

    def crawl_all_pages(self):
        while True:
            print u"正在抓取TAG:%s, 分页:%s" % (self.tag_name, self.page) # 5
            self.crawl()
            if not self.has_next_page:
                break
            else:
                self.next_page()
  

这个地方写得很笨,之前该在SegmentfaultQuestionSpider加上这个属性。

创建或者获取该提问的tags

创建或者获取提问,采用sf_id来避免重复

把tags都添加到提问,这里用*是因为这个方法原本的参数是(tag1, tag2, tag3)。但是我们的tags是个列表

测试的时候方便看看进度

然后,测试下我们的入库脚本

bashpython manage.py shell
python>>> from web.spider import TagSpider
>>> t = TagSpider(u"微信")
>>> t.crawl_all_pages()
正在抓取TAG:微信, 分页:1
正在抓取TAG:微信, 分页:2
正在抓取TAG:微信, 分页:3
KeyboardInterrupt # 用control-c中断运行,测试一下就行:)
>>> from web.models import Tag, Question
>>> Question.objects.all()
[, , , , , , , , , , , , , , , , , , , , "...(remaining elements truncated)..."]
>>> Question.objects.get(pk=5).tags.all() # 数据库中id=5的question的tags
[, , , ]
3.3 设置django.contrib.admin来查看和编辑内容

为了更直观的观察我采集的数据,我可以利用django自带的admin
编辑文件

bashvim ~/python_spider/web/admin.py
pythonfrom django.contrib import admin
from web.models import Tag, Question, Answer

admin.site.register(Tag)
admin.site.register(Question)
admin.site.register(Answer)

然后创建超级用户

bashpython manage.py createsuperuser # 根据提示创建

启动测试服务器

bashpython manage.py runserver 0.0.0.0:80 # 我这是在runabove上,本地直接manage.py runserver

然后,我访问http://192.99.71.91/admin/登录刚刚创建的账号,就能对内容进行查看和编辑了

OK, 今天的内容到此,
下一篇,是编写django的view,套用简单的模板来建站。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37501.html

相关文章

  • Python爬虫建站入门手记——从零开始建立采集站点(一:环境搭建)

    摘要:从今天起,我将在这里更新一个系列的简单爬虫到建立网站的实践手记。内容将会从最简单的开始,环境搭建,基本爬虫,入库,用建立可供用户访问的网站,网站部署。第一部分,买,装环境。我们爬虫站点的所有文件都放在里面。 从今天起,我将在这里更新一个系列的python简单爬虫到建立网站的实践手记。 内容将会从最简单的开始,环境搭建,基本爬虫,入库,用Django建立可供用户访问的网站,网站部署。 ...

    HackerShell 评论0 收藏0
  • Python爬虫建站入门手记——从零开始建立采集站点(二:编写爬虫

    摘要:接上回第二部分,编写爬虫。进入微信嵌套选择图片和上传图片接口,实现一键上传图片,遇到问题看吧,我现在已经可以通过爬虫获取的提问标题了。微信故意省略想做小偷站的,看到这里基本上就能搞出来了。下一篇,采集入库 上回,我装了环境 也就是一对乱七八糟的东西 装了pip,用pip装了virtualenv,建立了一个virtualenv,在这个virtualenv里面,装了Django,创建了一个...

    Codeing_ls 评论0 收藏0
  • [时隔20个月来填坑]Python爬虫建站入门手记

    摘要:大概个月前已新手的身份写了几篇入门的文章爬虫建站入门手记从零开始建立采集站点结果弄到一半就弃坑了。前两次的视频存档编写爬虫入库由于很久没有写这些东西了,视频里面有一半的时间在和上找资料。。。下面是建立的一个微信群的二维码 大概20个月前已新手的身份写了几篇入门的文章:Python爬虫建站入门手记——从零开始建立采集站点 结果弄到一半就弃坑了。 该填的坑是要填的,于是我最近开始在 liv...

    Lavender 评论0 收藏0
  • 从零开始nodejs系列文章

    摘要:从零开始系列文章,将介绍如何利做为服务端脚本,通过框架开发。框架是基于的引擎,是目前速度最快的引擎。浏览器就基于,同时打开个网页都很流畅。标准的开发框架,可以帮助我们迅速建立站点,比起的开发效率更高,而且学习曲线更低。 从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Java...

    rickchen 评论0 收藏0
  • 小程序开发(一):使用scrapy爬虫采集数据

    摘要:用途广泛,可以用于数据挖掘监测和自动化测试。运行下,发现数据全部存到了数据库中。提供了一些接口来查看项目爬虫情况,以及执行或者停止执行爬虫。完成小程序所需要的所有接口的开发,以及使用定时任务执行爬虫脚本。 过完年回来,业余时间一直在独立开发一个小程序。主要数据是8000+个视频和10000+篇文章,并且数据会每天自动更新。 我会整理下整个开发过程中遇到的问题和一些细节问题,因为内容会比...

    mrli2016 评论0 收藏0

发表评论

0条评论

amuqiao

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<