惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
U
Unit 42
MyScale Blog
MyScale Blog
B
Blog
阮一峰的网络日志
阮一峰的网络日志
量子位
IT之家
IT之家
The GitHub Blog
The GitHub Blog
F
Fortinet All Blogs
Recent Announcements
Recent Announcements
V
Visual Studio Blog
G
Google Developers Blog
Last Week in AI
Last Week in AI
雷峰网
雷峰网
博客园 - 聂微东
博客园 - 叶小钗
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
博客园 - 司徒正美
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
月光博客
月光博客
aimingoo的专栏
aimingoo的专栏

博客园 - guozili

分享12306抢票心得-终极秒杀思路篇 分享12306抢票心得-最终篇 分享12306全自动验证码识别提交,春运抢票准备时 分享“12306 P2P平台”创业Idea 分享12306秒票杀手锏源码 分享12306秒票心得及杀手锏 分享基于EF+MVC+Bootstrap的通用后台管理系统及架构 分享基于EF+WCF的通用三层架构及解析 基于Silverlight的快速开发框架RapidSL新特性解析 分享基于silverlight的仿“百度文库”的文档控件 分享基于silverlight的一个“树形结构图”控件 基于 Silverlight的快速开发框架RapidSL新版改进源码 基于 Silverlight的快速开发框架RapidSL之MVVM解析 基于Silverlight的快速开发框架RapidSL之开源 分享基于silverlight的一个大文件上传控件 基于 Silverlight的精简框架之版本升级及使用 基于 Silverlight的精简框架之版本和控件更新 Silverlight project demos for MSRA in 2009,to look forward to silverlight's furture 异步编程练习
抢火车票利器:分享一个抓取火车票转让信息的小程序
guozili · 2011-01-19 · via 博客园 - guozili

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.ComponentModel;
using System.Threading;
using System.Text.RegularExpressions;
using System.Diagnostics;namespace HuoChePiao
{
    
class Program
    {
        
private static HashSet<string> results;
        
private static WebClient wc;
        
private static List<Site> sites;
        
private static int index;
        
private static bool isFirstRound;
        
        
static void Main(string[] args)
        {
            sites 
= new List<Site>();
            
            sites.Add(
new Site()
            {
                Name 
= "火车票网",
                Url 
= "http://www.huochepiao.com/City/SearchCheCi.asp?leixing=%D7%AA%C8%C3&zhuti=t189&psearch=%C7%F3%B9%BA%2F%D7%AA%C8%C3%BC%EC%CB%F7",
                RegexPattern 
= @"· <A href=(.*?) target=_blank>(.*?)</a>",
                Encoding 
= Encoding.Default
            });
            
            sites.Add(
new Site()
            {
                Name 
= "百姓网",
                Url 
= "http://beijing.baixing.com/huochepiao/?%E8%BD%A6%E6%AC%A1=T189",
                RegexPattern 
= @""" ><a href=""/(.*?)"">(.*?)</a></td>",
                Encoding 
= Encoding.UTF8,
                Domain 
= "http://beijing.baixing.com/",
                Keys 
= new string[] { "" }
            });

            sites.Add(

new Site()
            {
                Name 
= "百姓网",
                Url 
= "http://beijing.baixing.com/huochepiao/?%E8%BD%A6%E6%AC%A1=T5",
                RegexPattern 
= @""" ><a href=""/(.*?)"">(.*?)</a></td>",
                Encoding 
= Encoding.UTF8,
                Domain 
= "http://beijing.baixing.com/",
                Keys 
= new string[] { "" }
            });
   
            sites.Add(
new Site()
            {
                Name 
= "酷讯网",
                Url 
= "http://huoche.kuxun.cn/zhuanrang-checi-beijing-T189.html?type=1",
                RegexPattern 
= @"<span class=""col_11 left""><a target=""_blank"" href=""(.*)"">(.*)</a>",
                Encoding 
= Encoding.UTF8
            });

            sites.Add(

new Site()
            {
                Name 
= "酷讯网",
                Url 
= "http://huoche.kuxun.cn/zhuanrang-checi-beijing-T5.html?type=1",
                RegexPattern 
= @"<span class=""col_11 left""><a target=""_blank"" href=""(.*)"">(.*)</a>",
                Encoding 
= Encoding.UTF8
            });

            sites.Add(

new Site()
            {
                Name 
= "酷讯网",
                Url 
= "http://huoche.kuxun.cn/zhuanrang-checi-beijing-k185.html?type=1",
                RegexPattern 
= @"<span class=""col_11 left""><a target=""_blank"" href=""(.*)"">(.*)</a>",
                Encoding 
= Encoding.UTF8
            });

            sites.Add(

new Site()
            {
                Name 
= "清华网",
                Url 
= "http://www.newsmth.net/bbsbfind.php?q=1&board=Ticket&title=T189&title3=%C7%F3&dt=1",
                RegexPattern 
= @"<a href=""(bbscon.php.*)"">(.*)</a>",
                Encoding 
= Encoding.Default,
                Domain 
= "http://www.newsmth.net/"
            });

            sites.Add(

new Site()
            {
                Name 
= "清华网",
                Url 
= "http://www.newsmth.net/bbsbfind.php?q=1&board=Ticket&title=K185&title3=%C7%F3&dt=1",
                RegexPattern 
= @"<a href=""(bbscon.php.*)"">(.*)</a>",
                Encoding 
= Encoding.Default,
                Domain 
= "http://www.newsmth.net/"
            });
            
            results 
= new HashSet<string>();

            isFirstRound 

= true;

            wc 

= new WebClient();
            wc.Encoding 
= sites[index].Encoding;

            wc.DownloadStringCompleted 

+= new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
            wc.DownloadStringAsync(
new Uri(sites[index].Url));int order;         
            
while (int.TryParse(Console.ReadLine(), out order))
            {
                OpenLink(results.ElementAt(order 
- 1));
                Console.ForegroundColor 
= ConsoleColor.Green;
            }
        }
static void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            
int i = 0;
            
            MatchCollection mc 
= Regex.Matches(e.Result, sites[index].RegexPattern);
            
foreach (Match m in mc)
            {
                
if (m.Success)
                {
                    
string result = sites[index].Domain + m.Groups[1].Value;
                    
string content = m.Groups[2].Value;
                    
if (!results.Contains(result))
                    {
                        
bool isContainKey = true;
                        
if (sites[index].Keys != null)
                        {
                            
foreach (string key in sites[index].Keys)
                            {
                                
if (!content.Contains(key))
                                {
                                    isContainKey 
= false;
                                    
break;
                                }
                            }
                        }
if (!isContainKey)
                            
continue;

                        results.Add(result);

                        Console.ForegroundColor 

= isFirstRound ? ConsoleColor.Gray : ConsoleColor.White;

                        Console.WriteLine(

"{0} <{1}>  {2}.  {3}", DateTime.Now.ToShortTimeString(), sites[index].Name, results.Count, m.Groups[2].Value);if (!isFirstRound)
                        {
                            OpenLink(result);
                        }               
                    }
                }
if (i++ > sites[index].Numbers - 2)
                    
break;
            }

            Thread.Sleep(

1000);

            index 

= index + 1;
            
if (index == sites.Count)
            {
                index 
= 0;if (isFirstRound)
                    isFirstRound 
= false;
            }

            wc.Encoding 

= sites[index].Encoding;
            wc.DownloadStringAsync(
new Uri(sites[index].Url));
        }
static void OpenLink(string url)
        {
            Process.Start(url, 
"_blank");
        }
    }
public class Site
    {
        
//站点名称
        public string Name { getset; }
        
//站点的网址
        public string Url { getset; }
        
//正则表达式
        public string RegexPattern { getset; }
        
//编码
        public Encoding Encoding { getset; }
        
//网站名称
        public string Domain { getset; }
        
//包含关键字
        public string[] Keys { getset; }
        
//取前面多少条
        public int Numbers { getset; }public Site()
        {
            
this.Numbers = 3;
        }
    }
}

 

每年都用这个抢到票了,今天也不例外,分享给大家:

1. 里面的规则你可以自己添加,我已经写好了很多,你把网址里德车次改下就行了

2. 初始化会抓取最新的信息,但是不弹出网页,你可以在控制台输入id号,弹出对应id号的网址

3. 后面会自动循环捕获每个站点的新信息,并弹出网页

快就一个字,希望大家都能买到火车票,安心回家