首页 > 代码库 > 微信新闻爬虫订阅号设计

微信新闻爬虫订阅号设计

github地址:https://github.com/moyangvip/newsWeChat

1、功能:

  实现网站新闻定时爬取,并在订阅号端呈现。

  后台通过scrapy定期抓取网站信息信息,并通过BosonNLP取摘要,最终整理信息存入DB。微信服务程序从DB中读取新闻信息, 并通过 memcached 缓存用户状态。

  实际使用: 进入订阅号后 1、请输入"新闻"获取所有站点的最新新闻列表; 2、请输入具体网站名(如"猎云网")获取该站点最新新闻列表; 3、输入具体新闻编号获得详细资讯。

截图:

  技术分享技术分享技术分享技术分享

 

2.系统整体架构设计

 

技术分享

系统架构图(红色字体表示待实现功能) 

  1. Craw爬虫(/opt/MT/MtCrawler目录):采用scrapy爬虫框架。爬取网站url、标题、内容等信息,并调用bosonnlp进行数据处理获取摘要,最终将爬取的url、标题、摘要等信息存入DB
  2. Bosonnlp(/opt/MT\BosonNLP目录):利用Bosonnlp的python API二次开发,提取出网页摘要信息,并返回数据
  3. 定时脚本:通过linux自带的crontab配置,每天定时启动/opt/MT/MtCrawler/start.sh脚本爬取网站最新数据,可通过输入:crontab –e查看
  4. Mysql:主要用于存储爬取的网站新闻信息,同时也存储微信服务器的一些配置信息。具体可参考/opt/MT/MT_DB.sql文件
  5. Memcached:缓存用户的临时状态信息(1分钟有效期),场景:每次用户输入“信息”后,服务器都会通过Memcached记录当前场景下该用户输入“新闻”的次数。微信服务器通过该值进行新闻列表的分页管理。
  6. 微信后台服务:接收用户输入消息,判断消息类型,并根据当前消息类型及Memcached中保存的用户状态,查询DB返回具体回复信息

3.微信后台服务程序架构设计

3.1 简介

微信后台服务程序采用python作为开发语言,以web.py作为网络框架,运行依赖:

  1. python2.7版本以上
  2. 安装web.py
  3. 安装libxml2, libxslt, lxml python
  4. 安装python-dev ,MySQL-python
  5. 安装 python-memcached

在120.25.205.102地址的云服务器中,以上依赖均已经安装。

 

参考文档:

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1472017492_58YV5&token=&lang=zh_CN 微信订阅号开发入门指引

https://mp.weixin.qq.com/wiki  微信开发者文档

《web.py中文教程.docx》

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000  Python 2.7教程

 

3.2微信服务器整体流程

技术分享

1、 用户在订阅号界面发送消息信息;

2、 该消息将会被发送到微信公众平台后台,微信公众后台将该消息格式化为接收普通文本消息标准格式(参考

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453&token=&lang=zh_CN  开发者接口文档),并通过http请求的post方式将封装好的消息数据发送给指定的 Linux服务器机器中的80端口的微信后台服务程序;

3、 微信后台服务程序对http请求的数据进行解析,获得发送用户的id、用户发送的内容等数据;

4、 微信后台服务程序根据解析到的数据,根据实际业务逻辑进行处理;

5、 微信后台服务程序根据《开发者接口文档》(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543&token=&lang=zh_CN),将待返回给用户的内容格式化为回复用户消息标准格式,并返回给http请求方:微信公众平台后台

6、 微信公众平台后台解析返回的请求数据,并将实际返回内容回复给用户;

7、 用户收到订阅号的回复消息。

 

3.3业务逻辑流程

主要业务逻辑代码在/opt/MT/WeChat/handle.py和msgManager.py中。

3.4.主要代码文件介绍

Main.py

根据web.py框架配置的服务入口,服务程序将会在后台一直运行,当收到发送给120.25.205.102/wx的请求时,将会把请求转发给handle.py文件中创建的对象。该文件不建议修改。

handle.py

