本帖最后由 爬虫部落 于 2019-11-26 21:07 编辑
关于
一个基于 TG 机器人的优惠信息推送群组 /频道,支持关键词订阅推送功能。主要用来解决优惠信息太多却不能及时发现自己真正需要的东西的问题。
优惠来源
抓取 smzdm 上面 投票数>2 and 值率>60% 的精选优惠信息
赚客吧(充钱搞了个能获取赚客吧大部分阅读权限帖子的账号)
其他线报群
特点
- 关键词订阅提醒
- 默认静默推送不扰民
- 定期删除过期信息,不造成大量未读信息的心理压力
链接
- 群组(后续抽奖活动以群成员为主): https://t.me/zzzdmgroup
- 频道(喜欢安静的朋友可以关注频道): https://t.me/zzzdmchannel
图:
欢迎大家加群或者频道,下面说下思路和部分源码
首先是smzdm的链接抓取部分:
网站的跳转链接是做了反爬处理的,使用js生成一些加密的参数,如果正面突破的话需要先提取出来加密部分然后丢到js引擎去执行最后在带着处理好的参数去请求跳转,我js水平一般就没有再去分析加密过程,而是使用了pychrome提供了一个api接口专门提供链接转换服务,这里有几个细节
1. chrome又有现成的docker环境,不用自己搭建,稳定性的话我这边连续跑了十几天还没出问题
2. 在pychrome里面拦截掉除html和js以外的所有其他请求,这样能保证最快的加载速度
3. 在第一次捕获到目标网站后就立刻停止浏览器的请求,进一步提高速度,因为跳转链接有什么有很多步骤
部分代码如下:
- timeout = 10
- target_domains = [
- 'item.taobao.com', # 淘宝精选
- 'detail.tmall.com', # 天猫精选
- 'chaoshi.detail.tmall.com', # 天猫超市
- 'detail.tmall.hk', # 天猫国际
- 'item.jd.com', # 京东商品页
- 're.jd.com', # 京东热卖
- 'mobile.yangkeduo.com', # 拼多多
- 'traveldetail.fliggy.com', # 飞猪
- 'www.xiaomiyoupin.com', # 小米有品
- 'product.suning.com', # 苏宁易购
- 'pin.m.suning.com', # 苏宁拼购
- ]
-
- def get_final_url(start_url, dev_url = 'http://127.0.0.1:9222'):
- try:
- browser = pychrome.Browser(url = dev_url)
- tab = browser.new_tab()
- eh = EventHandler(browser, tab)
- tab.start()
- tab.call_method("Fetch.enable")
- tab.set_listener("Fetch.requestPaused", eh.request_paused)
- tab.call_method("Page.navigate", url = start_url, _timeout = timeout)
- tab.wait(timeout)
- except Exception as e:
- print(e)
- finally:
- tab.stop()
- browser.close_tab(tab)
- return urllib.parse.unquote(tab.final_url)
- # 转链
- def zl(start_url):
- aff_url = None
- try:
- final_url = get_final_url(start_url, dev_url = 'http://127.0.0.1:9222')
- if 'jd.com' in final_url.lower():
- aff_url = jd.zl(final_url)
- elif 'taobao.com' in final_url:
- aff_url = tb.zl(final_url)
- elif 'tmall.com' in final_url:
- aff_url = tb.zl(final_url)
- elif 'yangkeduo.com' in final_url:
- final_url = final_url.replace('?goods_id', '&goods_id')
- aff_url = pdd.zl(final_url)
- else:
- pass
- except Exception as e:
- print(e)
- pass
- return aff_url
复制代码
另一个核心点就是怎么匹配关键词:
开始的时候我用了全文索引发现准确性不是很好,后来用来比较简单粗暴的办法
1. 读取所有有的关键词
2. 遍历关键词是否在优惠信息的标题中出现
3. 去重给对应的tg用户推送优惠信息
这个办法在20W数据量的情况下单次处理速度在1秒左右,还是能接受的。
以上就是抓取真正优惠信息,然后匹配关键词进行推送的核心部分。 |