美文网首页python自学有点意思python 入门
python爬虫随邮件而走,服务器定时发送邮件

python爬虫随邮件而走,服务器定时发送邮件

作者: 5d33fb55f91d | 来源:发表于2017-08-30 17:41 被阅读868次

    title: 服务器定时发送邮件爬虫

    date: 2017-08-30 18:19:48

    前言

    开心做技术
    在深入感受到爬虫的乐趣的时候,多想用它干点简单的事情,我非常喜欢浏览某网站的热点新闻,但如果那天学习忙的天花乱缀(chu qu gui hun)的时候,“WC、WC、我错过了什么大事情”,就会错过当时的热点。怎么才能记录下呢!

    预期达成效果:

    python爬去某网站上的时刻下最热点新闻,存储到文档中。在lunix下定时每隔n小时启用python去爬取新闻,然后用邮件的形式每隔n小时将新闻文档发到自己的邮箱,以便朕统一的查阅。

    执行计划:

    1. 定时执行任务配置【Ubuntu环境下】
    2. 发送邮件相关配置
    3. 执行脚本编写
    4. python爬虫程序编写

    注:一千个人心中有一千个哈姆雷特,一千个人配出一千种错误


    1、定时执行任务

    在ubuntu相爱使用crontab部署定时任务{使用是linux虚拟机ubuntu。}

    cron是一个[守护程序]用于在指定的时间内执行行程类的任务,每一个用户都有一个 crontab 文件,来允许他们指定需要执行的内容和时间,此外,系统也有一个 crontab ,用来允许像交替日志和更新本地数据这样有规则的任务。

    插入crontab所需要的知识,只需要看看,了解下后面不明白再来看

    服务使用命令:

    查看cron的状态

    sudo  service cron status 
    

    开启cron

    sudo /etc/init.d/cron start 
    

    关闭cron

    sudo /etc/init.d/cron stop  
    

    重启cron

    sudo service cron restart
    

    or重启服务

    sudo /etc/init.d/cron restart  
    

    查看命令是否运行

    pgrep cron
    

    cron设置用法:

    crontab -e #设置定时任务
    crontab -l  #查看详情
    crontab -r : 删除 crontab 文件  不建议手贱去验证他
    

    定时任务的模版样式:

      * * * * * command  星星表示通配符 command表示任务
    

    m h dom mon dow command

    分 时 日 月 周 命令

    m 分钟 0-59第1列表示分钟1~59 每分钟用*或者 */1表示

    h 小时 0-23 第2列表示小时1~23(0表示0点)

    dow 天1-31 第3列表示日期1~31

    mon 月 1-12 第4列表示月份1~12

    dow 星期 1-6 0表示星期日第5列标识号星期0~6(0表示星期天)

    command 就是要执行的命令 第6列要运行的命令

    记住几个特殊符号的含义:

    “*”代表取值范围内的数字,

    “/”代表”每”,

    “-”代表从某个数字到某个数字,

    “,”分开几个离散的数字

    crontab文件的一些例子:

    30 21 * * * /usr/local/etc/rc.d/lighttpd restart
    

    上面的例子表示每晚的21:30重启apache。

    45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
    

    上面的例子表示每月1、10、22日的4 : 45重启apache。

    10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
    

    上面的例子表示每周六、周日的1 : 10重启apache。

    0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
    

    上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。

    0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
    

    上面的例子表示每星期六的11 : 00 pm重启apache。

    0 */1 * * * /usr/local/etc/rc.d/lighttpd restart
    

    每一小时重启apache

    0 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
    

    晚上11点到早上7点之间,每隔一小时重启apache

    0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
    

    每月的4号与每周一到周三的11点重启apache

    0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
    

    一月一号的4点重启apac

    每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件

     50   7       *             *     *     root     run-parts     /etc/cron.daily   [ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ]
    

    每天早上6点

    0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
    

    每两个小时(第一个为15,指明没两个小时的第15min中执行一次)

    15 */2 * * * echo "Have a break now." >> /tmp/test.txt 
    

    晚上11点到早上8点之间每两个小时和早上八点

    0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt
    

    每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

    0 11 4 * 1-3 command line
    

    每月(1号凌晨4:42)去执行/etc/cron.monthly内的脚本

    42 4 1 * * root run-parts /etc/cron.monthly
    

    注意: "run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名。

    每天的下午4点、5点、6点的5 min、15 min、25 min、35 min、45 min、55 min时执行命令。

    5,15,25,35,45,55 16,17,18 * * * command
    

    每年的一月和四月,4号到9号的3点12分和3点55分执行/bin/rm -f expire.1st这个指令,并把结果添加在mm.txt这个文件之后(mm.txt文件位于用户自己的目录位置)。

    12,553 4-91,4 * /bin/rm -f expire.1st$#@62;$#@62;mm.txt   (头大)
    

    自己测试小实验,了解他的大概流程与原理:

    root123456@ubuntu:~$ crontab –e
    

    使用vi编译器,第一次使用Ubuntu它会让你选着编译器,不要相信他的箭头(easies?)用了老半天就他最费劲 ,还是选择vi,别问为什么, 顺 手!


    在里面最下面键入:测试代码

    同时在目录下创建/tmp/1.txt

    */1 * * * * date >> /tmp/1.txt
    

    意思是每一分钟将当时的数据打印到/tmp/1.txt中

    然后esc –》:wq退出

    保存之后重启服务

    root123456@ubuntu:~$ sudo service cron restart
    

    查看结果

    root123456@ubuntu:~$ cat /tmp/1.txt
    

    每分钟去打印一次时间到1.txt上

    定时执行任务这步就可以确定定时可以使用了额,上面的配置是测试定时任务,认识到定时启动任务是什么形式的,还可以去找其他的例子,变换时间 和执行的命令自己做测试。

    这步骤是为了后面做铺垫,是后面的基础,就先在这提前介绍了。因为后面很“激情”来不及详细补充定时功能。


    2、发送邮件相关配置

    我认为重点和难点就是邮件的发送

    自动发送邮件,使用命令行的方式发送邮件。先来陪着两个邮件服务mutt msmtp

    在ubuntu下安装mutt很方便,只需要sudo apt-get install mutt

     sudo apt-get install mutt
    

    另外需要安装msmtp,一个发邮件的小工具,sudo apt-get insall msmtp。

     sudo apt-get insall msmtp
    

    在安装的过程中会出现package configuration,这时候发现无发选到ok

    按住Tab点亮ok 然后按住Enter键,接下来一顿默认猛如虎的操作(就乖乖的选默认)

    假装有图(安过后就忘了截图噜!)

    配置Muttrc

    打开文件,路径/etc/Muttrc

    set sendmail="/usr/bin/msmtp"  
    set use_from=yes  
    set realname="mailnam"    邮箱的名字
    set from=mailnam@163.com  你的邮箱
    set envelope_from=yes 
    

    配置msmtp

    msmtp默认没有,所以在/etc路径下创建msmtprc配置文件

    我本想用日志文件做测试,创建/var/log/msmtp.log,如果发生错误的话,能检测到原因

    打开msmtprc文件配置下面的内容

    account default  
    host smtp.163.com     不要动
    from mailname@163.com 你的邮箱
    auth plain  
    user mailname        你的名字
    password 123456      网易云邮箱客户端授权码,去网易云邮箱设置  教程向下面翻翻 
    

    这个设置权限步骤,只要你胆子大就不用(我是没改,太难了)

    由于我们的密码是明文,所以要稍稍的修改下权限(哈哈,你看不到我的pw,你看不到)

     chmod 600 msmtprc
    

    现在基本配置完成了,使用命令行输出测试一波

    我把以my_first_test为主题,test为内容的邮件发送到另一个我的邮箱

    echo "test" |mutt -s "my_first_test" 1599121712@qq.com
    

    哈哈,成功

    到这里邮箱配置的环境可以了,现在只能只能用命令行发送邮件。如何做到自动发送,且向下see

    常见的报错,搜一下一大推解决方案,奔溃边缘就重新配置,从0开始!

    mutt的常用命令

    mutt [-hnpRvxz][-a<文件>][-b<地址>][-c<地址>][-f<邮件文件>][-F<配置文件>][-H<邮件草稿>][-i<文件>][-m<类型>][-s<主题>][邮件地址]

    Linux命令参数:

    -a<文件 在邮件中加上附加文件。

    -b<地址 指定密件副本的收信人地址。

    -c<地址 指定副本的收信人地址。

    -f<邮件文件 指定要载入的邮件文件。

    -F<配置文件 指定mutt程序的设置文件,而不读取预设的.muttrc文件。

    -h 显示帮助。

    -H<邮件草稿> 将指定的邮件草稿送出

    -i<文件 将指定文件插入邮件内文中

    -m<类型 指定预设的邮件信箱类型。

    -n 不要去读取程序培植文件(/etc/Muttrc)

    -p 在mutt中编辑完邮件后,而不想将邮件立即送出,可将该邮件暂缓寄出。

    -R 以只读的方式开启邮件文件

    -s<主题 指定邮件的主题。

    -v 显示mutt的版本信息以及当初编译此文件时所给予的参数。

    -x 模拟mailx的编辑方式。

    -z 与-f参数一并使用时,若邮件文件中没有邮件即不启动mutt。

    举个橘子:

     mutt -s "subject" -a /home/admin/backup.tar.gz < /tmp/x.txt
    

    -s: 邮件标题,用""括上

    -a: 邮件附件。如上命令就是将/backup目录下 backup.tar.gz文件作为附件发送。

    < /tmp/x.txt:/tmp目录下x.txt文件里的内容作为邮件内容发送。

    给多人发送邮件,只要在邮箱地址后加空格接着输入邮箱地址即可,如:

     mutt -s "subject" -a /home/admin/backup.tar.gz < /tmp/x.txt
    

    网易163邮箱获取授权码

    163免费邮箱可以直接要网页上进行收发邮件,,如果在客户端上收发邮件必须使用授权码才能够使用

    授权码163邮箱的一个安全机制

    登录163邮箱,在设置里面


    查看,应该是没开启的状态,我的开启了


    点击开启,手机验证,输入的密码就是上面配置中输入的密码
    同时开通POP3/SMTP/IMTP邮件收发服务,你的手机邮件都会记录下这个密码的。

    在测试的时候出现错误:不要怕,去翻译去百度(我就是这么煎熬的过来的)


    3、执行脚本编写

    前面的的步骤成在Ubuntu上配置,下面就让发送邮件和定时功能结合起来,编写.sh小脚本

    在tmp下创建emil文件夹

    测试小实验:

    在里面创建a.sh文件,输入

    echo "aaaaaaaaaa" | mutt -s "this is title" 1599121712@qq.com
    

    邮箱是要发到的邮箱。


    bash '/tmp/email/a.sh'
    

    收到邮件

    然后在crontab中定时执行这个脚本

    crontab -e
    

    添加定时语句,每一分钟执行一次a.sh的脚本

    */1 * * * * bash  /tmp/email/a.sh
    

    保存 退出 重启服务器


    这是就会每分钟自动发送给你一次邮件


    不行我要赶紧关了,这一分钟一次也太烦了!!小实验到此实验成功!

    下面写将python爬取数据的1.txt文本中的内容发送到邮件上的.sh脚本

    同样的步骤依旧在原email的目录下创建1.sh和1.txt

    编写1.sh内容

    echo  "this is my computer"|mutt -s "my_conputer server" 1599121712@qq.com  </tmp/email/1.txt   -a /tmp/email/1.txt
    

    然后让他定时运行脚本

    */30 * * * * bash /tmp/email/1.sh
    

    30分钟给我发送一次,自己可以任意修改时间

    保存,重启服务
    完成.sh脚本的编写

    python爬虫程序的编写,将爬取的内容加入的/tmp/email/1.txt文档中
    附录:随手最简单的爬虫小程序

    import urllib.request
    from bs4 import BeautifulSoup
    url='http://neihanshequ.com/'
    html=urllib.request.urlopen(url).read()
    soup=BeautifulSoup(html,"lxml")
    ps=soup.find_all('p')
    i=[]
    for p in ps:
    i.append(p.get_text())

    with open ('/tmp/email/1.txt','w+') as f:
    f.writelines(i)

    实现过程 写好程序同样也放在email的目录下

    然后crontab加入定时运行python

    定时运行py

    总过程结束

    效果图:

    网页显示:将邮件放在指定的邮箱。

    网页

    手机端显示:设置为每两分钟接受一次邮件。

    iphone

    做这个小的应用集成,无非是做简单的技术实现,脑洞打开-同样也可以将里面的部分内容去置换。发送的邮件,不是这些无味的粗粮,如一些log日志,跟进工作中的copy事项,去完成其所需要的要求。

    相关文章

      网友评论

        本文标题:python爬虫随邮件而走,服务器定时发送邮件

        本文链接:https://www.haomeiwen.com/subject/labukxtx.html