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

news/2024/5/10 9:34:09/文章来源:https://blog.csdn.net/weixin_34128534/article/details/89644943

上回,我已经大概把爬虫写出来了。
我写了一个内容爬虫,一个爬取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.titleclass 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.titleclass 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
<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: 测试提问>]
>>> question.tags.all() # 获取question的tags
[<Tag: 测试标签>]
>>> question.answers.all() # 获取问题的答案
[<Answer: To question 测试提问>]

以上操作结果正常,说明定义的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, Tagclass ContentSpider(spider.SegmentfaultQuestionSpider):def save(self): # 添加save()方法sf_id = self.url.split('/')[-1] # 1tags = [Tag.objects.get_or_create(title=tag_title)[0] for tag_title in self.tags] # 2question, created = Question.objects.get_or_create(sf_id=sf_id,defaults={'title':self.title, 'content':self.content}) # 3question.tags.add(*tags) # 4question.save()for answer in self.answers:Answer.objects.get_or_create(content=answer, question=question)return question, createdclass 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) # 5self.crawl()if not self.has_next_page:breakelse:self.next_page()
  1. 这个地方写得很笨,之前该在SegmentfaultQuestionSpider加上这个属性。
  2. 创建或者获取该提问的tags
  3. 创建或者获取提问,采用sf_id来避免重复
  4. 把tags都添加到提问,这里用*是因为这个方法原本的参数是(tag1, tag2, tag3)。但是我们的tags是个列表
  5. 测试的时候方便看看进度

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

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()
[<Question: 测试提问>, <Question: 微信支付获取prepayid,返回签名不匹配,>, <Question: 微信js怎么获取openID的>, <Question: 微信支付时加入attach参数提示签名错误>, <Question: 微信支付JSAPI调用返回fail_invalid_appid>, <Question: 微信消息连接打开  和  扫码打开连接有什么区别>, <Question: django做微信开发后台时无法返回response>, <Question: 微信端内置浏览器对canvas的支持有问题>, <Question: 分享到微信朋友圈的网页为什么点开直接跳至页尾?>, <Question: 微信支付开发:发起微信支付的时候,报错:invalid signature>, <Question: 前端加密代码有什么好办法不被破解>, <Question: 有没有桌面移动一体化网站发布方案,有市场吗?>, <Question: 微信如何获取用户的头像>, <Question: 重新设置微信自定义菜单 手机端没有显示该菜单>, <Question: 如何在用户输入关键字时自动回复图片,一张整体图。>, <Question: 手机图片上传是倒着的>, <Question: 微信内网页上传图片问题>, <Question: 如何转码微信多媒体下载接口的音频文件?>, <Question: 微信开放平台创建应用时,不能上传应用图片>, <Question: 微信页面中,怎么打开已安装的app?>, '...(remaining elements truncated)...']
>>> Question.objects.get(pk=5).tags.all() # 数据库中id=5的question的tags
[<Tag: 微信>, <Tag: 微信公众平台>, <Tag: 微信js-sdk>, <Tag: openid>]

3.3 设置django.contrib.admin来查看和编辑内容

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

bashvim ~/python_spider/web/admin.py
pythonfrom django.contrib import admin
from web.models import Tag, Question, Answeradmin.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/登录刚刚创建的账号,就能对内容进行查看和编辑了
Django后台

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_826701.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样自己创建一个个人网站,怎样将自己写的网站发布到外网?

注**&#xff1a;本教程是在window平台上的展示&#xff1a; 以下只是一个简单的html网页&#xff0c;如果想了解整体系统功能&#xff08;包括登录&#xff0c;注册&#xff0c;数据库&#xff0c;后台等功能&#xff09;可以加我微信号yizheng369咨询哈 华丽分割线 注意&…

生成微信二维码,微信扫码登录网站

微信扫码登录网站 源码地址1(这个是nodejs项目实现)&#xff1a;https://gitee.com/618859/wx_login_qrcode 源码地址2(这个是前端vue3项目中实现微信扫码登录源码)&#xff1a; https://gitee.com/618859/wx_login_qrcode_vue 源码地址3(这个是前端vue2项目中实现微信扫码登录…

网站流量统计系统 phpMyVisites

phpMyVisites是一个网站流量统计系统&#xff0c;它能够提供非常详细的统计报告和高级图形报表。phpMyVisites不是一个Apache log分析工具&#xff0c;它建有自己的log。它的特点包括&#xff1a; 安装部署&#xff1a;提供可视化的安装向导&#xff0c;并且使用简单只要把一段…

基于LAMP 的NFS数据共享论坛网站

基于LAMP 的NFS数据共享论坛网站实现要求&#xff1a;1.在两台或多台Linux系统上安装LAP&#xff08;Apache和php&#xff09;&#xff0c;一台安装mariadb&#xff0c;一台安装DNS服务器。2.其中LAP之间的网页数据是相同的&#xff0c;且安装Discuz论坛&#xff0c;论坛上传的…

史上最形象最清晰网站集群物理拓扑及逻辑拓扑图分享!

老鸟谈画图能力对运维人员的重要性http://oldboy.blog.51cto.com/2561410/1686224手把手带你快速做【最专业】的项目文档实战(已有500人看了视频)http://edu.51cto.com/course/course_id-4992.html手把手带你快速画【最专业】的逻辑架构图实战(已有1000人看了视频)http://edu.5…

网站开发流程管理

需求分析阶段&#xff1a;   这一阶段&#xff0c;您的需求分析人员首先设计出站点的SITEMAP&#xff0c;之后规划站点所需功能、内容结构页面等。功能、内容结构页面演示给客户可以让您迅速的了解到客户真实需求。减少变更的可能性。该阶段所要输出的文档&#xff1a;A&…

