定期抓取我关注的团购

某团网有一个名店抢购页面,这里每天都会更新两场特价团购,而作为一个伪程序员我当然不想自己天天去网页上关注有没有喜欢的团购,于是,自己动手30分钟实现一个定时抓取感兴趣的团购信息脚本@#¥%%%。

网页地址是http://www.meituan.com/hots/,
网页内容
首先看看源代码
源码
我们需要的内容就是红框标注的地方,一个团购地址和一个名称,因为价格信息被美团混淆处理了,很难抓取,所以放弃了。
得到这个信息之后只要看看名称是不是我们感兴趣的然后查找出来,再用邮件发送给自己就ok啦。

对,是挺简单的,这里面有几点需要注意的:
首先是网站城市的选择,如果直接访问美团会根据ip地址判断你所属的城市,显然我的服务器在美国。所以需要将cookie传进去,下面就是寻找代表西安的cookie了。

经过筛选,红线内的参数ci就是城市了,西安就是42。
所以在代码里我们构造一个cookie将城市写进去和请求一并提交,返回的页面自然就是西安的团购信息了。
这里我使用了正则查找信息,当然用别的工具也是可以的,图省事嘛,毕竟性能不做要求。

关于发送邮件呢,用的是Python自带SMTP工具发送的,只需要有一个发送邮箱就行了 = =。,具体可以参考代码或者自行搜索。
然后接收到的信息就是这样的:
邮件内容


脚本正常运行,下面就是放到服务器定期执行了:
在Linux下有个工具叫做crontab,大部分系统默认安装的,service crond start就可以了。
然后使用 crontab -u 用户名 -e 编辑定时任务(每天10点16点运行)

00 10,16 * python3 /ftp/meituan.py

轻松搞定定时任务,现在就等有喜欢的团购上门喽。

如果没有自己服务器的同学可以用新浪sae或者百度的bae,也都有定时任务的功能。

from email.header import Header
from email.mime.text import MIMEText
from smtplib import SMTPException
import smtplib

__author__ = 'zynick'

import requests
import re
import sys

get_url = 'http://www.meituan.com/hots/'
cookies = {'ci':'42'}
headers = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:36.0) Gecko/20100101 Firefox/36.0'}
number = 0
final = {}
server = 'smtp.qq.com'
usr = '***@***'
pwd = '*****'
receivers = ['***@***']


def getHtml():
    try:
        response = requests.get(get_url, cookies=cookies,headers=headers,timeout = 1000)
        if response.status_code == 200:
            return response.text
        else:
            print('request failed!')
    except TimeoutError:
        print('request time out!')
        sendMail('请求失败!请检查程序!')
        sys.exit()


def parseHtml(html,target):
    matchObj = re.findall(' <span class="xtitle">(.*)</span>',html)
    matchObj_1 = re.findall('<a href="(.*)" class="w-link"',html)
    if matchObj and matchObj_1:
        number = len(matchObj)
        print('total:',number)
        for x in range(len(matchObj)):
            if re.search(target,matchObj[x]):
                final[matchObj[x]] = matchObj_1[x]
    else:
        print('nothing')
        sys.exit()

def sendMail(message):

    msg = MIMEText(message, 'plain', 'utf-8')
    msg['From'] = 'python script <**@***>'
    msg['To'] = '宝宝 <***@***>'
    msg['Subject'] = Header('新的活动', 'utf-8').encode()

    try:
       smtpObj = smtplib.SMTP()
       smtpObj.connect(server)
       smtpObj.login(usr,pwd)
       smtpObj.sendmail(usr, receivers, msg.as_string())
       print ("Successfully sent email")
    except SMTPException:
       print ("Error: unable to send email")



if __name__ == '__main__':
    html = getHtml()
    parseHtml(html,'周辣|比格|欢辣汇|和福顺|兄弟老火锅|火锅')
    if len(final)>0:
        message = "以下是刚刚服务器发现的信息:\n"
        for x in final:
            message+=x+'  '+final[x]+'\n'
        print(' final',len(final))
        sendMail(message)