项目开源:scrapy + mongodb + smtplib + 百度翻译 + schedule = CNS订阅器

背景与问题分析

实验室背景的原因,经常需要浏览CNS(Cell\Nature\Science)的文章,有时候因为网站加载比较慢,并且懒所以不想点开网站去读,为了push自己更加勤奋,我决定设计一个订阅CNS文章的工具。一般用RSS来完成,但是CNS网站提供的RSS源是每天都有的文章,不符合我们一期一期阅读的习惯,而且范围更大,不限于主刊。所以,我想定制一个符合我习惯的订阅工具(我习惯每天查邮件)。

整理问题如下:

1. 每天定时抓取Cell\Nature\Science\Nature Machine Intelligence\Patterns文章的标题、摘要等信息
2. 增量式抓取,只获取并提醒新一期的文章
3. 获取当天的更新后,推送到邮箱;没有更新则不推送
4. 最好能够提供陌生单词的翻译,帮助快速浏览和寻找感兴趣的文章,以便进一步深入阅读

显然,第一个问题需要使用爬虫来解决,这里考虑使用scrapy
第二个问题,需要保存以往的文章信息,这样可以直接查数据库看期刊是否是新一期的,我选择比较熟悉的mongodb
第三个问题,推送到邮箱,因为我的邮箱是学校邮箱,会自动过滤一些邮件,因此不好用随机的邮箱作为发送邮箱,所以申请了一个163邮箱作为发送邮箱,用 smtplib+email 模块发送邮件。
第四个问题,我选择使用百度翻译的api,它提供了专业领域的翻译,这里使用是medicine领域的接口,免费使用50万字符的垂直领域翻译功能。传送门:百度翻译开放平台

代码实现

代码现在Github已开源,传送门:CNS_Subscriber

首先,需要有一个服务器,这里使用阿里云的学生版,月租不到10块钱,并在服务器上配置好mongodbpython3,然后根据requirements.txt安装好需要的python模块。

爬虫的工作主要是根据xpath和网页源码来解析,过程比较枯燥,就不展开说了。不懂scrapy的朋友可以按照下面的简单流程来设计自己的爬虫:

1. 在items.py里添加爬虫使用的字段myfield

2. 在spiders文件夹里添加myname_spider.py,解析文本

3. 在pipelines.py里添加自己的MynamePipeline类,验证、处理、保存数据

4. 在settings.py里设置ITEM_PIPELINES,配置自己的Pipeline的优先级(应该是在多个爬虫中的优先级)

5. 启动爬虫

```bash
scrapy crawl myname
```

有些文章在主页可能不显示摘要等信息,需要点击跳转才能获取,所以这里会涉及到递归的爬虫操作,不过这个过程也不复杂啦哈哈哈。
对了,实际上这些网站是不允许爬虫抓取的(robots协议),但我只是自己研究用,不作商业用途,每天也只是抓一次,跟浏览器看一次也区别不大,为了能抓到信息,我修改了settings.py文件,设ROBOTSTXT_OBEY=False,即不遵守robots协议(注意这种操作是有法律风险的!,不过我自己用问题不大)

通过爬虫解析得到每一篇文章的信息,针对第四个需求,直接把信息传给翻译的api,将原信息和翻译结果逐条插入到mongodb里,mongodb设一个字段state来标记文章是否已经发送了,如果是unsent就在某个时间把unsent的文章发送出去。

在主文件schedules.py里,首先用 schedule 设一个定时器,这里设置为每天晚上9点,上述期刊都是每周、两周、月发布一期,所以需要抓取的东西也不多。时间到了,定时器就会自动运行爬虫抓取数据;抓完数据之后,再查数据库,看哪几期期刊是unsent,就把该期所有的文章发送到指定的邮箱上,然后更新为sent。哦,对了,在mondodb里另外设一个user表,用来保存接收邮箱的信息,这个最开始我是直接写在代码里的,后来实验室几个同学也想加进来,所以就写到数据库里啦,目前正在为8个同学提供服务哦。

邮件主要采用html格式,把所有的字段整理成一段文字,编码方式用的GB18030,不然学校邮箱会乱码 😦 。用smtplib登录163邮箱并发送邮件。

最后讲讲配置文件config_local.json字段的意思:tr_appidtr_secretKey是百度翻译提供的,每个账号都不一样滴。mail_host用的163邮箱,mail_usermail_pass是邮箱的账号密码,sender是发送邮箱的地址,其实是可以用mail_user和服务器地址组合成的,但是懒得自己整了,这里直接用完整的。mongo_portmongodb的端口,建议不要用mongodb的默认端口,因为非常容易被攻击!! 这是一个血的教训,话说我把代码部署到阿里云没几天,我的user表就被删了,还插了个表说我违反了GDPR要我打钱到它的比特币账户!WQNM我要能有比特币我还会用如此廉价的云服务吗!还好我的表里没有敏感信息,就几个同学的邮箱而已,于是我赶紧把mongodb的默认端口给改了,甚至把user表改成了yonghu表(哈哈哈没想到吧机智如我),从此再也没有人来删我的user表了2333。

{
    "tr_appid": "xxxxxxxxxxxxxxxxxxxxxxx",
    "tr_secretKey": "xxxxxxxxxxxxxxxxxxxx",
    "mail_host": "smtp.163.com",
    "mail_user": "xxxxxxxxxxxxxx",
    "mail_pass": "xxxxxxxxxxxxxx",
    "sender": "xxxxxxxxxxxxxxxx",
    "mongo_port": 9527
}

例子

最后给出一条邮件里的例子吧:

----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
Title: Nuclear medicine
标题: 核医学
Volume: Vol 371, Issue 6533
Category: Feature
Summary: Physician Masaharu Tsubokura has concluded that the evacuation of nearby residents during the March 2011 accident at the Fukushima Daiichi Nuclear Power Plant in northeastern Japan claimed more lives than the radiation spewed into the environment. No one died from the radiation, but Tsubokura's studies have shown that in the months after evacuation, the death rate increased for both genders and every age group. The stress and disruption were particularly hard on the elderly in long-term care facilities for whom the death rate increased 2.7 times compared with the period before the emergency. Tsubokura originally intended to volunteer his services in the region for just a few weeks, but documenting the health impacts of evacuation turned into a career.
摘要: 医生Masaharu Tsubokura得出结论,2011年3月在日本东北部福岛第一核电站发生事故期间,附近居民的撤离比向环境中喷出的辐射造成更多生命。没有人死于辐射,但Tsubokura的研究表明,在撤离后的几个月中,男女和每个年龄组的死亡率都有所增加。长期护理机构中老年人的压力和中断尤其严重,死亡率比紧急情况前增加了2.7倍。Tsubokura最初打算在该地区志愿服务几周,但记录撤离对健康的影响变成了职业。
url: https://science.sciencemag.org/content/371/6533/978

就是这样子啦,可以速览一下所有的内容并且快速筛选出感兴趣的文章,进一步阅读增强知识面哦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值