Mortal's Blog

生命不息,折腾不止!

基于Django和Scrapy的信息聚合平台的设计与实现

文章最后修改于:2020-5-31 15:59:27

Contents

1. 项目简介

1.1 项目名称

  • 基于Django和Scrapy的信息聚合平台的设计与实现 (BlackCatのTopList)

1.2 项目背景

​ 现如今已经进入了一个信息爆炸的时代,我们每天都会通过许多媒介平台去了解热点信息,各种各样的信息充斥着我们的眼球,应接不暇。网络信息资源的海量增长和用户贡献内容的不断扩充,给用户带来资源选择多样化和自主化的同时,也带来选择迷航的问题, 因此,如何将离散分布、异构无序的“信息碎片”动态关联并聚合起来,有效提供服务并促进知识共享具有重要的现实意义。本项目设计与实现了一个基于Django的信息聚合平台,使用Scrapy抓取各大主流平台的榜单资讯将其推荐给用户。

关键字:信息聚合平台、网络爬虫、响应式布局、Django、Scrapy、Bootstrap

1.3 技术选型

  • MySQL数据库:使用MySQL替代Django默认的SQLite数据库。
  • Django框架:使用Django与MySQL数据库交互,开发前端展示部分的服务端。
  • Scrapy框架:使用Scrapy来开发网络爬虫部分。
  • Bootsrtap框架:使用Bootstrap来设计响应式前端。

1.4 项目地址

1.5 常用命令

1.5.1 Django常用命令

1.5.2 Git常用命令

1.6 项目展望

[1] 分类抓取其他榜单

​ 一个信息聚合平台,它应该汇聚方方面面的资讯,因此我们还应当分类抓取其他平台的榜单。比如时事可以抓取Twitter、知乎热榜,视频可以抓取Youtube、Bilibili,音乐可以抓取网易云音乐,开源项目可以抓取Github趋势榜。抓取之后我们还可以对其添加信息预览和可视化处理,使其更加直观。

[2] 使用Scrapyd在前端管理爬虫

​ 本项目目前的设计是在后台运行爬虫,通过设置定时运行来完成信息的自动抓取,虽然简单易用,但不方便用户自主的控制爬虫,如果能在前端直接管理Scrapy就更好了。Scrapyd是用于部署和运行Scrapy爬虫的应用程序,它能够在网页端查看正在执行的任务,也能新建爬虫任务,和终止爬虫任务,因此我们可以通过使用Scrapyd来完成预期目标。

[3] 在VPS上部署本项目

​ 本项目所设计的信息聚合平台最终是要部署在服务器上实际运营的,我们可以通过Xshell工具和宝塔Linux面板将本项目打包部署上去。但在这之前,务必要做好各类防护,以防范各类网络安全攻击,系统的安全性永远是放在第一位的,只有确保各类常见漏洞都被修复了,我们才可以将其发布。

2. 搭建过程

2.1 搭建基本开发环境

2.1.1 在虚拟环境中创建Django项目

《基于Django和Scrapy的信息聚合平台的设计与实现》

2.1.2 使用Git进行版本控制并推送Github仓库

[1] 创建Github私有仓库

见Git&&Github基本使用.md (MIT许可证)

[2] Git初次部署

[3] Git后续使用

2.1.3 使用MySQL替换Django默认的SQLite数据库

Step1:安装配置MySQL

[1] 下载安装MySQL

官网:https://dev.mysql.com/downloads/mysql/(已安装8.0.19-win版本,把压缩包解压即可)

[2] 配置MySQL

在mysql-8.0.19-winx64目录里创建一个my.ini文件,配置内容如下:

说明:

  • 复制目录路径的时候,要把里面的 "\"修改成 "/"
  • 默认加密方式default_authentication_plugin设置为mysql_native_password,新版本和老版本加密方式不一样,这样设置主要是为了兼容老版本

[3] 把MySQL添加到环境变量

  • 目的:添加环境变量是为了方便使用,我们可以直接在cmd命令行(务必使用管理员模式打开)里输入MySQL命令

  • 步骤:复制MySQL的bin目录路径,将其添加到系统变量的Path里

