[新手开源] 爬取韩寒“一个”文章且自动邮件发送功能

2016-01-18 21:00:03 +08:00
 xcc3641

前言

第一次在 V 发代码~觉得还可以的希望给个 star~
地址: https://github.com/xcc3641/pySendOneToEmail

准备

效果

因为现在“一个”的 Android 客户端启动越来越慢,而且很多自己不感兴趣的东西(我只是想看看文章),所以就写了这个小爬虫。它可以在“一个”更新后把我要的内容发到我的邮箱里。
放在云服务器里,所以不用担心电费啊其他问题~

实践

云服务器

自己配置的是阿里云的服务器,学生特惠 9.9 , Ubuntu 系统。这个系统自带了 Python2.7 环境,所以不用自己手动去安装。
本地是用的 Window10 系统,最好安装下SecureCRSecureFXPortable。远程连接自己的服务器,而且命令行和文件操作会简便很多。
因为“一个”是每天 22 点会更新,所以自己的服务器要做一个定时服务, ubuntu 下自带了Crontab定时任务。

配置 Crontab

1.加入需要执行的脚本

crontab -e
1 22 * * * 路径 /python 路径 /xxx.py
保存重启 /etc/init.d/cron restart

2.Python 最好写全路径,这是一个坑
3.需要在 root 用户下进行
4.具体的 Crontab 可以参考Crontab

Python 代码

这里主要是用到了 python 自带的邮件服务的库和第三方网络解析库,代码量不多而且也不难,有编程基础的很容易学会。

邮件相关

邮件类库

from email.mime.multipart import MIMEMultipart
   from email.header import Header
   from email.mime.text import MIMEText
   from email.utils import parseaddr, formataddr
   import smtplib

配置邮件&发送邮件的关键代码

msg = MIMEMultipart()

msg['From'] = _format_addr(u'Xie CC <%s>' % from_addr)
msg['To'] = _format_addr(u'管理员 <%s>' % to_addr)
msg['Subject'] = Header(u'The One    ' + title, 'utf-8').encode()

msg.attach(MIMEText('<html><body><div style="text-align: center;"><p><img src="' + img + '"></p></div>' +
                        '<p style="text-align:center;\"> <br /><br /><strong><span style="font-size:14px;\">' + text +
                        '</span></p><br /><br /><br /><br /><br />' + story + '</body></html>', 'html', 'utf-8'))

    server = smtplib.SMTP(smtp_server, 25)
    server.set_debuglevel(1)
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr], msg.as_string())
    server.quit()

这里自己就不详细介绍这个库,具体可以参考这个教程, Python 不是很难理解.

爬取信息

类库

import requests
   from bs4 import BeautifulSoup

有一次用 urllib , urllib2 发现会遇到各种编码问题需要自己去解决,特别烦人。然后转到了 requests 这个库,完全没有遇到像 url 那样恶心的编码问题,而且很多需求都可以满足,所以后面爬静态网页都习惯用这个库了。
以前还是蛮喜欢用正则的,这次就学习了下 bs4 的用法,感觉还是挺容易上手的。
具体的实现都不难,都是基础的爬虫知识,而且“一个”并没有反爬虫的设定,所以蛮适合初学者的。

用工具方便自己,我觉得这就是自己编程的意义,这让我很开心。

4788 次点击
所在节点    Python
14 条回复
omoyouo
2016-01-18 21:23:42 +08:00
顶一个
icedx
2016-01-18 22:03:24 +08:00
赞一个 很有我年轻时写的代码的味道..
MindPunk
2016-01-18 22:13:56 +08:00
写一个邮件订阅系统?大家直接订阅你不就好了。。。
nisbme
2016-01-18 22:40:01 +08:00
不用爬
https://github.com/anpho/one.git
搜一下里面,有 json api ,直接获取就可以了
7emes
2016-01-18 23:29:40 +08:00
加块砖, http://caodan.org/ ,很早就出现的了,大概是 one 一个十几期的时候,可以 rss 订阅。
l12ab
2016-01-18 23:58:47 +08:00
one 本身就有网页版吧,你分享到微信朋友圈,就是一个链接形式
SeanChense
2016-01-19 00:26:32 +08:00
不错。
正准备自动爬某个页面然后给我自己发变化通知。
已 star
ETiV
2016-01-19 00:48:00 +08:00
我今天看到韩寒就想起来那张动作片封面来……
Aixtuz
2016-01-19 01:38:30 +08:00
one 的 json api 网上找到过两种:
github 里找到一种, 其中 url 拼接的某些日期要用于获取广告, 所以 url 拼接日期和 返回结果不对应;
新浪博客里找到一种, 比较久远的文章. 不含返回广告部分, 日期与返回结果对应, 只是拼接的是 ip 地址.
好在已经知道了第一种, 直接拿域名替换了. 最后就是这个格式:

http://rest.wufazhuce.com/OneForWeb/one/getHpinfo?strDate=2016-01-18
其他关键词: getOneContentInfo getOneQuestionInfo getOneThingInfo
Aixtuz
2016-01-19 01:45:15 +08:00
再吐槽一句: 首页 Hpinfo 里的 i 我没有拼错, 和其他页面不同, 偏就是小写字母. 强迫症早已忍不了...
ryd994
2016-01-19 07:13:27 +08:00
呃……
一个 有 RSS 的
SpicyCat
2016-01-19 09:37:58 +08:00
xcc3641
2016-01-19 09:38:21 +08:00
@l12ab 我这个主要是每天会自动发信息到你的邮件,这样你就不用每次去看网页啊之类的了。
LoliconInside
2016-01-19 09:50:14 +08:00
@ETiV 哈哈哈哈哈哈哈握爪

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/251679

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX