首页 php教程 PHP源码 用 PHP 爬虫做旅游数据分析

用 PHP 爬虫做旅游数据分析

Nov 11, 2016 pm 03:15 PM

随着物质的提高,旅游渐渐成为人们的焦点,火热的国庆刚刚过去,乘着这股余热,我想很多人都想知道,大家一般会去哪里玩呢,于是我花了10分钟写了一个采集马蜂窝游记的小程序,当然速度能有这么快,完全依赖于PHP著名爬虫框架phpspider。

国际惯例,我们先来看看代码怎么写,算作抛砖引玉吧 ^_^

马蜂窝不同于常规网站,因为并发量高并且某些数据需要实时,比如观看人数,点赞人数,所以网站多处使用了Ajax,而Ajax对于普通采集者来说,是个比较大的问题。

观察了一下马蜂窝网站,最终确定了采集路线:

获取热门城市 -> 获取城市下的游记列表 -> 获取游记内容 -> 提取游记内容的游记标题、城市、出发时间等,接下来我们用三个步骤来实现它。。。

1、获取热门城市


http://www.mafengwo.cn/mdd/citylist/21536.html

1.jpg

首先我们要采集下这些热门城市

2.jpg

当我们点击页数的时候,发现他的数据是Ajax加载的,末页是297,而且使用的是POST方法

3.jpg

提交的参数如下:

6941baebjw1f8rmgwk7dpj208t01k0sl.jpg

很明显这个page就是页数了,这里就有个问题,phpspider框架是有 URL 去重机制的,POST的话URL只有一个,但是query_string是不影响POST数据的,我们可以在后面加上 ?page=1|2|3…,所以我们代码可以这么写:

设置列表页规则:

'list_url_regexes' => array(
    "http://www.mafengwo.cn/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、获取热门城市下的游记列表

点击进入一个城市后,我们可以看到他下面的游记列表

6941baebjw1f8rmgwansyj20su0la44t.jpg

当然和上面一样,也是Ajax加载的,我们可以打开chrome的开发者工具,点击Network,然后随意点击一个分页得到Ajax的URL:

4.jpg

和城市列表一样,也是POST,参数如下:

5.png

很明显page就是页数了,当然我们直接通过POST方式访问Ajax地址:

http://www.mafengwo.cn/gonglve/ajax.php?act=get_t…

是直接报错的,他需要来路,综合以上,我们代码可以这么来写:

首先我们要在 on_start 回调函数里面加上来路URL

$spider->on_start = function($phpspider)
{
    $phpspider->add_header('Referer','http://www.mafengwo.cn/mdd/citylist/21536.html');
};
登录后复制

和上面获取城市列表一样,设置列表匹配规则:

'list_url_regexes' => array(
    "http://www.mafengwo.cn/gonglve/ajax.php?act=get_travellist&mddid=d+", 
)
登录后复制

然后在 on_list_page 回调里面判断如果是第一页就获取总页数,然后循环入队列:

preg_match(&#39;#<span class="count">共<span>(.*?)</span>页#&#39;, $data_page, $out);
for ($i = 0; $i < $out[1]; $i++) 
{
    $v = $page[&#39;request&#39;][&#39;fields&#39;][&#39;mddid&#39;];
    $url = "http://www.mafengwo.cn/gonglve/ajax.php?act=get_travellist&mddid={$v}&page={$i}";
    $options = array(
        &#39;url_type&#39; => $url,
        &#39;method&#39; => &#39;post&#39;,
        &#39;fields&#39; => array(
            &#39;mddid&#39;=>$v,
            &#39;pageid&#39;=>&#39;mdd_index&#39;,
            &#39;sort&#39;=>1,
            &#39;cost&#39;=>0,
            &#39;days&#39;=>0,
            &#39;month&#39;=>0,
            &#39;tagid&#39;=>0,
            &#39;page&#39;=>$i,
        )
    );
    // 游记列表页URL入队列
    $phpspider->add_url($url, $options);
}
登录后复制

通过上面两个步骤,我们就把所有热门城市下的游记列表都放入到了队列,接下来我们进行第三步,从这些列表里面获取内容页URL,然后提取内容。

3、获取热门城市下的游记列表

在 on_list_page 方法里面会得到列表页的内容,从这些内容里面我们可以提取内容页的URL

// 获取内容页
preg_match_all(&#39;#<a href="/i/(.*?).html" target="_blank">#&#39;, $html, $out);
if (!empty($out[1])) 
{
    foreach ($out[1] as $v) 
    {
        $url = "http://www.mafengwo.cn/i/{$v}.html";
        // 内容页URL入队列
        $phpspider->add_url($url);
    }
}
登录后复制

下来我们来配置field提取内容页字段

&#39;fields&#39; => array(
    // 标题
    array(
        &#39;name&#39; => "name",
        &#39;selector&#39; => "//h1[contains(@class,&#39;headtext&#39;)]",
        &#39;required&#39; => true,
    ),
    // 分类
    array(
        &#39;name&#39; => "city",
        &#39;selector&#39; => "//div[contains(@class,&#39;relation_mdd&#39;)]//a",
        &#39;required&#39; => true,
    ),
    // 出发时间
    array(
        &#39;name&#39; => "date",
        &#39;selector&#39; => "//li[contains(@class,&#39;time&#39;)]",
        &#39;required&#39; => true,
    ),
)
登录后复制

设计一张数据表:

5.jpg

当然我们还可以获取游记的浏览量、收藏、分享、置顶、游玩金额等等,太多了,方法类似。

到此程序就设计完了,总共不到200行的代码,得益于phpspider自带了多进程采集功能,数据很快就采集完成,总共7W多点。

6.jpg

7.jpg

得到这些数据以后,我们能干什么呢?!

Top10 旅游城市分别是

8.jpg

可以看得出,云南是一个好地方,也是博主日夜思念的地方啊。。。

五一和国庆期间旅游城市占比

9.jpg

10.jpg

可以看得出,五一的时候大家喜欢去西藏玩,国庆却更青睐青岛,好吧,这两个地方博主都没去过,表示好受伤~_~!

接下来我们来看看这一年来北京和杭州的旅游旺季

11.jpg

可以看出七八月份去北京的人会比较多,这个时候北京是最爽的,不热也不冷,博主就曾经有有一年8月份去的北京,舒服死了^_^

我们再来看看杭州

12.jpg

看得出3月底到4月中旬是杭州适合游玩的季节啊,那时候春暖花开,天气也不错,听说太子湾公园每年那时候都会有樱花和郁金花展,非常美,艾玛旅游病又犯了~_~!

好吧文章到此就结束了,其实还想分析更多,比如采集热门路线啊,热门景点啊,热门图集啊,还有旅游路线的价位啊,最终形成一个旅游的APP,如果你们有好的想法,也可以来告诉我,我把他采集下来,供大家参考 ^_^


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)