如何简单的抓取网站数据

1.首先&#xff0c;用带debug的火狐浏览器&#xff0c;访问要抓取的网站&#xff0c;通过debug的控制台或网络找到数据的接口。2.Spring框架自3.0版本起&#xff0c;自带了任务调度功能&#xff0c;好比是一个轻量级的Quartz&#xff0c;而且使用起来也方便、简单&#xff0c;且…

用于加密研究的 5 大网站

用于加密研究的 5 大网站 DeFi是一个术语&#xff0c;指建立在区块链基础上的一组金融工具。这个想法是允许任何有互联网接入的人不经过中间商就可以借贷。DeFi是区块链和去中心化网络空间中增长最快的领域之一。 需要了解能够帮助您利用DeFi趋势的工具。DeFi工具提供了多种不…

10 个Web3 设计灵感网站

10 个Web3 设计灵感网站&#xff1a;Cosmos、Axies Infinity、DeSo Foundation、Foundation App、Llama、Snapshot、Juicebox、Alchemy、RabbitHole 正如Twitter前首席执行官Jack Dorsey最近发的一条推文“你不拥有web3&#xff0c;但风险投资家拥有”&#xff0c;而Marc Andre…

阿里云盾网站安全防御(WAF)的使用方法(图文)

2019独角兽企业重金招聘Python工程师标准>>> 将2个网站搬到阿里云&#xff0c;一个是因为阿里云稳定&#xff0c;另一个就是牛逼轰轰的云盾了。之前在博客联盟群里模拟CC攻击过搭建在阿里云ECS上的博客&#xff0c;结果云盾毫无反应&#xff0c;而网站已经挂了。 这…

05.网站点击流数据分析项目_模块开发_ETL

项目的数据分析过程在hadoop集群上实现&#xff0c;主要应用hive数据仓库工具&#xff0c;因此&#xff0c;采集并经过预处理后的数据&#xff0c;需 要加载到hive数据仓库中&#xff0c;以进行后续的挖掘分析。 ETL&#xff1a;用来描述将数据从来源端经过抽取&#xff08;ext…

关于'大热网'SEO及百度推广的研究(上)

基本概念 SEO&#xff1a;搜索引擎优化&#xff0c;简单来说就是 靠自己做优化&#xff0c;使得排名靠前&#xff0c;时间长见效慢。 SEM:搜索引擎营销&#xff0c;简单来说就是 给“baidu”等搜索引擎钱&#xff0c;通过推广竞价的方式&#xff0c;达到排名靠前的效果&#xf…

python+flask搭建CNN在线识别手写中文网站

使用pythonflask搭建的一个网站&#xff0c;然后从网页的写字板上获取鼠标手写的汉字经过转码后传回后台&#xff0c;并经过图片裁剪处理之后传入CNN手写中文识别的模型中进行识别&#xff0c;最后通过PIL将识别结果生成图片&#xff0c;最后异步回传给web端进行识别结果展示。…

flask微视频网站(环境准备)

文章目录简介项目结构蓝图数据库简介 跟着做一个微电影视频网站WindowsPython3.9.6MySQL8.0pycharm安装py虚拟环境# 不添加源就会失败&#xff0c;还提示你要升级pip&#xff0c;千万别升级&#xff01; pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.d…

flask视频网站(前端)

文章目录前端界面前台电影列表404后台小结前端界面 前端的搭建目前水平只能靠模板了 在templates中新建admin/home 前台 搭建顶部和底部&#xff0c;新建 home.html 这部分是所有页面都要用到的&#xff0c;后面的模板继承也是基于此&#xff0c;用block增加内容&#xff01…

flask视频网站(后台管理)

文章目录简介管理员登录标签管理电影管理电影预告管理会员管理评论管理电影收藏管理员密码修改日志管理操作日志管理员登录日志会员登录日志小结简介 这一部分要实现具体的后台管理逻辑基本逻辑如下&#xff1a; 管理员登录 将之前models中数据库的认证部分移动到app初始化…

flask视频网站(权限控制)

文章目录AuthRoleAdmin权限控制Auth 基于角色的访问权限控制 有的管理员只能访问日志&#xff0c;而有的能访问会员列表&#xff0c;有的管理电影这部分还属于admin 从创建表单模型开始&#xff0c;别着急class AuthForm(FlaskForm):"""访问权限控制"&quo…

ASP.NET Core 网站在Docker中运行

Docker作为新一代的虚拟化方式&#xff0c;未来肯定会得到广泛的应用&#xff0c;传统虚拟机的部署方式要保证开发环境、测试环境、UAT环境、生产环境的依赖一致性&#xff0c;需要大量的运维人力&#xff0c;使用Docker我们可以实现一次部署&#xff0c;到处运行。 本文介绍如…

给你介绍一个假的苹果网站,能肉眼看出来算我输!

这或许是用肉眼最难分辨的钓鱼网站&#xff0c;没有之一&#xff0c;不信你试试&#xff0c;能看出端倪吗&#xff1f; 网站的 URL 地址显示的是苹果官网&#xff0c;网址旁边是安全字样和绿色小锁&#xff0c;表示网站信息基于 https 加密传输&#xff0c;完全没什么问题&…

新手如何掌握制作和提交网站地图?

新手如何掌握制作和提交网站地图?网站地图作为根据网站的结构&#xff0c;框架&#xff0c;内容生成的导航网页文件。大多数人都知道网站地图对于提高用户体验有好处&#xff1a;它们为网站访问者指明方向&#xff0c;并帮助迷失的访问者找到他们想看的页面。那么什么是网站地…