sohighthesky
之前无事写了个 城市公交数据下载,周末没事,看到里面有留言说没有昆明的,就想要是能下载全国的数据不是更好,于是就写出来了:
  • 1. 支持更多的城市,包括全国440个城市,查看
  • 2. 多线程下载,
  • 3. 使用独立存储器保存序列化后的城市列表,这样只有首次打开需要下载列表
下面是我实现这个的过程,与大家分享:

1.找数据目标网站

在百度里输入“全国公交查询”,第一个http://old.8684.cn/,打开一看全国的省和城市都在这里,还不错。

 

2.城市的所有公交列表


打开深圳的http://shenzhen.8684.cn/的,截图:


看到这样,没有像上次本地宝 那样,直接把全深圳的公交都列在这里,比较失望
终于 功夫不负有心人,终于在这里发现了点门道:


在这个标签页里,选择一个 线路种类后 在firebug里,可以看到ajax get请求http://shenzhen.8684.cn/city1.php?t=16/pp7,返回的数据为:
,长途18路,长途19路,长途58路,长途68路,长途328路,长5路,长7路,长9路,长10路,长16路,长21路,长28路,康11路,深惠城巴1线,深惠城巴2线,深莞城巴1线,深莞城巴2线
看样子,像是该种类下的所有公交线路,既然这样,获取所有的类别,然后请求ajax加载的页面不就可以获取到所有公交列表了吗
然后我在http://shenzhen.8684.cn/js/16.js这里找到了 公交线路的类别, 这样就可以获取城市的所有公交列表了
 

3.每条公交的具体数据获取


在上面的图中选择公交后,会将线路的名称放到放到上面的文本框,
另外我发现提交后页面的地址是根据线路的名称来的x_5cbfef9e(因为深圳的1路和别的城市1路,后面的相同
到这里我想到了2种方法来获取公交线程的数据:1.模拟表单post过去 ,2.线路具体的url根据是根据名称加密过来的,解开它就可以了
不过对这2种方法都不太满意,post的话,公交太多,可能效率比较低了,解密我又无从下手,
到这里好像陷入了僵局,不过办法总是有的,用firebug查看“线路搜索”按钮发现,其调用的是fsub(1)
然后在home.js里找到了fsub(1)方法,后面有location.href,然后其实际的地址是so.php?k=pp&q=1路,后面的其实就是公交线路的名称了
再加上之前获得的所有线路列表,所有公交数据就可以下载来了,
 

4.其它说明:


a.在程序中访问这个so.php?k=pp&q=1路地址时,后面的参数需要使用gb2312编码
b.像北京,等,有时的会出现模糊的结果,所以程序中判断,如果没有匹配到ul中的p,就重新查找其它的a标签,直接找构造具体的地址来获取
c.有浙江-慈溪 这种小城市 跟别的不一样,需要特殊对待
 

5.待解决问题,

希望有兴趣的高手能指点下:
a.程序中使用了线程池,不知道能停止线程池中的线程
b.另外使用了20个线程,但是使用360的流量查看,发现实际连接的还是只有2到3个线程
c.独立存储器不知道怎样能判断其创建或者访问时间,这样可以过一个星期(或者更长)后更新城市列表

最后:
程序下载
C#源码下载 (csdn的,不需要下载分) (此软件可能因为年代久远,无法抓取到数据
界面:

分类:

技术点:

相关文章: