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

摘要:
使用System.Linq;使用System.Text;使用System.Threading;使用System.Text.RegularExpression;zhuti=t189&RegexPattern=@“”><
抢火车票利器:分享一个抓取火车票转让信息的小程序第1张抢火车票利器:分享一个抓取火车票转让信息的小程序第2张代码
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="http://t.zoukankan.com/aaa6818162-p-1943532.html"/(.*?)"">(.*?)</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="http://t.zoukankan.com/aaa6818162-p-1943532.html"/(.*?)"">(.*?)</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="http://t.zoukankan.com/aaa6818162-p-1943532.html"(.*)"">(.*)</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="http://t.zoukankan.com/aaa6818162-p-1943532.html"(.*)"">(.*)</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="http://t.zoukankan.com/aaa6818162-p-1943532.html"(.*)"">(.*)</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="http://t.zoukankan.com/aaa6818162-p-1943532.html"(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="http://t.zoukankan.com/aaa6818162-p-1943532.html"(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;
        }
    }
}

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

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

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

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

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

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

免责声明:文章转载自《抢火车票利器:分享一个抓取火车票转让信息的小程序》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android 4 学习(19):Serviceswindows Hook 消息分类下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Mysql 修改数据库,mysql修改表类型,Mysql增加表字段,Mysql删除表字段,Mysql修改字段名,Mysql修改字段排列顺序,Mysql修改表名

对于已经创建好的表,尤其是已经有大量数据的表,如果需要对表做一些结构上的改变,我们可以先将表删除(drop),然后再按照新的表定义重建表。这样做没有问题,但是必然要做一些额外的工作,比如数据的重新加载。而且,如果有服务在访问表,也会对服务产生影响。因此,在大多数情况下,表结构的更改一般都使用alter table 语句,以下是一些常用的命令。 (1) 修改...

Android中怎样自己制作su

本文原博客:http://hubingforever.blog.163.com/blog/static/171040579201372915716149/ 在Android源代码的systemextras(比方Android4.0systemextras)下新建一个文件夹。比方su_robin文件夹 在su_robin文件夹下包括以三个文件: su.h...

HDU-2647 Reward(链式前向星+拓扑排序)

Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16602 Accepted Submission(s): 5308 Problem Description Dandelion's unc...

script执行顺序

一、head区的script会优先于body区的script执行 Copy code 实例:Head区script代先于body区的script执行 二、关于变量,与书写的顺序有关,必须先声明才可引用: 三、关于函数的定义与执行: 1.如果函数的定义与函数的执行,是位于同一Script标签内,则函数的执行与二者位置顺序无关,即以下两则代码都能正常执行:...

c语言_头文件_windows.h

概述 Win32程序的开头都可看到: #include <windows.h> WINDOWS.H是一个最重要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件。这些头文件中最重要的和最基本的是: WINDEF.H 基本数据类型定义。 WINNT.H 支持Unicode的类型定义。 WINBASE.H Kernel(...

AndroidManifest.xml文件详解(uses-feature)

http://blog.csdn.net/think_soft/article/details/7596796 语法(SYNTAX): <uses-featureandroid:name="string"              android:required=["true" | "false"]               android:gl...