抢火车票利器:分享一个抓取火车票转让信息的小程序

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 { get; set; }
//站点的网址
public string Url { get; set; }
//正则表达式
public string RegexPattern { get; set; }
//编码
public Encoding Encoding { get; set; }
//网站名称
public string Domain { get; set; }
//包含关键字
public string[] Keys { get; set; }
//取前面多少条
public int Numbers { get; set; }
public Site()
{
this.Numbers = 3;
}
}
}
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 { get; set; }
//站点的网址
public string Url { get; set; }
//正则表达式
public string RegexPattern { get; set; }
//编码
public Encoding Encoding { get; set; }
//网站名称
public string Domain { get; set; }
//包含关键字
public string[] Keys { get; set; }
//取前面多少条
public int Numbers { get; set; }
public Site()
{
this.Numbers = 3;
}
}
}
每年都用这个抢到票了,今天也不例外,分享给大家:
1. 里面的规则你可以自己添加,我已经写好了很多,你把网址里德车次改下就行了
2. 初始化会抓取最新的信息,但是不弹出网页,你可以在控制台输入id号,弹出对应id号的网址
3. 后面会自动循环捕获每个站点的新信息,并弹出网页
快就一个字,希望大家都能买到火车票,安心回家
标签:
火车票
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验