Maison 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,如果你们有好的想法,也可以来告诉我,我把他采集下来,供大家参考 ^_^


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Porce de variable PHP expliquée
4 Il y a quelques semaines By 百草
Conseils pour écrire des commentaires PHP
4 Il y a quelques semaines By 百草
Commentant le code en php
4 Il y a quelques semaines By 百草
<🎜>: Grow A Garden - Guide complet des marchands itinérants
3 Il y a quelques semaines By Jack chen

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1510
276
Github: découvrir, partager et contribuer au code Github: découvrir, partager et contribuer au code May 08, 2025 am 12:26 AM

GitHub est la plate-forme préférée pour les développeurs pour découvrir, partager et contribuer du code. 1) Trouvez des bases de code spécifiques via des fonctions de recherche, telles que les projets Python. 2) Créez un référentiel et poussez le code pour partager avec les développeurs du monde entier. 3) Participer à des projets open source et contribuer du code via Fork et PullRequest.

Extraits de texte sublime: créer des blocs de code réutilisables pour l'efficacité Extraits de texte sublime: créer des blocs de code réutilisables pour l'efficacité Apr 02, 2025 pm 02:08 PM

SublimeTextsNippets est un modèle de code prédéfini qui insère rapidement le code via des touches de raccourci ou déclenchez des mots pour améliorer l'efficacité de la programmation. 1. Créer des extraits: basé sur le format XML, stocké dans le fichier .sublime-snippet. 2. Utilisez l'exemple: entrez un mot de déclenchement tel que "DEF" ou "HTML5" et appuyez sur la touche Tab pour générer automatiquement la structure du code. 3. Évitez les erreurs: assurez-vous que les mots de déclenchement sont uniques, définissez la portée correcte et gardez le format XML correct.

Partage de code Horizon 2 West Cradle of Echoes Partage de code Horizon 2 West Cradle of Echoes Mar 29, 2024 pm 05:06 PM

Lorsque les joueurs jouent à Horizon 2 West, ils doivent vérifier la console et saisir un code dans la dixième mission principale "Cradle of Echoes". De nombreux joueurs ne savent pas quel est le code, et le code de la console est 237. Réponse de partage de code d'Horizon 2 West : Cradle of Echoes : 237. 1. La console utilisera 236 pour confondre le joueur. En fait, ce qui est vraiment nécessaire, c'est le numéro caché 237. 2. Le code peut être trouvé à partir du [Signal de détresse. ] point de données, dans Val le signalera également lors de l'interaction avec la console. 3. Une saisie incorrecte entraînera un conteneur vide. 4. Touchez le tableau-notebook-point de données-texte point de données-tâche-appel pour obtenir de l'aide, et enfin vous pouvez voir 237 affiché sous les coordonnées.

Partage de code d'interface logistique de centre commercial : la technologie PHP réalise la fonction d'impression rapide des lettres de transport ! Partage de code d'interface logistique de centre commercial : la technologie PHP réalise la fonction d'impression rapide des lettres de transport ! Sep 12, 2023 am 09:24 AM

Partage de code d'interface logistique de centre commercial : la technologie PHP réalise la fonction d'impression rapide des lettres de transport ! Avec le développement rapide du commerce électronique, la logistique des centres commerciaux est devenue un élément indispensable de la plateforme de commerce électronique. Pour les commerçants, un système logistique efficace peut améliorer l’expérience d’achat des utilisateurs, accroître leur fidélité et ainsi générer davantage d’opportunités de vente. En termes de réalisation de la fonction d'impression rapide des lettres de transport, la technologie PHP peut présenter un avantage considérable. En tant que langage de script open source et gratuit, PHP est largement utilisé dans le développement de sites Web et d’applications. Il a une syntaxe simple et facile

Comment utiliser la fonctionnalité des extraits de texte sublime pour créer des modèles de code réutilisables? Comment utiliser la fonctionnalité des extraits de texte sublime pour créer des modèles de code réutilisables? Jul 08, 2025 am 12:33 AM

La fonction d'extrait de code de SublimeText peut améliorer l'efficacité du codage via des modèles prédéfinis. Les étapes spécifiques sont: 1. Créez un nouveau fragment via des outils> Developer> Newsnippet ..., remplacez l'espace réservé dans le modèle et enregistrez-le dans le dossier par défaut; 2. Utilisez le mot de déclenchement et la touche TAB dans le code pour insérer rapidement les structures communes, telles que la saisie de HTMLBase pour générer un cadre de base HTML5; 3. Vous pouvez ajouter des variables et des espaces réservés au fragment, tels que la définition de $ {1: functionname}, $ {2: arguments} et d'autres balises lors de la définition de modèles de fonction JavaScript pour atteindre une personnalisation rapide; 4. Les fragments définis par l'utilisateur sont stockés dans Packag par défaut

Comment utiliser des extraits de code dans le texte sublime? Comment utiliser des extraits de code dans le texte sublime? Jul 12, 2025 am 12:46 AM

L'utilisation de la fonction d'extrait de code de SublimeText peut insérer des codes couramment utilisés via des mots de déclenchement rapides, améliorant considérablement l'efficacité du codage. Pour créer un fragment personnalisé, effectuez les étapes suivantes: 1. Cliquez sur Outils> Developer> Newsnippet…; 2. Définissez le contenu et déclenchez des mots dans le modèle; 3. Enregistrez-le en tant que fichier .Sublime-Snippet dans le dossier Packages / utilisateur. Par exemple, après être entré DivC, en appuyant sur la touche TAB peut insérer une balise HTMLDIV avec des espaces réservés de classe et de contenu. De plus, vous pouvez afficher le type de fichier actuel en ouvrant le panneau de commande (CTRL Shift P) et en entrant "insertsnippet"

Comment utiliser des extraits de code dans le code vs? Comment utiliser des extraits de code dans le code vs? Jul 15, 2025 am 01:46 AM

La méthode pour appeler rapidement l'extrait de code intégré dans VScode consiste à saisir le mot de déclenchement et à appuyer sur la touche onglet, comme pour ou CLG; Vous pouvez saisir "insertsnippet" via le panneau de commande pour afficher les fragments pris en charge par la langue actuelle; Pour ajouter des extraits de code personnalisés, vous devez ouvrir les paramètres de l'extrait de code utilisateur, puis sélectionner la langue et modifier le fichier JSON pour ajouter un nouveau modèle; Vous pouvez utiliser le compte GitHub pour synchroniser les paramètres pour réaliser le partage croisé des extraits de code; La maîtrise de ces techniques peut améliorer considérablement l'efficacité du codage.

Comment utiliser des extraits de code dans le code vs Comment utiliser des extraits de code dans le code vs Aug 11, 2025 pm 08:17 PM

Utilisez des extraits de code intégrés: entrez le mot de déclenchement dans le fichier de langage correspondant (tel que la saisie pour JavaScript et appuyez sur la touche Tab pour générer une boucle pour une boucle, et entrez! Dans HTML et appuyez sur l'onglet pour générer un modèle HTML5) et identifiez les fragments disponibles via l'icône du puzzle dans Intelligence; 2. Créez un fragment personnalisé: sélectionnez "Configurer l'extrait de code utilisateur" via le panneau de commande (Ctrl Shift P ou CMD Shift P), et créez des fragments de langues globales ou spécifiques, et définissez le nom, le préfixe, le contenu et la description dans le fichier JSON ouvert; 3. La structure des fragments comprend le préfixe (mot de déclenchement), le corps (insérer le code et utiliser 1 $, 2 $, etc. pour représenter le point de saut, et 0 $ est la position finale

See all articles