[4] 初始化MySQL,并设置密码

1)在cmd里输入以下命令进行MySQL的初始化:

2)执行初始化命令成功之后,再执行下面的命令,安装mysql服务:

3)安装服务成功之后,输入下面命令启动服务:

4)这样,MySQL服务就启动了。然后我们给MySQL设置一个密码:

-u root 是指定root用户登录,-p 是要求输入密码。刚刚初始化创建的密码为空,要求输入密码的时候,直接回车即可。

5)输入如下SQL语句,修改root用户的密码:

如果想新建立一个用户和数据库,然后给这个用户和数据库设置单独的管理权限和密码,可依次输入下面的命令:

Step2:在Django中更改默认数据库为MySQL

[1] 安装pymysql数据库驱动

python3不支持MySQLdb,所以用pymysql代替

[2] 配置Django中的DATABASE

1)在settings.py中找到DATABASE,根据自己的实际情况填写以下信息:

2)接着在Settings.py目录下的 _init_.py里添加如下代码:

3)找到虚拟环境里的Lib\site-packages\django\db\backends\mysql\base.py文件,将如下代码注释掉:

4)然后在settings.py文件中设置时区和语言

5)最后执行数据库迁移命令:

2.1.4 安装破解Navicat数据库可视化管理工具

见Navicat Premium 12破解版激活教程.pdf

2.2 Django+Scrapy完成微博头条的抓取和网页显示

2.2.1 创建Django和Scrapy的基本项目结构

[1] 新建Django app——weibodjango

cd E:\NextCloud\Workspace\toplist

[2] 新建Scrapy项目——weiboscrapy

cd E:\NextCloud\Workspace\toplist

[3] 进入创建的scrapy项目,生成spider类

cd E:\NextCloud\Workspace\toplist\weiboscrapy

以上我们基本的项目的结构就创建完毕,接下来让我们从Scrapy项目开始,一步步编写代码和配置文件

2.2.2 编写核心的爬虫文件Weibolog.py

cd E:\NextCloud\Workspace\toplist\weiboscrapy\weiboscrapy\spiders 编写Weibolog.py

注:这个解析源代码的方式没有使用Scrapy提供的xpath或者css解析,而是使用了re包解析,显得麻烦了一些。

2.2.3 使Scrapy与Django进行交互:编写配置文件及定义数据库模型

[1] cd E:\NextCloud\Workspace\toplist\weiboscrapy\weiboscrapy 修改settings.py

[2] cd E:\NextCloud\Workspace\toplist\toplist 修改settings.py

[3] cd E:\NextCloud\Workspace\toplist\weibodjango 编写models.py

[4] cd E:\NextCloud\Workspace\toplist\weibodjango 编写admin.py

Django具有站点管理的功能

《基于Django和Scrapy的信息聚合平台的设计与实现》

[5] cd E:\NextCloud\Workspace\toplist

[6] 下载scrapy-djangoitem工具包

[7] cd E:\NextCloud\Workspace\toplist\weiboscrapy\weiboscrapy 编写items.py

其中,Headline就是weibodjango中models.py的一个模型类

[8] cd E:\NextCloud\Workspace\toplist\weiboscrapy\weiboscrapy 编写pipleline.py

[9] cd E:\NextCloud\Workspace\toplist\weiboscrapy\weiboscrapy 新建main.py

创建一个测试文件,测试是否把我们爬取的数据存入到了数据库,避免了我们在命令行中去运行爬虫文件

运行结果如下图所示:

《基于Django和Scrapy的信息聚合平台的设计与实现》

通过Navicat数据库可视化管理工具,我们可以看到数据已经爬取下来了:

《基于Django和Scrapy的信息聚合平台的设计与实现》

2.2.4 使Scrapy与Django进行交互:编写URL路由映射和视图

[1] 编写URL路由映射

cd E:\NextCloud\Workspace\toplist\toplist 编写urls.py

