V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
xcc3641
V2EX  ›  Python

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

  •  4
     
  •   xcc3641 ·
    xcc3641 · 2016-01-18 21:00:03 +08:00 · 4738 次点击
    这是一个创建于 3218 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

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

    准备

    • 一台云服务器
    • 写好的 Python 脚本

    效果

    因为现在“一个”的 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 的用法,感觉还是挺容易上手的。
    具体的实现都不难,都是基础的爬虫知识,而且“一个”并没有反爬虫的设定,所以蛮适合初学者的。

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

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

    http://rest.wufazhuce.com/OneForWeb/one/getHpinfo?strDate=2016-01-18
    其他关键词: getOneContentInfo getOneQuestionInfo getOneThingInfo
    Aixtuz
        10
    Aixtuz  
       2016-01-19 01:45:15 +08:00   ❤️ 1
    再吐槽一句: 首页 Hpinfo 里的 i 我没有拼错, 和其他页面不同, 偏就是小写字母. 强迫症早已忍不了...
    ryd994
        11
    ryd994  
       2016-01-19 07:13:27 +08:00
    呃……
    一个 有 RSS 的
    SpicyCat
        12
    SpicyCat  
       2016-01-19 09:37:58 +08:00
    xcc3641
        13
    xcc3641  
    OP
       2016-01-19 09:38:21 +08:00
    @l12ab 我这个主要是每天会自动发信息到你的邮件,这样你就不用每次去看网页啊之类的了。
    LoliconInside
        14
    LoliconInside  
       2016-01-19 09:50:14 +08:00
    @ETiV 哈哈哈哈哈哈哈握爪
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2629 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:30 · PVG 13:30 · LAX 21:30 · JFK 00:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.