12306余票高效查询--clojure实现

写在前面

参考 https://www.cnblogs.com/guozili/p/6144561.html
由于各地CDN节点Cache更新存在时差,所以批量查询全国12306 CDN节点,找到最快的节点获取购票的必要信息。
该文章主要用户学习使用clojure并发获取网络资源,仅限用于学习。
本篇不涉及具体源码,只记录工具、方法。

主要方法

获取CDN节点

根据摸索,大约有两种方式:

  1. 直接使用站长工具->ping测试获取各个地方ping域名,该方式简单粗暴,但是可能不同时间ping获取的IP不一致。
  2. 利用DNS协议,直接向全国各地DNS服务请求获取指定域名的A记录,该方式可以获取较全面的CDN节点,实现较为复杂。

请求指定CDN节点

参考文章中作者使用.NET语言,其中细节可能不适用。
找到类似问题:
https://stackoverflow.com/questions/7648872/can-i-override-the-host-header-where-using-javas-httpurlconnection-class
其中提到可以使用apache http client实现,而clj-http就是封装的apache http client。
所以只需将访问的url中域名替换为具体的CDN节点IP,然后在请求的Header中带上Host: xxx.com即可。

批量获取

多线程并发获取,目标只是获取最快成功的。
使用clojure.core.async中的channelalts!!可以满足我们的需求。
参考示例:
https://github.com/clojure/core.async/blob/master/examples/walkthrough.clj

;; Since go blocks are lightweight processes not bound to threads, we
;; can have LOTS of them! Here we create 1000 go blocks that say hi on
;; 1000 channels. We use alts!! to read them as they're ready.

(let [n 1000
      cs (repeatedly n chan)
      begin (System/currentTimeMillis)]
  (doseq [c cs] (go (>! c "hi")))
  (dotimes [i n]
    (let [[v c] (alts!! cs)]
      (assert (= "hi" v))))
  (println "Read" n "msgs in" (- (System/currentTimeMillis) begin) "ms"))

使用工具

clojure相关库可以在 https://www.clojure-toolbox.com/ 查询。

http client

网上查找,发现两个比较受欢迎的库:clj-httphttp-kit。后者PR较好,于是先尝试其。
当涉及cookie相关发现支持并不是很好,于是查看clj-http,发现其是包装了org.apache.http.client.CookieStore

clj-http地址:https://github.com/dakrone/clj-http

core.async

参考资料:
https://morrxy.github.io/2016/08/02/brave-clojure-core-async/
http://clojuredocs.org/clojure.core.async/alts!!
https://segmentfault.com/a/1190000004314890

总结

通过对core.async的简单学习,学以致用,实现并发访问网络资源。

12306余票高效查询--clojure实现

原文地址:https://www.cnblogs.com/rainmote/p/8364819.html

时间: 2024-10-10 08:28:39

12306余票高效查询--clojure实现的相关文章

android 12306余票查询

android软件 可以查询动车余票 [1].[图片] 1.jpg 跳至 [1] [2] [3] [4] [5] [2].[图片] 2.jpg 跳至 [1] [2] [3] [4] [5] [3].[图片] 3.jpg 跳至 [1] [2] [3] [4] [5] [4].[图片] 4.jpg 跳至 [1] [2] [3] [4] [5] [5].[文件] 12306余票查询.rar ~ 1MB    下载(759) 跳至 [1] [2] [3] [4] [5]

抓取12306余票

目的:抓取12306余票随时间的变化规律,推导出12306的放票规则,从而能制定更好的抢票策略. 难点.问题: 准备抓取多少个站点 抓取的日期范围多大 如何储存数据.变量有查询开始站点.查询结束站点.出发日期. 数据分析.上面的数据足够多:比如整个预售期30天,乃至整年的数据,尤其是春运这个高峰期. 可能会遇到12306的反爬虫策略,具体问题到时具体分析.

铁路局12306余票查询的实现

离上次写的类似于铁道部12306城市选择框的实现过了都快一个月了,最近一直在忙,在学习sharepoint2013,虽然早就实现了12306的余票查询,但是一直没抽出时间来写,刚好这几天也快放假了,抽点时间写一下,不然都要拖到年后了啊... 先来看一下条件输入窗口: 这里的出发地和目的地是之前提到的城市选择框,加上一个DateTimePicker和一个Button,就做的简陋一点了哈,对界面挑剔的大牛可以绕道,不要伤害我幼小的心灵哟~ 然后我们分析一下12306查询余票的过程: 最直接的就是用c

Python:爬虫助你回家,12306余票监测!

写在前面 一年一度的春运即将来临,各位看官回家的票有没有买好呢?反正小编已经按捺不住激动的心情,开始蠢蠢欲动了.但是作为技术控,就应该有技术控的抢票姿态,鉴于12306逆天的验证码,小编放弃了控制12306自动抢票的骚操作,开始走向自动余票提醒:有余票=>微信推送余票信息的道路.   正文 以徐州到滕州为例,我们想爬取1月26号的余票信息,登录12306官网查询余票页面(https://kyfw.12306.cn/otn/leftTicket/init),在下图所示的红框内输入出发地.目的地以及

webpy 实例 12306余票查询

效果 main.py # -*- coding: utf-8 -*- import web import search urls = ( '/', 'Search', ) render = web.template.render('templates') class Search(): def GET(self): return render.search([]) def POST(self): x = web.input() data = search.getInfoByUrl(str(x['

php 通过API接口连接12306余票查询

<?php header("content-type:text/html;charset='utf-8'"); //设置编码 echo "<meta content='text/html; charset=utf-8' http-equiv='Content-Type'>"; //获取API传过来的信息 queryDate 时间 from_station 始发站编号 to_station 到达站编号 $url = "https://kyf

java抓取12306火车余票信息

最近在弄一个微信的公众帐号,涉及到火车票查询,之前用的网上找到的一个接口,但只能查到火车时刻表,12306又没有提供专门的查票的接口.今天突然想起自己直接去12306上查询,抓取查询返回的数据包,这样就可以得到火车票的信息.这里就随笔记一下获取12306余票的过程. 首先,我用firefox浏览器上12306查询余票.打开firefox的Web控制台,选上网络中的"记录请求和响应主体" 然后输入地址日期信息之后点击网页上的查询按钮,就能在Web控制台下看到网页请求的地址了: 就是图片中

从零实现一款12306抢票软件(一)

https://zhuanlan.zhihu.com/p/37101955 从零实现一款12306抢票软件(一) 张小方 公众号:easyserverdev.资深开发工程师,擅长客户端与高性能服务器的设计与架构. ?关注他 28 人赞了该文章 写在前面的话 每年逢年过节,一票难求读者肯定不陌生.这篇文章,我们带领读者从零实现一款12306刷票软件,其核心原理还是通过发送http请求模拟登录12306网站的购票的过程,最后买到票. 关于http请求的格式和如何组装http数据包给服务器发送请求,我

从零实现一款12306抢票软件

写在前面的话 每年逢年过节,一票难求读者肯定不陌生.这篇文章,我们带领读者从零实现一款12306刷票软件,其核心原理还是通过发送http请求模拟登录12306网站的购票的过程,最后买到票. 关于http请求的格式和如何组装http数据包给服务器发送请求,我们在上一篇文章<从零实现一个http服务器>中已经详细介绍过了,如果还不明白的朋友可以去那篇文章看下. 郑重申明一下:这里介绍的技术仅供用于学习,不可用于恶意攻击12306服务器,请勿滥用本文介绍的技术.对12306服务器造成的任何损失,后果