cd E:\NextCloud\Workspace\toplist\weibodjango 新建urls.py

[2] 编写视图页面

cd E:\NextCloud\Workspace\toplist\weibodjango 编写views.py

2.2.5 使Scrapy与Django进行交互:编写BootStrap响应式前端页面

[1] Bootstrap环境

  • 项目原型:基于Bootstrap的简单后台模板 from Github (Bootstrap3项目,用于构建项目前端)

  • cd E:\NextCloud\Workspace\toplist 新建static目录(存放css、js、img等文件)和templates目录(存放静态网页)

    其中只有common.css、main.js是自定义内容,其他文件都是框架依赖包

[2] 编写网页模板base.html

[3] 编写微博头条页面weibo.html

d E:\NextCloud\Workspace\toplist\toplist 修改settings.py

[5] 运行Django项目

《基于Django和Scrapy的信息聚合平台的设计与实现》

2.3 给Django网站添加登录注册及首页跳转

2.3.1 创建users应用程序并定义数据库模型

[1] 创建users应用程序

cd E:\NextCloud\Workspace\toplist 创建一个名为users的应用程序

[2] 数据库模型设计

作为一个用户登录和注册项目,我们需要在用户表user里保存下面的信息:用户名、密码、邮箱地址、创建时间

cd E:\NextCloud\Workspace\toplist\users 编写models.py

[3] 在INSTALLED_APPS里添加users

cd E:\NextCloud\Workspace\toplist\toplist 编辑settings.py

[4] 保存改动并迁移至数据库

[5] 在admin中注册模型

cd E:\NextCloud\Workspace\toplist\users 编写admin.py

2.3.2 编写URL路由映射和视图雏形、首页的前端页面

[1] 编写URL路由映射

cd E:\NextCloud\Workspace\toplist\toplist 修改urls.py

cd E:\NextCloud\Workspace\toplist\users 新建urls.py

[2] 编写视图雏形

cd E:\NextCloud\Workspace\toplist\users 编辑views.py

[3] 编写首页的前端页面

​ 首页是一个Google搜索框,可以直接在这里搜索内容。它的实现方式很简单,直接使用form标签调用即可。前端样式也已有现成的Github开源项目,我们只需要略微修改一下即可套用。

项目地址:通过Html5和CSS3以及阿里图标库来实现Google搜索框页面 from github

将其中的google.css文件放置到/static/css目录下,然后使用link标签将其引用到base.html

我们再在templates目录新建index.html,编辑内容如下:

《基于Django和Scrapy的信息聚合平台的设计与实现》

说明:如果你更改了前端样式,而网页显示并没有及时的发生预期改变,有可能是浏览器缓存的问题,将其清除即可。

2.3.3 实现登录功能(使用Session保存用户状态、添加Captcha图形验证码)

[1] 安装配置图形验证码第三方库

Step1:安装django-simple-captcha

此处遇到个bug:在虚拟环境里安装可以使用,但运行scrapy时会受它影响而报错,安装在本地环境可以解决此问题

Step2:cd E:\NextCloud\Workspace\toplist\toplist\settings.py 将captcha注册到INSTALLED_APPS列表里

Step3:cd E:\NextCloud\Workspace\toplist\toplist\settings.py 配置django_simple_captcha验证码格式

Step4:captcha需要在数据库中建立自己的数据表,所以需要执行migrate命令生成数据表

Step5:添加URL路由映射

cd E:\NextCloud\Workspace\toplist\toplist 编辑urls.py

[2] 定义数据库模型并编写视图

Step1:cd E:\NextCloud\Workspace\toplist\users 编辑models.py

Step2:cd E:\NextCloud\Workspace\toplist\users 编辑views.py

Step3:既然有了Session记录用户登录状态,那么就可以完善我们的登出视图函数了

对应的修改base.html,诸如:

即此时的base.html文件为:

[3] 编写登录页面

编写login.html如下:

《基于Django和Scrapy的信息聚合平台的设计与实现》

