美文网首页LyndonPyProj呆鸟的Python数据分析
用代码监测特定商圈内电影是否开始预售(Python爬虫)

用代码监测特定商圈内电影是否开始预售(Python爬虫)

作者: 放翁lcf | 来源:发表于2019-04-12 20:26 被阅读65次

    昨天写了用来监测某部特定电影是否开始预售的代码,今天中午12点过后果然及时捕捉到了猫眼上的更新,成果如下:

    对特定电影的监测效果

    微信公众号和朋友圈关于《复联四》放票预售的消息都在1点之后才出现的。
    但是开始预售的电影院离我都比较远,我关注的一些影院还没开售。昨天的代码是简陋了些,因此加了一些功能,继续跑着监测,到晚上19点40多终于有消息了,赶紧去抢《复联四》的首映票,还有一半的座位可以抢,激动。

    对特定电影院的预售监测

    代码如下:

    import time 
    import requests
    import traceback
    from lxml import etree
    import tkinter as tk
    from tkinter import messagebox
    
    def showYZMsg():
        window = tk.Tk()
        window.title('zhonggc')
        window.geometry('400x400')
        tk.Button(window,text='zhonggc').pack()
        window.mainloop()
    
    def monitorZhongguanc(url,t=0,ts=1):#对中关村商圈进行监测
        had=False #ts:两次get页面间隔,分钟
        while True: #主循环
            try:
                txt=requests.get(url).text
                html=etree.HTML(txt)
                mlst=html.xpath('//*[@id="app"]/div[2]/div[*]/div[1]/a/text()')
                mlen=len(mlst)
                if mlen>t:
                    had=True
                    for i in range(t,mlen):
                        print("add{0}".format(mlst[i]))
                    print(mlst)
                    t=mlen
                    showYZMsg()
                    
                if had:
                    had=False
                else:
                    lct=time.localtime()
                    if lct.tm_min>50: #50-60
                        ts=2
                    elif lct.tm_min>35:#36-49
                        ts=5
                    elif lct.tm_min>20: #21-34
                        ts=10
                    elif lct.tm_min>15: #16-20
                        ts=4
                    else: #0-15
                        ts=1
                        print('现在是{0},还没有预售消息;{1}'.format(time.asctime(),t))
                    time.sleep(60*ts) #sleep一段时间继续爬页面
            except:#输出错误信息
                traceback.print_exc()
            time.sleep(ts) 
    
    def monitorMeijia(url,t=0,ts=1):#url:需要监测的电影主页
        while True: #主循环
            try:
                txt=requests.get(url).text
                html=etree.HTML(txt)
                mlst=html.xpath('//*[@id="app"]/div[1]/div')[0].getchildren()
                had=False
                for m in mlst:
                    mid=m.attrib.get('data-movieid',0)
                    if mid=='248172':
                        print('电影院开启预售了!!{0}'.format(time.asctime()))
                        had=True
                        break
                if had:
                    showYZMsg()
                else:
                    lct=time.localtime()
                    if lct.tm_min>50: #50-60
                        ts=2
                    elif lct.tm_min>35:#36-49
                        print('现在是{0},还没有预售消息,{1}'.format(time.asctime(),t))
                        ts=5
                    elif lct.tm_min>20: #21-34
                        ts=10
                    elif lct.tm_min>15: #16-20
                        ts=7
                    else: #0-15
                        ts=1
                        print('现在是{0},还没有预售消息,t={1}'.format(time.asctime(),t))
                    time.sleep(60*ts) #sleep一段时间继续爬页面
            except:#输出错误信息
                traceback.print_exc()
            time.sleep(ts) 
            t+=1
    
    
    #murl='https://maoyan.com/cinemas?movieId=248172&brandId=-1&areaId=688&districtId=17'
    #monitorZhongguanc(murl,t=1,ts=1)
    murl='https://maoyan.com/cinema/197?poi=279439&movieId=248172'
    monitorMeijia(murl,t=0,ts=1) #对特定电影院进行监测
    
    

    思路还是看特定网页的特征,定位到增加电影院或特定电影院增加自己关注的电影再用xpath匹配。拿猫眼电影《复联四》的售票页面来说,选定行政区商圈之后,看url的变化,以及定位下面电影院的位置,然后看源码复制xpath,粘贴到代码里,猫眼特别好的地方是会把电影的id和电影院的id都写在url里,格式如:https://maoyan.com/cinema/197?poi=279439&movieId=248172(这里对应的是美嘉电影院),可以看到网页HTML的层级是很容易理解的,有个movie-list,下面的div包含data-movieid属性。

    猫眼中电影院的可购票电影页面

    于是可以比对这些movieid里面是否有目标电影ID,示例代码如mid=m.attrib.get('data-movieid',0);if mid=='248172':sendMsg()
    以上代码还有一个改动是对时间进行了一个,对整点的时候重点关注,例如重点关注每个小时的55分到59分和1分到15分这段时间,其余时间去爬网页的频率小些。用到了time.localtime().tm_min
    以上代码更新于github:QLWeilcf-moviePresaleMonitor

    相关文章

      网友评论

        本文标题:用代码监测特定商圈内电影是否开始预售(Python爬虫)

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