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

优采云 发布时间: 2020-12-12 11:16

  Python爬网程序构建站点简介-从头开始建立采集站点(3:采集存储)

  上次,我可能写出了采集器

  我写了一个内容采集器,即一个采集器,它可以搜寻标记中的内容链接

  实际上,仍然存在一个区别,那就是采集所有标签的采集器。但是在这里我不会谈论这个问题,因为我上次忘记了,这次我不想处理它。

  还有另一个原因:如果实际上是采集,只需使用此链接即可获取所有问题并逐个抓取。

  输入主题

  第三部分采集已存储。3.1定义数据库(或模型或架构)

  为了存储,我需要在Django中定义一个数据库结构。 (更不用说nosql和mongodb(也是nosql,但与关系型非常相似))

  请记住,该应用程序名为web,其中有一个名为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

  它们都很简单。您可以查看每个字段的Django文档。

  然后,我需要告诉我的python_spider项目在运行时加载网络应用程序(该项目不会自动在内部加载应用程序)。

  bashvim ~/python_spider/python_spider/settings.py

  在INSTALLED_APPS中添加网站

  pythonINSTALLED_APPS = (

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'web',

)

  接下来,您可以使用django自动生成数据库架构

  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() # 获取问题的答案

[]

  以上操作结果正常,表明定义的模型可用。

  3.2入站

  接下来,我需要将采集的信息存储在数据库中。坦率地说,我使用django的ORM将自己的Spider信息存储在与django连接的数据库中,以便将来可以在Django中读取它。

  在库中存储的方法太多了,只需在此处编写一个方法,即在Web应用程序中创建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。创建或获取问题的标签创建或获取问题,使用sf_id避免重复向问题添加标签,此处使用*是因为此方法的原创参数为(tag1,tag2,tag3)。但是我们的标签是一个方便的方法,可以在测试列表后查看进度

  然后,测试我们的仓储脚本

  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

  然后,我登录到刚创建的帐户,然后可以查看和编辑内容。

  

  好,就是今天的内容,

  下一篇文章是编写django视图并应用简单的模板来构建网站。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线