用matlab爬取火车票信息

一个人想着一个人 提交于 2020-12-25 14:01:05



前一段时间小编使用matlab爬取火车票信息,小编觉得这个爬取过程还蛮有趣的,所以和大家分享一下如何用matlab爬取火车票信息。
比如我想要获取以下这些车次的始发站终点站信息,

大家第一反应可能会是这多简单,去12306逐个搜索不久好了么。但是当我要查询成百上千个车次的始发站终点站信息时,我们很显然就不能手动逐个搜索了,所以这时就可以通过matlab爬取各个车次的始发站和终点站信息。小编使用爬取的网站是http://search.huochepiao.com/,网站界面如下。

如果小编想要查询G529车次的信息,
此时的网址为http://search.huochepiao.com/chaxun/resultc.asp?txtCheci=G529&cc.x=0&cc.y=0
其实各位细心的小伙伴也许发现如果查询G1204车次的信息,那么查询网址会变成
http://search.huochepiao.com/chaxun/resultc.asp?txtCheci=G1204&cc.x=0&cc.y=0

然后右击查看该界面源代码信息,

然后查询到显示始发站终点站的源代码

小编想要截取<td align="center">……</td>之间的始发站和终点站信息,但是整个显示页面的源代码中有<td align="center">……</td>这种形式多达60多个,不过<td align="center">北京西</td>和<td>北海</td>处于前两位,可以便于提取这两个站的信息。不过如果要提取这种形式之间的内容,则需要匹配正则表达式,matlab匹配正则表达式使用regexp这个函数,小编是这么使用的:



    
    
expr1 = '<td align="center">(\w*\.?\w*)</td>';                                  %要提取的模式,()中为要提取的内容
[stationfile, station_tokens]= regexp(sourcefile, expr1, 'match''tokens');    %match返回整个匹配类型,token返回()标记的位置,都为元胞类型
小编觉得tokens很强大,各位小伙伴可以再深入学习一下。
代码中的station_tokens包含这种模式下所有内容,但我们只需要始发站和终点站信息,即前两个元素,所以只需要提取前两个元素即可。

接下来小编附上爬取上述25个车次始发站和终点站信息的matlab源代码,
在爬取的过程中,小编需要强调的是要保持网络畅通,方能爬取

    
    
clc;
clear;
warning off;
[data1,str] = xlsread('\需要爬取的车次.xlsx','Sheet1');                             %导入表格中需要爬取的车次信息
str=str(:,1);
str=str(2:end);                                                                     %提取需要查询的车次信息
%% 循环查询各个车次始发站和终点站信息
for train = 1:size(str,1)
    str1='抓取';
    str2=strtrim(str{train});                                                       %删除字符串制表符
    str3='数据中...';
    str4=[str1,str2,str3];
    fprintf(str4)
    partURL1 = 'http://search.huochepiao.com/chaxun/resultc.asp?txtCheci=';
    partURL2 = str2;
    partURL3 = '&cc.x=0&cc.y=0';
    fullURL=[partURL1,partURL2,partURL3];
    [sourcefile, status] = urlread(sprintf(fullURL),'Charset','GBK');               %urlread函数可以读取网页
    if ~status                                                                      %判断数据是否全部读取成功
        error('出问题了哦,请检查\n')
    end
    expr1 = '<td align="center">(\w*\.?\w*)</td>';                                  %要提取的模式,()中为要提取的内容
    [stationfile, station_tokens]= regexp(sourcefile, expr1, 'match''tokens');    %match返回整个匹配类型,token返回()标记的位置,都为元胞类型
    % 如果能抓取到高铁信息
    if ~isempty(station_tokens)
        station_tokens=station_tokens(1:2);                                         %只截取始发站和终点站数据
        station = cell(size(station_tokens));                                       %创建一个等大的元胞数组
        for idx = 1:length(station_tokens)
            station{idx} = station_tokens{idx}{1};                                  %将始发站和终点站数据写入
        end
        sheet = 'Sheet1';                                                           %工作表名称
        left=['B',num2str(train+1)];
        right=['C',num2str(train+1)];
        range = sprintf([left,':',right]);                                          %从源文件中获取的目标数据的放置范围
        xlswrite('\需要爬取的车次.xlsx', station, sheet, range);                    %将查询到的车次始发站和终点站信息写入表格中
        fprintf('完成!\n')
    end
end
fprintf('全部完成!数据保存在站次信息表格中,请注意查看!\n')

爬取过程如下所示:

最后将各车次的始发站和终点站信息全写进“需要爬取的车次.xlsx”文件中。
微信扫描下方二维码即可提取代码:

本文分享自微信公众号 - 优化算法交流地(ROSECW123)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!