接收到请求消息后的核心处理类,接收到http的post方式请求后,将会按照POST方法中定义的流程对请求消息进行实际处理。

receive.py

根据微信开发者文档,用户请求的信息都将会被封装为xml格式发送给后台服务程序,receive.py用于解析请求中的xml消息,并获得具体数据信息

reply.py

根据微信开发者文档,后台服务程序处理后的待发送消息需要格式化为标准的xml格式,才能被微信开发者后台识别。reply.py用于将待发送的消息格式为标准形式。

msgManger.py

根据用户发送的消息内容,生成具体的回复内容,可在此次实现具体业务逻辑。当前已经实现关键字匹配返回内容形式和随机权值返回内容。

usrInfo.py

保存用户相关信息,并提供查询修改memcached获取该用户新闻状态信息的接口

timer.py

定制定时事件,可以用于每天主动推送服务内容,当前由于订阅号权限不够,该文件模块尚未用到。

dailySend.py

用于每日主动推送服务内容的管理,由于当前订阅号权限不够,该文件模块尚未用到。

restartServer.sh

启动/重启微信后台服务器的脚本文件,强制退出原服务,并重启新服务

 

3.5启动方式

最简单的启动方式为进入/opt/MT/WeChat/目录,输入python ./main.py 80即可。

但是此种方式启动存在一定弊端:

1、 原来在后台运行的该微信服务器程序已经关闭;

2、 Memcached服务必须打开;

3、 该程序属于该终端,当该终端被关闭后,这个服务程序就会退出运行,导致微信该订阅号无法提供服务。

 

正常情况下可以通过/opt/MT/WeChat/目录下的weChatServer.sh脚本启动,默认输入 ./weChatServer.sh 将会出现帮助信息:

技术分享

如果刚修改完代码,想测试代码能否跑通,可以输入./weChatServer.sh hStart用于调试。此时程序将在前台运行,且将日志信息直接输出到终端。如果希望强制关闭服务,可以按ctrl+c强制退出;

如果测试没有问题,可以输入./weChatServer.sh start,此时服务将会在后台正式部署,一旦正式部署,服务将无法在该终端直接退出。

如果希望将在后台部署的服务关闭,输入./weChatServer.sh end即可。

 

4.  爬虫后台程序架构设计

4.1简介

       爬虫后台程序使用python语言进行开发,使用了scrapy作为框架,目前运行依赖:

  1. python2.7版本以上
  2. 安装scrapy
  3. 安装web.py
  4. 安装python-dev ,MySQL-python

 

同时爬虫程序将会调用/opt/MT/BosonNLP/summary.py文件,该文件需要安装bosonnlp.py

参考文档:《Scrapy 0.24.6 文档》

http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html

 

4.2业务逻辑流程

技术分享

主要业务逻辑代码在/opt/MT/MtCrawler/mtCrawler/spiders/dnyct_spider.py和handle.py中。

 

4.3主要代码文件介绍

/opt/MT/MtCrawler/start.py:

实际crawler框架的启动程序,在该目录执行python ./start.py即可启动。Crawler启动后将会在当前目录的mtCrawler/spiders子目录下寻找dnyct_spider文件

/opt/MT/MtCrawler/start.sh:

将启动程序start.py进行了脚本封装,正常情况下执行./start.sh同样可以启动爬虫程序。

/opt/MT/MtCrawler/mtCrawler/settings.py:

Crawler框架的配置文件,不建议修改

/opt/MT/MtCrawler/mtCrawler/文件夹下的其他文件:

不用管,没用到

/opt/MT/MtCrawler/mtCrawler/spiders/dnyct_spider.py:

抓取猎云网东南亚版块的核心。继承于scrapy框架的scrapy.Spider类和我封装的接口MySpider类。从设置的起始网站爬取指定格式的url,作为目标新闻网页,再去爬取这些目标新闻网页的具体内容,爬取完数据后交给handle进行处理

/opt/MT/MtCrawler/mtCrawler/spiders/mySpider.py:

定义了一些公共接口,并被dnyct_spider类实现。以后开发新的网页爬虫,只需继承并实现这个类的接口即可。

