用 PHP 爬虫做旅游数据分析
随着物质的提高,旅游渐渐成为人们的焦点,火热的国庆刚刚过去,乘着这股余热,我想很多人都想知道,大家一般会去哪里玩呢,于是我花了10分钟写了一个采集马蜂窝游记的小程序,当然速度能有这么快,完全依赖于PHP著名爬虫框架phpspider。
国际惯例,我们先来看看代码怎么写,算作抛砖引玉吧 ^_^
马蜂窝不同于常规网站,因为并发量高并且某些数据需要实时,比如观看人数,点赞人数,所以网站多处使用了Ajax,而Ajax对于普通采集者来说,是个比较大的问题。
观察了一下马蜂窝网站,最终确定了采集路线:
获取热门城市 -> 获取城市下的游记列表 -> 获取游记内容 -> 提取游记内容的游记标题、城市、出发时间等,接下来我们用三个步骤来实现它。。。
1、获取热门城市
首先我们要采集下这些热门城市
当我们点击页数的时候,发现他的数据是Ajax加载的,末页是297,而且使用的是POST方法
提交的参数如下:
很明显这个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、获取热门城市下的游记列表
点击进入一个城市后,我们可以看到他下面的游记列表
当然和上面一样,也是Ajax加载的,我们可以打开chrome的开发者工具,点击Network,然后随意点击一个分页得到Ajax的URL:
和城市列表一样,也是POST,参数如下:
很明显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('#<span class="count">共<span>(.*?)</span>页#', $data_page, $out); for ($i = 0; $i < $out[1]; $i++) { $v = $page['request']['fields']['mddid']; $url = "http://www.mafengwo.cn/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('#<a href="/i/(.*?).html" target="_blank">#', $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提取内容页字段
'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, ), )
设计一张数据表:
当然我们还可以获取游记的浏览量、收藏、分享、置顶、游玩金额等等,太多了,方法类似。
到此程序就设计完了,总共不到200行的代码,得益于phpspider自带了多进程采集功能,数据很快就采集完成,总共7W多点。
得到这些数据以后,我们能干什么呢?!
Top10 旅游城市分别是
可以看得出,云南是一个好地方,也是博主日夜思念的地方啊。。。
五一和国庆期间旅游城市占比
可以看得出,五一的时候大家喜欢去西藏玩,国庆却更青睐青岛,好吧,这两个地方博主都没去过,表示好受伤~_~!
接下来我们来看看这一年来北京和杭州的旅游旺季
可以看出七八月份去北京的人会比较多,这个时候北京是最爽的,不热也不冷,博主就曾经有有一年8月份去的北京,舒服死了^_^
我们再来看看杭州
看得出3月底到4月中旬是杭州适合游玩的季节啊,那时候春暖花开,天气也不错,听说太子湾公园每年那时候都会有樱花和郁金花展,非常美,艾玛旅游病又犯了~_~!
好吧文章到此就结束了,其实还想分析更多,比如采集热门路线啊,热门景点啊,热门图集啊,还有旅游路线的价位啊,最终形成一个旅游的APP,如果你们有好的想法,也可以来告诉我,我把他采集下来,供大家参考 ^_^

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

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

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

Clothoff.io
Dissolvant de vêtements AI

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

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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.

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.

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 ! 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

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

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"

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.

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
