获取淘票票上某个电影在全国各影院的票价

背景:

  • 查看看全国各地的物价分布,于是想到通过淘票票查询全国各大影院票价来代替,尝试过requests,selenium都绕不开验证码.于是通过模拟键盘和鼠标的方式,切换不同的url,并结合mitmproxy的http代理,保存网页

主要步骤:

  • 1.打开淘票票网站并登录,选择任意一个城市
  • 2.保存网页并用python解析,可以得到城市编码。之后与电影Id、当前时间戳一起生成URL,获取该城市各院线的票价信息
  • 3.通过mitmproxy拦截http请求,过滤淘票票网站,解析url获取到城市编码,用来去重
  • 4.通过剪切板、热键、模拟键盘、模拟鼠标的方式,修改浏览器里的地址信息,以达到切换URL的目的

1.安装依赖

pip install pyperclip
pip install pyautogui
pip install keyboard
pip install mitmproxy
pip install pynput

2.mitmproxy http拦击脚本[mitmdump_hook.py]

import mitmproxy.http
import codecs
import hashlib
import os

def md5(password):
    ps = hashlib.md5()
    ps.update(password.encode("utf8"))
    return ps.hexdigest()

class Tb(object):
    def response(slef,flow: mitmproxy.http.HTTPFlow):   
        if flow.request.url.find("dianying.taobao.com")>=0:
            city=[x.split("=")[1] for x in flow.request.url.split("&") if x.split("=")[0]=="city"][0]
            save_path=f"{city}.html"
            print(flow.request.url,save_path)
            if not os.path.exists(save_path):            
                with codecs.open(save_path,"a+",encoding="UTF-8") as f:
                    f.write(flow.response.text)
addons = [  Tb() ]

3.运行mitmdump,启动http代理

mitmdump.exe -p 8080  -s mitmdump_hook.py

3.设置代理服务器

win11->设置->网络和Internet->代理->手动设置代码->编辑代理服务器(IP地址:127.0.0.1 端口:8080) 保存

4.浏览器打开https://dianying.taobao.com/

5.运行以下脚本,自动输入URL,并回车,查询该城市的影院信息,页面内容会被mitmproxy脚本拦截并保存为html

# -*- coding: utf-8 -*-
import keyboard
import pyperclip
import pyautogui
from pynput.mouse import Button, Controller
import time
import datetime
from urllib.parse import urlencode
import hashlib
import os

cityList={'阿坝': '513200', '阿克苏': '652900', '阿拉善': '152900', '阿勒泰': '654300', '安康': '610900', '安庆': '340800', '鞍山': '210300', '安顺': '520400', '安阳': '410500', '白城': '220800', '百色': '451000', '白沙': '469025', '白山': '220600', '白银': '620400', '保定': '130600', '宝鸡': '610300', '保山': '530500', '包头': '150200', '巴彦淖尔': '150800', '巴中': '511900', '北海': '450500', '北京': '110100', '蚌埠': '340300', '本溪': '210500', '毕节': '522401', '滨州': '371600', '亳州': '341600', '巴音郭楞': '652800', '沧州': '130900', '长春': '220100', '常德': '430700', '昌吉': '652300', '昌江': '469026', '长沙': '430100', '长治': '140400', '常州': '320400', '巢湖市': '340181', '朝阳': '211300', '潮州': '445100', '承德': '130800', '成都': '510100', '澄迈县': '469023', '郴州': '431000', '赤峰': '150400', '池州': '341700', '重庆': '500100', '崇左': '451400', '楚雄': '532300', '滁州': '341100', '大 理': '532900', '大连': '210200', '儋州': '460400', '丹东': '210600', '大庆': '230600', '大同': '140200', '大兴安岭': '232700', '达州': '511700', '屯昌': '469022', '德宏': '533100', '德阳': '510600', '德州': '371400', '定安': '469021', '定西': '621100', '迪庆': '533400', '东方': '469007', '东莞': '441900', '东营': '370500', '鄂尔多斯': '150600', '恩施': '422800', '鄂州': '420700', '防城港': '450600', '佛山': '440600', '抚顺': '210400', '阜新': '210900', '阜阳': '341200', '抚州': '361000', '福州': '350100', '甘南': '623000', '赣州': '360700', '甘孜': '513300', '巩义市': '410181', '广安': '511600', '广元': '510800', '广州': '440100', '贵港': '450800', '桂林': '450300', '贵阳': '520100', '固原': '640400', '哈尔滨': '230100', '海北': '632200', '海东': '630200', '海口': '460100', '海南州': '632500', '海西': '632800', '哈密': '652200', '韩城市': '610581', '邯郸': '130400', '杭州': '330100', '汉中': '610700', '鹤壁': '410600', '河池': '451200', '合肥': '340100', '鹤岗': '230400', '黑河': '231100', '衡水': '131100', '衡阳': '430400', '和田': '653200', '河源': '441600', '菏泽': '371700', '贺州': '451100', '红河': '532500', '淮安': '320800', '淮北': '340600', '怀化': '431200', '淮南': '340400', '黄冈': '421100', '黄南': '632300', '黄山': '341000', '黄石': '420200', '呼和浩特': '150100', '惠州': '441300', '葫芦岛': '211400', '呼伦贝尔': '150700', '湖州': '330500', '佳木斯': '230800', '吉安': '360800', '江门': '440700', '焦作': '410800', '嘉兴': '330400', '嘉峪关': '620200', '揭阳': '445200', '吉林': '220200', '济南': '370100', '金昌': '620300', '晋城': '140500', '景德镇': '360200', '荆门': '420800', '荆州': '421000', '金华': '330700', '济宁': '370800', '晋中': '140700', '锦州': '210700', '九江': '360400', '酒泉': '620900', '鸡西': '230300', '济源': '410881', '开封': '410200', '喀什': '653100', '克拉玛依': '650200', '克孜勒苏柯尔克孜': '653000', '昆明': '530100', '来宾': '451300', '廊坊': '131000', '兰州': '620100', '拉萨': '540100', '乐东': '469027', '乐山': '511100', '凉山': '513400', '连云港': '320700', '聊城': '371500', '辽阳': '211000', '辽源': '220400', '丽江': '530700', '临沧': '530900', '临汾': '141000', '临高': '469024', '临夏': '622900', '临沂': '371300', '林芝': '542600', '丽水': '331100', '六安': '341500', '六盘水': '520200', '柳州': '450200', '陇南': '621200', '龙岩': '350800', '娄底': '431300', '陵水': '469028', '吕梁': '141100', '漯河': '411100', '洛阳': '410300', '泸州': '510500', '马鞍山': '340500', '茂名': '440900', '眉山': '511400', '梅州': '441400', '绵阳': '510700', '牡丹江': '231000', '南昌': '360100', '南充': '511300', '南京': '320100', '南宁': '450100', '南平': '350700', '南通': '320600', '南阳': '411300', '那曲': '540600', '内江': '511000', '宁波': '330200', '宁德': '350900', '怒江': '533300', '盘锦': '211100', '攀枝花': '510400', '平顶山': '410400', '平凉': '620800', '萍乡': '360300', '普洱': '530800', '莆田': '350300', '濮阳': '410900', '黔东南': '522600', '潜江': '429005', '黔南': '522700', '黔西南': '522300', '青岛': '370200', '庆阳': '621000', '清远': '441800', '秦皇岛': '130300', '钦州': '450700', '琼海': '469002', '琼中': '469030', '齐齐哈尔': '230200', '七台河': '230900', '泉州': '350500', '曲靖': '530300', '衢州': '330800', '日喀则': '540200', '日照': '371100', '三门峡': '411200', '三明': '350400', '三亚': '460200', '上海': '310100', '商洛': '611000', '商丘': '411400', '上饶': '361100', '山南': '540500', '汕头': '440500', '汕尾': '441500', '韶关': '440200', '绍兴': '330600', '邵阳': '430500', '神农架林区': '4290210', '沈阳': '210100', '深圳': '440300', '石河子': '659001', '石家庄': '130100', '十堰': '420300', '石嘴山': '640200', '双 鸭山': '230500', '朔州': '140600', '四平': '220300', '松原': '220700', '绥化': '231200', '遂宁': '510900', '随州': '421300', '宿迁': '321300', '宿州': '341300', '苏州': '320500', ' 塔城': '654200', '泰安': '370900', '太原': '140100', '台州': '331000', '泰州': '321200', '唐山': '130200', '天津': '120100', '天门': '429006', '天水': '620500', '铁岭': '211200', ' 铜川': '610200', '通化': '220500', '通辽': '150500', '铜陵': '340700', '铜仁': '520600', '图木舒克市': '659003', '万宁': '469006', '潍坊': '370700', '威海': '371000', '渭南': '610500', '文昌': '469005', '文山': '532600', '温州': '330300', '乌海': '150300', '武汉': '420100', '芜湖': '340200', '五家渠': '659004', '乌兰察布': '150900', '乌鲁木齐': '650100', '武威': '620600', '无锡': '320200', '吴忠': '640300', '梧州': '450400', '厦门': '350200', '西安': '610100', '湘潭': '430300', '湘西': '433100', '襄阳': '420600', '咸宁': '421200', '仙桃': '429004', '咸阳': '610400', '孝感': '420900', '锡林郭勒': '152500', '兴安盟': '152200', '邢台': '130500', '兴义市': '522301', '西宁': '630100', '新乡': '410700', '信阳': '411500', '新余': '360500', '忻州': '140900', '西双版纳': '532800', '宣城': '341800', '许昌': '411000', '徐州': '320300', '雅安': '511800', '延安': '610600', '延边': '222400', '盐城': '320900', '阳江': '441700', '阳泉': '140300', '扬州': '321000', '烟台': '370600', '宜宾': '511500', '宜昌': '420500', '伊春': '230700', '宜春': '360900', '伊犁': '654000', '银川': '640100', '营口': '210800', '鹰潭': '360600', '宜兴市': '320282', '益阳': '430900', '永州': '431100', '岳阳': '430600', '玉林': '450900', '榆林': '610800', '运城': '140800', '云浮': '445300', '玉树': '632700', '玉溪': '530400', '枣庄': '370400', '张家界': '430800', '张家口': '130700', '张掖': '620700', '漳州': '350600', '湛江': '440800', '肇庆': '441200', '昭通': '530600', '郑州': '410100', '镇江': '321100', '中山': '442000', '中卫': '640500', '周口': '411600', '舟山': '330900', '珠海': '440400', '驻马店': '411700', '株洲': '430200', '淄博': '370300', '自贡': '510300', '资阳': '512000', '遵义': '520300'}