2.3.4 实现注册功能(使用Session保存用户状态、添加Captcha图形验证码)

Step1:cd E:\NextCloud\Workspace\toplist\users 在models.py里添加内容如下:

Step2:cd E:\NextCloud\Workspace\toplist\users 在views.py里添加内容如下:

Step3:编写register.html如下:

《基于Django和Scrapy的信息聚合平台的设计与实现》

2.3.5 使用Hash函数加密用户的注册密码

​ 加密密码有很多不同的途径,其安全程度也高低不等。这里我们使用Python内置的hashlib库,使用哈希函数的方式加密密码,可能安全等级不够高,但足够简单,方便使用。

[1] cd E:\NextCloud\Workspace\toplist\users 在views.py中添加一个hash函数

[2] cd E:\NextCloud\Workspace\toplist\users 在views.py中修改login()和register()视图

[3] 重启服务器,进入注册页面,新建一个用户,然后进入django-admin后台或者Navicat,查看用户的密码情况。

《基于Django和Scrapy的信息聚合平台的设计与实现》

​ 我们可以看到用户密码长度经过哈希算法的处理,已变为256位了,所以前面在models中设置password字段时,不要想当然的将max_length设置的太短。

2.4 添加知识碎片模块:在线笔记系统

2.4.1 创建notes应用程序并定义数据库模型

[1] 创建notes应用程序

cd E:\NextCloud\Workspace\toplist 创建一个名为notes的应用程序

[2] 数据库模型设计

cd E:\NextCloud\Workspace\toplist\notes 编写models.py

[3] 在INSTALLED_APPS里添加notes

cd E:\NextCloud\Workspace\toplist\toplist 编辑settings.py

[4] 保存改动并迁移至数据库

[5] 在admin中注册模型

2.4.2 编写URL路由映射、表单、视图、前端页面

[1] 编写URL路由映射

cd E:\NextCloud\Workspace\toplist\toplist 修改urls.py

cd E:\NextCloud\Workspace\toplist\notes 新建urls.py

[2] 编写表单

cd E:\NextCloud\Workspace\toplist\notes 新建forms.py

[3] 编写视图

cd E:\NextCloud\Workspace\toplist\notes 编辑views.py

[4] 编写前端页面

​ 在templates目录下再新建一个notes文件夹,用于放置notes的5个前端页面,其实现代码及效果如下:

topics.html

《基于Django和Scrapy的信息聚合平台的设计与实现》

topic.html

《基于Django和Scrapy的信息聚合平台的设计与实现》

new_topic.html

new_entry.html

edit_entry.html

《基于Django和Scrapy的信息聚合平台的设计与实现》

注:@login_required限制页面访问未实现(让用户能够拥有其专有的数据)

2.5 添加开源项目和网站导航模块

2.5.1 创建github、navigation应用程序,并配置URL路由映射、视图

[1] cd E:\NextCloud\Workspace\toplist 分别创建名为github、navigation的应用程序

[2] cd E:\NextCloud\Workspace\toplist\toplist 修改urls.py

[3] cd E:\NextCloud\Workspace\toplist\github 编辑views.py

cd E:\NextCloud\Workspace\toplist\navigation 编辑views.py

2.5.2 开源项目模块:使用Pypal可视化Github热门仓库

[1] 生成Github仓库的交互式条形图

​ Pygal是Python的一个可视化包,它用来生成可缩放的矢量图形文件(.svg),可以自动缩放以适合观看者的屏幕。通过使用Pygal,我们可以轻松制作出与用户有良好交互体验的可视化图表。

​ Web API是网站的一部分,用于与使用非常具体的URL请求特定信息的程序交互,这种请求称为API调用。很多API都要求你注册获得API密钥后才能执行调用。但截止至本项目完成时,GitHub仍没有这样的要求,但获得API密钥后,配额将高得多。

​ 本模块将使用Web API来请求Github项目仓库的信息,然后使用Pygal生成交互式可视化图表,以Star的数量多少来呈现这些项目的受欢迎程度。由于这样编写的程序始终使用最新的数据来生成可视化,因此即便数据瞬息万变,它呈现的信息也都是最新的。

