hyspider之影院爬取

城市信息抓取完成后,就可以基于city_id抓取影院信息了。由于影院信息变化相当缓慢,并且可以选择性的抓取某些城市,因此将city_id作为参数传递给影院爬虫,爬取影院详细地址后利用baidu map提供的地址解析api获取影院的经纬度信息,便于hyserver对影院排序。

猫眼

通过API返回json结构化数据可直接获取某个城市所有影院信息,启动爬虫时传递city_id作为参数:crawl cinema_mt -a city_id=10

cinema_mt源码:https://github.com/improvejin/hyspider/tree/master/hyspider/spiders/cinema/mt.py

#cityId=10的影院信息
http://m.maoyan.com/ajax/cinemaList?offset=0&limit=500&districtId=-1&cityId=10

#猫眼影院信息
CREATE TABLE `cinema_mt` (
  `id` int(11) NOT NULL,
  `name` varchar(30) NOT NULL DEFAULT '',
  `city` varchar(20) NOT NULL DEFAULT '' comment '城市',
  `district` varchar(20) NOT NULL DEFAULT '' comment '区域',
  `addr` varchar(100) NOT NULL DEFAULT '' comment '影院详细地址',
  `phone` varchar(50) NOT NULL DEFAULT '' commnt '影院电话',
  `lat_lng` varchar(50) NOT NULL DEFAULT '' comment '字符串类型经纬度',
  `location` point NOT NULL comment 'Point类型经纬度',
  `precise` tinyint(1) unsigned NOT NULL DEFAULT '0' comment 'baidu map api返回,解析是否准确',
  `confidence` tinyint(1) unsigned NOT NULL DEFAULT '0' comment 'baidu map返回,解析的可信度',
  `min_price` float NOT NULL DEFAULT '0' comment '影院最低价',
  `price_update_time` datetime NOT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_city` (`city`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;    
淘票票

淘票票也是通过api获取影院信息,只是返回的是html,需要解析html内容,并且分页获取。

cinema_tb源码:https://github.com/improvejin/hyspider/tree/master/hyspider/spiders/cinema/tb.py

#分页获取310100城市影院信息
https://dianying.taobao.com/ajaxCinemaList.htm?page=1&regionName=&cinemaName=&pageSize=30&pageLength=28&sortType=0&n_s=new&city=310100

#淘票票影院信息
CREATE TABLE `cinema_tb` (
  `id` int(11) NOT NULL,
  `name` varchar(30) NOT NULL DEFAULT '',
  `city` varchar(20) NOT NULL DEFAULT '',
  `district` varchar(20) NOT NULL DEFAULT '',
  `addr` varchar(100) NOT NULL DEFAULT '',
  `phone` varchar(50) NOT NULL DEFAULT '',
  `lat_lng` varchar(50) NOT NULL DEFAULT '',
  `location` point NOT NULL,
  `precise` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `confidence` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `min_price` float NOT NULL DEFAULT '0',
  `price_update_time` datetime NOT NULL DEFAULT '2018-08-25 00:00:00',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_city` (`city`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;    
糯米

糯米从h5获取影院信息,同淘票票一样需要分页获取,并且解析返回的html。同时与抓取城市信息类似,需修改user-agent。

cinema_lm源码:https://github.com/improvejin/hyspider/tree/master/hyspider/spiders/cinema/lm.py

#分页获取city=127的影院
https://mdianying.baidu.com/movie/cinema?sfrom=wise_shoubai&c=127&cc=&lat=&lng=&MOVIETOKEN=944244989d386f8ffbf98db708353f28&device=2_404_&pn=1&isAppend=1

CREATE TABLE `cinema_lm` (
  `id` int(11) NOT NULL,
  `name` varchar(30) NOT NULL DEFAULT '',
  `city` varchar(20) NOT NULL DEFAULT '',
  `district` varchar(20) NOT NULL DEFAULT '',
  `addr` varchar(100) NOT NULL DEFAULT '',
  `phone` varchar(50) NOT NULL DEFAULT '',
  `lat_lng` varchar(50) NOT NULL DEFAULT '',
  `location` point NOT NULL,
  `precise` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `confidence` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `min_price` float NOT NULL DEFAULT '0',
  `price_update_time` datetime NOT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_city` (`city`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
匹配

hymp比价时定位到影院、电影维度,电影较易匹配,影院则相对麻烦,同一影院在各个渠道详细地址并不完全一致,一些影院也并非在所有渠道都存在,因此不能简单通过字符串进行匹配。

影院匹配是整个系统的核心,直接决定了整个比价系统的准确性,为此,以猫眼影院为标准,依次用淘票票、糯米的影院信息与猫眼进行匹配,采用4个步骤进行匹配:

  1. 通过影院电话号码匹配,结果不正确可能有两种原因导致:

reason1: 同一影院不同渠道电话号码可能不同导致匹配不上, 此情况通过step2 AI文本匹配解决

reason2: 电话号码相同但并不是同一cinema,同一品牌cinema不同地址电话号码可能相同, 此情况通过step3 AI文本匹配检测出无效匹配并删除

  1. 通过AI文本匹配,找出渠道中通过step1未匹配上cinema与猫眼 cinema中按区域查找匹配, AI文本匹配通过百度云api计算两个地址相似度,相对比较准确,但是百度有请求速度限流

  2. 删除无效匹配,通过step1和step2匹配后,匹配结果中间表中可能存在一个猫眼影院id_mt匹配了渠道方的多个id_matched影院, 一个渠道方id_matched影院也可能匹配了多个id_mt,理论上一个猫眼影院只与一个渠道方影院匹配,此时利用AI文本匹配检测这种有多个匹配的记录,一般匹配相似度小于0.85的就是无效匹配,需要删除

  3. 删除无效匹配后渠道方某些影院可能没有与之匹配的猫眼影院id_mt,再次重复step2进行AI文本匹配

匹配源码CinemaMatcher.match_2mt方法:https://github.com/improvejin/hyspider/tree/master/hyspider/matchers/cinema.py

#淘票票与猫眼匹配结果
CREATE TABLE `match_cinema_tb2mt` (
  `id_mt` int(11) NOT NULL DEFAULT '0',
  `id_matched` int(11) NOT NULL DEFAULT '0',
  `match_type` tinyint(1) NOT NULL DEFAULT '0',
  `match_score` float NOT NULL DEFAULT '0',
  `match_step` tinyint(1) NOT NULL DEFAULT '0',
  `is_delete` tinyint(1) NOT NULL DEFAULT '0',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id_mt`,`id_matched`),
  KEY `idx_id_mt` (`id_mt`) USING BTREE,
  KEY `idx_id_matched` (`id_matched`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#糯米与猫眼匹配结果
CREATE TABLE `match_cinema_lm2mt` (
  `id_mt` int(11) NOT NULL DEFAULT '0',
  `id_matched` int(11) NOT NULL DEFAULT '0',
  `match_type` tinyint(1) NOT NULL DEFAULT '0',
  `match_score` float NOT NULL DEFAULT '0',
  `match_step` tinyint(1) NOT NULL DEFAULT '0',
  `is_delete` tinyint(1) NOT NULL DEFAULT '0',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id_mt`,`id_matched`),
  KEY `idx_id_mt` (`id_mt`) USING BTREE,
  KEY `idx_id_matched` (`id_matched`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

影院匹配结果存入中间表后,还需要汇总匹配结果,形成影院全量表,语义上全量表由match_cinema_tb2mt与match_cinema_lm2mt按id_mt进行full join获取,由于mysql不支持full join,匹配中间表中也可能有重复的id_mt, 所以直接通过代码进行汇总。

汇总源码CinemaMatcher.match_all_channels方法:https://github.com/improvejin/hyspider/tree/master/hyspider/matchers/cinema.py

#cinema汇总表
CREATE TABLE `cinema` (
  `id_mt` int(11) NOT NULL,
  `id_tb` int(255) NOT NULL DEFAULT '0',
  `id_lm` int(255) NOT NULL DEFAULT '0',
  `name` varchar(30) NOT NULL DEFAULT '',
  `city` varchar(20) NOT NULL DEFAULT '',
  `district` varchar(20) NOT NULL DEFAULT '',
  `addr` varchar(100) NOT NULL DEFAULT '',
  `lat_lng` varchar(50) NOT NULL DEFAULT '',
  `location` point DEFAULT NULL,
  `min_price` float NOT NULL DEFAULT '0',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id_mt`),
  KEY `idx_id_tb` (`id_tb`) USING BTREE,
  KEY `idx_id_lm` (`id_lm`) USING BTREE,
  KEY `idx_city` (`city`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值