running=True

def my_hotkey_action():
    global running
    print("热键被触发了!")
    running=False

def md5(password):
    ps = hashlib.md5()
    ps.update(password.encode("utf8"))
    return ps.hexdigest()

keyboard.add_hotkey('ctrl+q', my_hotkey_action)

print("1.用浏览器打开淘票票网站(https://dianying.taobao.com),并登录")
print("2.将鼠标放在浏览器的地址栏")
print("3.按ctrl+q 来触发热键,开始自动输入url,并模拟回车,打开新的页面,页面的内容会被mitmdump脚本拦截并保存")

while running:
    time.sleep(0.1) 

print("start....")

for regionName,city in cityList.items():

    save_path=f"{city}.html"
    if os.path.exists(save_path):
        print(f"{save_path} bypass")
        continue
        
    now = datetime.datetime.now()
    timestamp = time.mktime(now.timetuple())     
    timestamp_millis = int(timestamp * 1000)
    param={
                "showId":"1515745",
                "city":city,
                "ts":timestamp_millis,
                "date":"2024-08-10"
            }    
                
    base_url="https://dianying.taobao.com/showDetailSchedule.htm?"
    url = base_url + urlencode(param)
    
    print(url)
    pyperclip.copy(url)
    
    mouse = Controller()
    current_mouse_pos = mouse.position

    mouse.click(Button.left, 1)  # 单击一次    
    pyautogui.hotkey('ctrl', 'a')
    time.sleep(0.1)
    pyautogui.hotkey('ctrl', 'v')   
    time.sleep(0.1)
    pyautogui.press('enter')
    time.sleep(5)
  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hi20240217

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值