​ 以Python为例(Java、C、MATLAB亦是如此),生成Github仓库交互式条形图的代码如下:

说明:Github API有访问频率限制,如果运行失败,可以等一段时间再跑。

[2] 将生成的交互式图表整合至Django展现

编写github.html

说明:不要用img标签插入svg图表,这样会使其交互性失效,变成一张普通的图片,使用object标签即可避免此问题。

《基于Django和Scrapy的信息聚合平台的设计与实现》

2.5.3 网站导航模块:分类汇总常用网站

编写navigation.html

《基于Django和Scrapy的信息聚合平台的设计与实现》

3. 项目总结

3.1 参考资料

3.1.1 技术书籍

[1] Eric Matthe著.《Python编程:从入门到实践》[M].袁国忠译. 北京:人民邮电出版社,179-223

3.1.2 官方文档

[1] Django3.0官方文档:https://docs.djangoproject.com/en/3.0/

[2] Scrapy官网文档:https://docs.scrapy.org/en/latest/index.html

[3] Bootstrap3.3.7官方文档:https://getbootstrap.com/docs/3.3/

3.1.3 开源项目

[1] scrapy-djangoitem:https://github.com/scrapy-plugins/scrapy-djangoitem

[2] Simple-Admin-Template:https://github.com/DreamMoon/Simple-Admin-Template

[3] -Google-:https://github.com/wangxiaozhan/-Google-

3.1.4 博客教程

[1] Django如何把SQLite数据库转换为Mysql数据库:https://www.django.cn/article/show-17.html

[2] Django+Scrapy完成微博首页热点的提取和网页显示:https://blog.csdn.net/ssAfterHard/article/details/89792196

[3] Python实现的基于Scrapy爬虫框架和Django框架的新闻采集和订阅系统:https://www.write-bug.com/article/52.html

[4] 爬虫蜘蛛项目管道ITEM PIPELINE之编写自己的项目管道:https://www.itbook5.com/2019/01/8884/

[5] python实现scrapy定时执行爬虫: https://blog.csdn.net/vivian_ll/article/details/65442105

[6] Django用户登录与注册系统:https://www.cnblogs.com/derek1184405959/p/8567522.html

[7] 在Django中对HTML使用captcha验证码:https://www.pythonf.cn/read/21676

[8] Svg文件的插入方式:https://m.php.cn/manual/view/33753.html

[9] 网页调用外部搜索引擎:https://blog.csdn.net/YPLee_8/article/details/49975875

3.1.5 个人笔记

[1] Java&&Python基本开发环境配置.md (MySQL相关配置)

[2] Navicat Premium 12破解版激活教程.pdf (Navicat可视化数据库管理工具的破解)

[3] Git&&Github基本使用.md (Git及Github配置)

[4] Python Section4 Note.md (Django搭建项目完整流程 — learning-log练习项目)

[5] Python Section3 Note.md (使用Pygal对Github仓库进行可视化)

3.2 Debug总结

3.2.1 Git相关

[1] 使用git pull origin master命令报错: fatal:refusing to merge unrelated histories

  • 错误原因:如果合并了两个不同的开始提交的仓库,在新的git会发现这两个仓库可能不是同一个,为了防止开发者上传错误,于是就出现了此提示。

  • 解决办法:比如我在Github新建一个仓库,写了License,然后把本地一个写了很久仓库上传。这时会发现 github 的仓库和本地的没有一个共同的 commit 所以 git 不让提交,认为是写错了 origin ,如果开发者确定是这个 origin 就可以使用 –allow-unrelated-histories 告诉 git 允许不相关历史合并。

  • 参考资料:git无法pull仓库refusing to merge unrelated histories from CSDN

