随着物质的提高,旅游渐渐成为人们的焦点,火热的国庆刚刚过去,乘着这股余热,我想很多人都想知道,大家一般会去哪里玩呢,于是我花了10分钟写了一个采集游记的小程序,当然速度能有这么快,完全依赖于PHP著名爬虫框架phpspider。
国际惯例,我们先来看看代码怎么写,算作抛砖引玉吧 ^_^。
1、获取热门城市
/mdd/citylist/21536.html。
首先我们要采集下这些热门城市。
当我们点击页数的时候,发现他的数据是Ajax加载的,末页是297,而且使用的是POST方法。
提交的参数如下:
POST的话URL只有一个,phpspider框架是有 URL 去重机制的,但是query_string是不影响POST数据的,很明显这个page就是页数了,这里就有个问题,我们可以在后面加上 ?page=1|2|3…,所以我们代码可以这么写:。
设置列表页规则:'list_url_regexes' => array(。
'/mdd/base/list/pagedata_citylist?page=d+',。
)
在入口回调函数入口所有城市列表:$spider->on_scan_page = function($page, $content, $phpspider)。
{
/上面Ajax分页的末页是297页。
for ($i = 0; $i $url,。
'method' => 'post',。
'fields' => array(。
'mddid'=>21536,。
'page'=>$i,。
)
);
/热点城市列表页URL入队列。
$phpspider->add_url($url, $options);。
}
};
2、获取热门城市下的游记列表
点击进入一个城市后,我们可以看到他下面的游记列表。
然后随意点击一个分页得到Ajax的URL:,也是Ajax加载的,点击Network,当然和上面一样,我们可以打开chrome的开发者工具。
和城市列表一样,也是POST,参数如下:。
很明显page就是页数了,当然我们直接通过POST方式访问Ajax地址:。
/gonglve/ajax.php?act=get_t…。
是直接报错的,他需要来路,综合以上,我们代码可以这么来写:。
首先我们要在 on_start 回调函数里面加上来路URL$spider->on_start = function($phpspider)。
{
$phpspider->add_header('Referer','/mdd/citylist/21536.html');。
};
和上面获取城市列表一样,设置列表匹配规则:'list_url_regexes' => array(。
'/gonglve/ajax.php?act=get_travellist&mddid=d+',。
)
然后在 on_list_page 回调里面判断如果是第一页就获取总页数,然后循环入队列:preg_match('#共(.*?)页#', $data_page, $out);。
for ($i = 0; $i < $out[1]; $i++)。
{
$v = $page['request']['fields']['mddid'];。
$url = '/gonglve/ajax.php?act=get_travellist&mddid={$v}&page={$i}';。
$options = array(。
'url_type' => $url,。
'method' => 'post',。
'fields' => array(。
'mddid'=>$v,。
'pageid'=>'mdd_index',。
'sort'=>1,。
'cost'=>0,。
'days'=>0,。
'month'=>0,。
'tagid'=>0,。
'page'=>$i,。
)
);
/游记列表页URL入队列。
$phpspider->add_url($url, $options);。
}
从这些列表里面获取内容页URL,我们就把所有热门城市下的游记列表都放入到了队列,然后提取内容,通过上面两个步骤,接下来我们进行第三步。
3、获取热门城市下的游记列表
在 on_list_page 方法里面会得到列表页的内容,从这些内容里面我们可以提取内容页的URL/获取内容页。
preg_match_all('##', $html, $out);。
if (!empty($out[1]))。
{
foreach ($out[1] as $v)。
{
$url = '/i/{$v}.html';。
/内容页URL入队列。
$phpspider->add_url($url);。
}
}
下来我们来配置field提取内容页字段'fields' => array(。
/标题
array(
'name' => 'name',。
'selector' => '//h1[contains(@class,'headtext')]',。
'required' => true,。
),
/分类
array(
'name' => 'city',。
'selector' => '//div[contains(@class,'relation_mdd')]//a',。
'required' => true,。
),
/出发时间
array(
'name' => 'date',。
'selector' => '//li[contains(@class,'time')]',。
'required' => true,。
),
)
设计一张数据表:
当然我们还可以获取游记的浏览量、收藏、分享、置顶、游玩金额等等,太多了,方法类似。
得益于phpspider自带了多进程采集功能,数据很快就采集完成,总共不到200行的代码,总共7W多点,到此程序就设计完了。
得到这些数据以后,我们能干什么呢。
Top10 旅游城市分别是。
云南是一个好地方,也是博主日夜思念的地方啊,可以看得出。
五一和国庆期间旅游城市占比。
好吧,表示好受伤~_~!,这两个地方博主都没去过,五一的时候大家喜欢去西藏玩,可以看得出,国庆却更青睐青岛。
接下来我们来看看这一年来北京和杭州的旅游旺季。
博主就曾经有有一年8月份去的北京,可以看出七八月份去北京的人会比较多,不热也不冷,舒服死了^_^,这个时候北京是最爽的。
我们再来看看杭州
看得出3月底到4月中旬是杭州适合游玩的季节啊,那时候春暖花开,天气也不错,听说太子湾公园每年那时候都会有樱花和郁金花展,非常美,艾玛旅游病又犯了~_~!。
比如采集热门路线啊,还有旅游路线的价位啊,好吧文章到此就结束了,如果你们有好的想法,热门景点啊,热门图集啊,我把他采集下来,其实还想分析更多,最终形成一个旅游的APP,也可以来告诉我,供大家参考 ^_^。
北京市卫健委 提醒,今日是国庆节假期最后一天,面临进返京高峰,出京旅行
“秋天的日子是半透明的 涂在金色的土地和田野上” 如果有一个季节,能让整
最美的风景在路上,最美的路上有风景。一条条公路串联湖北的名山大川、多彩
从靠山水到卖场景 从卖特产到拼创意 乡村旅游越来越好玩 “采摘”“收割”“
老君山两日自由行攻略,不抱团,自己做大巴或开车去攻略。有爬山和做索道两
旅游出行方式的简单比较 出游 方式 项目 比较 特点 优点 局限性 适合人群 适合
一年四季,寒来暑往,春夏秋冬,风景各有各的美。而自驾旅游的魅力,就在于
从北京海淀出发,自驾140公里左右,就可以看到另外一番天地。 这里是高山草
我们都是时间的旅行者, 为了寻找生命中的光。 终其一生,行走在漫长的旅途
原标题:三月赏花游 户外踏青走起 文、图/广州日报全媒体记者罗磊 通讯员柳