物质水平的提升使得旅游日益受到关注,国庆长假刚刚落幕,趁着这股热潮,许多人或许都在好奇,大家通常会选择去哪里度假。为此,我耗时仅10分钟便开发了一个专门收集马蜂窝游记的小程序,而这般迅速的成果,离不开PHP知名爬虫框架的强大支持。
国际惯例,我们先来看看代码怎么写,算作抛砖引玉吧 ^_^
马蜂窝网站与一般网站不同,它面临高并发量的挑战,并且某些关键数据需要即时更新,例如观看人数和点赞人数。因此,该网站在多个地方采用了Ajax技术。然而,对于普通的采集者而言,Ajax技术构成了一个较大的难题。
观察了一下马蜂窝网站,最终确定了采集路线:
获取热门城市的列表,然后根据这些城市获取相应的游记列表,接着查看游记的具体内容,从中提取游记的标题、所在城市以及出发日期等信息,我们将通过以下三个步骤来完成这一操作。
1、获取热门城市
首先我们要采集下这些热门城市
点击页码时,我们注意到其数据是通过Ajax技术动态加载的;末页编号为297,并且采用了POST请求方式。
提交的参数如下:
显而易见,这里的“page”指的是页码,存在一个疑问,即虽然框架具备URL去重功能,对于POST请求而言,其URL是唯一的,但这并不会对POST传输的数据造成影响。因此,我们可以在URL后添加参数“?page=1|2|3...”,据此,我们的代码可以这样编写:
设置列表页规则:
''=> array( "\?page=\d+", )
在入口回调函数入口所有城市列表:
对于Ajax分页的最后一页,它是第297页,循环从0开始到某个数,每次循环中,构建一个URL,设置为POST方式,并将'mddid'设为21536,'page'设为当前循环的索引i,然后将这个URL加入队列;接着,使用这个URL和另一个参数调用函数。
点击进入一个城市后,我们可以看到他下面的游记列表
自然,这同样是通过Ajax技术实现的加载方式,我们只需打开浏览器中的开发者工具,进行点击操作,之后任意点击一个分页,便可以获取到对应的Ajax请求链接。
和城市列表一样,也是POST,参数如下:
显而易见,page指的是页码,自然地,我们可以通过POST请求直接访问Ajax的地址:
是直接报错的,他需要来路,综合以上,我们代码可以这么来写:
首先我们要在 回调函数里面加上来路URL
$-> =($) { $->('',''); };
和上面获取城市列表一样,设置列表匹配规则:
不允许对特定内容进行修改,且需确保移动设备识别码的格式正确,即以“&”符号连接的“act”和“mddid”参数,其中“mddid”后面跟随一个数字。
在回调函数中,若确认当前为首页,则需查询总页数信息,并依次将其加入队列中。
使用正则表达式提取页数信息,然后循环遍历每一页,构造游记列表页的URL,并添加到队列中。具体操作如下:初始化循环变量i为0,当i小于等于总页数时,执行以下步骤:将URL、请求方式、参数数组(包含mddid、空字符串、排序方式、费用、天数、月份、标签ID、当前页码等)传递给函数,将生成的URL和队列操作符作为参数调用函数,将URL加入队列。
经过前两个阶段的操作,我们已将各大热门城市的游记清单悉数纳入队列之中,紧接着,我们将迈入第三阶段,即从这些清单中抓取具体内容页的网址,并从中提取所需信息。
3、获取热门城市下的游记列表
在具体方法中,我们能够获取到列表页的详细信息,通过这些信息,我们能够进一步提取出内容页的网址。
提取内容页面信息,将('##', $html, $out)进行处理;若输出结果非空,则对输出结果进行遍历;将每个遍历到的值$v作为内容页URL,存储为"{$v}.html";并将该URL加入队列。
接下来我们来配置field提取内容页字段
标题 => 数组,其中包含:名称字段(name),以及一个注释字段(//h1)。
(@class,'')
禁止对特定内容进行修改,确保分类数组中的'name'键对应的值为'city',且不包含注释标记,具体表现为:分类数组包含一个元素,其键为'name',值为'city',不带有任何注释内容。
(@class,'')
禁止对特定内容进行修改,确保其真实性,相关数据如下:出发日期信息,名称为“date”,格式保持原样。
(@class,'time')
", ''=>true, ), )
设计一张数据表:
自然,我们能够了解到游记的阅读次数、收藏数、转发量、置顶状态以及游玩消费金额等众多信息,种类繁多,获取方式也大致相同。
程序设计至此告一段落,整体代码量不足200行,得益于其内置的多进程数据采集功能,数据收集过程迅速高效,最终累计达到了七万多个数据点。
得到这些数据以后,我们能干什么呢?!
Top10 旅游城市分别是
显而易见,云南堪称佳境,更是博主心中日夜萦绕、深切思念的所在啊。
五一和国庆期间旅游城市占比
五一期间众人偏爱前往西藏游玩,而国庆节时则更倾向于青岛,唉,不过遗憾的是,博主本人并未踏足这两个地方,心里难免有些失落~_~!
接下来我们来看看这一年来北京和杭州的旅游旺季
观察发现,在七八月份前往北京旅游的人数显著增加,那时北京的气候宜人,既不炎热也不寒冷,博主曾记得自己有一次在八月份前往北京,那感觉真是舒爽至极,非常惬意。
我们再来看看杭州
三月末至四月上旬无疑是杭州旅游的最佳时节,春意盎然,花儿竞相绽放,气候宜人,据悉,太子湾公园在那段时间会举办盛大的樱花与郁金花展,景色迷人至极,看来我的旅游瘾又犯了~_~!
文章内容至此告一段落,实则心中尚有许多分析欲,诸如搜集热门旅游线路、著名景点、精选图集以及旅游线路的价格信息,期望最终能打造出一个旅游应用程序。若各位读者有独到见解,欢迎分享,我将一一收集,以供众人参考。^_^
最后,对源代码感兴趣的同学可以上搜索哈 ^_^
爬虫工具,DDOC系统,提供分布式动态代理IP服务,确保IP代理的高品质,覆盖全国范围内的匿名代理IP,适用于爬虫代理需求,供应私密型代理IP,支持国内快速代理服务,精选优质代理IP资源。
扫一扫在手机端查看
- 上一篇:PHP Spider 爬虫开发教程_使用PHP蜘蛛爬虫框架来爬取数据分享
- 下一篇:Ubuntu 12.04.5 LTS 升级教程_ubuntu-12.04.5-desktop-amd64.iso
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。


客服1