[2] 使用git push origin master命令报错: error:failed to push some refs to URL

  • 错误原因:直接在 GitHub 上修改后,内容已经和本地不一致了,必须要合并(merge)

  • 解决办法1(正规流程):先使用git pull origin master命令下载到本地并合并,自动弹出的vim编辑器(按 i 进行编辑,说明为什么合并,可选择不修改,ESC进入命令行模式然后输入 :wq退出),再git push origin master

  • 解决办法2(多人协作开发勿用):直接git push -f origin master(强制推送,会把github的版本控制全部覆盖)

  • 参考资料:git push origin master报错及MERGE_HEAD exists报错解决办法 from CSDNGit推送失败问题

[3] 使用git add .命令报错:warning: LF will be replaced by CRLF

  • 原因:在Unix系统中,行尾用换行(LF)表示。在窗口中,用回车(CR)和换行(LF)(CRLF)表示一行。当您从unix系统上载的git中获取代码时,它们将只有LF。

  • 解决办法:如果您是在Windows计算机上工作的单个开发人员,并且您不关心git自动将LF替换为CRLF,则可以通过在git命令行中键入以下内容来关闭此警告

  • 参考资料:LF将在git中由CRLF替换 from Stackoverflow

[4] 项目忽略名单文件(.gitignore)不生效问题

  • 问题描述:将想被忽略的文件配置到.gitignore后,使用git进行版本控制时仍然会提示提交这些文件,也就是说实际并没有被忽略。
  • 原因:它只会对不在git仓库中的文件进行忽略,如果这些文件已经在git仓库中,则不会忽略。所以如果需要忽略的文件已经提交到本地仓库,则需要从本地仓库中删除掉,如果已经提交到远端仓库,则需要从远端仓库中删除。
  • 参考资料:.gitignore不生效问题 from CSDN

3.2.2 MySQL相关

[1] 报错:django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module. Did you install mysqlclient?

  • 原因:在python3中,改为了pymysql连接库,但是在Django中,连接数据库时使用的仍是MySQLdb库

  • 解决办法:在Settings.py目录下的 _init_.py里添加如下代码:

  • 参考资料:Django启动时找不到mysqlclient处理 from 临渊Blog

[2] 报错:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

  • 解决办法:找到虚拟环境里的Lib\site-packages\django\db\backends\mysql\base.py文件,将如下代码注释掉

  • 参考资料:Django启动时找不到mysqlclient处理 from 临渊Blog

3.2.3 Django相关

[1] 报错:django.template.exceptions.TemplateDoesNotExist: xxx.html

  • 原因:未设置模板路径,找不到html文件

  • 解决办法:在setting.py的TEMPLATES‘DIRS'[]加入模版路径

  • 参考资料:Django 找不到模版报错” django.template.exceptions.TemplateDoesNotExist: index.html” from 博客园

3.3 经验教训

[1] 不要单独的去写网页,一有改动就全都要改,很容易出问题。应该将通用部分写成父模板base.html,其他网页继承于此,子网页只编写与众不同的内容即可。

[2] Git版本控制的相关操作一定要弄明白,操作出问题可能会使整个项目毁于一旦。为了保险起见,每次开发前都在本地再备个份。在Pycharm内就集成了提交、更新、历史、回滚等功能。

[3] 开发项目时不要放到Nextcloud的同步文件夹下,几万个文件同步会出问题,有可能会影响本地文件。有Git和U盘的备份就够了,等开发完毕压缩后再放入同步文件夹。

[4] 如果使用Navicat删除了数据表,重新迁移会报错,并不会重新生成数据表。如果没有什么重要数据的话,可以把数据库整个删了重建再数据迁移。

[5] 如果你更改了前端样式,而网页显示并没有及时的发生预期改变,有可能是浏览器缓存的问题,将其清除即可。详见:https://blog.csdn.net/g11d111/article/details/79032287

[6] 开发完毕后,要先把项目中的隐私文件添加忽略(.gitignore)、对一些特殊文件进行处理、生成项目依赖文件,才能把Github私有仓库设为公开。详见:https://www.liujiangblog.com/course/django/115

点赞

发表评论

电子邮件地址不会被公开。

EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00