/opt/MT/MtCrawler/mtCrawler/spiders/handle.py:

定义了爬取的数据的处理流程,过滤文字内容,调用实现的Summary库获取摘要,并最终将数据存入DB。

4.4启动方式

       直接启动一次该爬虫程序进行抓取数据,只需在/opt/MT/MtCrawler目录中执行./start.sh脚本即可。

       当前程序在linux中通过crontab配置了定时任务,将由系统在每天早晨8点、12点、晚上6点自动执行./start.sh脚本来拉取最新的新闻数据。查看配置的定时任务,可以在终端输入crontab –e,其中* 8,12,18 * * * /opt/MT/MtCrawler/start.sh即为配置的爬虫定时启动任务。

 

5. 其它模块设计

5.1BosonNLP模块设计

目前主要采用了Bosonnlp提供的python API实现了摘要处理。

 

依赖:

  1. 在http://bosonnlp.com/注册开发者。获取API密钥
  2. 安装bosonnlp的python支持库:pip install bosonnlp

 

参考《Bosonnlp开发文档》

http://docs.bosonnlp.com/tutorial_index.html

 

/opt/MT/BosonNLP/summary.py:

直接调用bosonnlp库中的生成摘要接口。该python文件将会被爬虫程序的handle.py中被调用。

 

5.2 Memcached模块设计

Memcached为内存缓存服务。可以将键值对数据(key,value)存入memcached中,并设置超时时间。在超时时间内,可以通过键(key)获取到对应的值(value)信息。

安装方式:

sudo apt-get install memcached

启动方式(无需主动启动):

memcached -d -m 128 -p 11333 -u root

默认通过微信后台服务程序的启动脚本启动。请参考5.5节内容。

 

在微信后台服务器程序中usrInfo.py将会调用memcached的服务。通过memcached临时存储某个用户请求某个新闻类型的次数,保存1分钟。

键(key)为:MT_ + 用户id + _ + 新闻类型

值(value)为:一分钟内的请求次数

 

具体使用实现可以参考/opt/MT/WeChat/usrInfo.py。以及msgManger.py中的NewsManager

 

6. 数据库设计

6.1 简介

数据库采用mysql。

表的创建脚本位于

/opt/MT/MT_DB.sql中,可进入查看具体的表信息。

6.2 表结构介绍

6.2.1 ContentInfo表

用于储存匹配不到关键字后根据权值随机返回的消息内容。修改表后需要重启微信后台服务程序才能生效

字段名

类型

说明

其它

id

int(5)

标识id

从1开始自增长

contentMsg

varchar(255)

实际消息内容

每条消息内容必须唯一,不能插入相同的消息内容

weight

int unsigned

权值

权值越高返回的几率越大

valid

int(1)

是否使用

1为使用;0为失效。

默认为1

updateTime

timestamp

修改时间

每次被修改会自动更新

 

6.2.2 KeyInfo表

       用于储存可以被匹配的关键字以及对应返回的内容。修改表后需要重启微信后台服务程序才能生效。

字段名

类型

说明

其它

id

int(5)

标识id

从1开始自增长

keyWord

varchar(100)

关键字

每个关键字内容必须唯一,不能插入相同关键字

contentMsg

text

实际回复内容

 

valid

int(1)

是否使用

1为使用;0为失效。

默认为1

updateTime

timestamp

修改时间

每次被修改会自动更新

 

6.2.3 NewsInfo表

       用于储存爬取到的新闻内容。修改后即时生效,无需重启。

字段名

类型

说明

其它

id

int(5)

标识id

从1开始自增长,做为该新闻的编号

webName

varchar(20)

网站名

如“猎云网”

sectionName

varchar(20)

版块名

如“东南亚创投版块”

newsUrl

varchar(255)

链接地址

 

newsTitle

varchar(255)

标题

每个新闻的标题内容必须唯一,无法插入相同标题的新闻

newsSummary

text

摘要内容

 

valid

int(1)

是否使用

1为使用;0为失效。

默认为1

updateTime

timestamp

修改时间

每次被修改会自动更新

微信新闻爬虫订阅号设计