https://github.com/owner888/phpspider (框架源碼)
隨着物質的提高,旅游漸漸成為人們的焦點,火熱的國慶剛剛過去,乘着這股余熱,我想很多人都想知道,大家一般會去哪里玩呢,
於是我花了10分鍾寫了一個采集馬蜂窩游記的小程序,當然速度能有這么快,完全依賴於PHP著名爬蟲框架phpspider。
國際慣例,我們先來看看代碼怎么寫,算作拋磚引玉吧 ^_^
馬蜂窩不同於常規網站,因為並發量高並且某些數據需要實時,比如觀看人數,點贊人數,所以網站多處使用了Ajax,而Ajax對於普通采集者來說,是個比較大的問題。
觀察了一下馬蜂窩網站,最終確定了采集路線:
獲取熱門城市 -> 獲取城市下的游記列表 -> 獲取游記內容 -> 提取游記內容的游記標題、城市、出發時間等,接下來我們用三個步驟來實現它。。。
1、獲取熱門城市
首先我們要采集下這些熱門城市
當我們點擊頁數的時候,發現他的數據是Ajax加載的,末頁是297,而且使用的是POST方法
提交的參數如下:
很明顯這個page就是頁數了,這里就有個問題,phpspider框架是有 URL 去重機制的,POST的話URL只有一個,但是query_string是不影響POST數據的,我們可以在后面加上 ?page=1|2|3…,所以我們代碼可以這么寫:
設置列表頁規則:
PHP123
'list_url_regexes'=>array("http://www.mafengwo.cn/mdd/base/list/pagedata_citylist?page=d+",)
在入口回調函數入口所有城市列表:
PHP1234567891011121314
$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地址:
是直接報錯的,他需要來路,綜合以上,我們代碼可以這么來寫:
首先我們要在 on_start 回調函數里面加上來路URL
PHP1234
$spider->on_start=function($phpspider){$phpspider->add_header('Referer','http://www.mafengwo.cn/mdd/citylist/21536.html');};
和上面獲取城市列表一樣,設置列表匹配規則:
PHP123
'list_url_regexes'=>array("http://www.mafengwo.cn/gonglve/ajax.php?act=get_travellist&mddid=d+",)
然后在 on_list_page 回調里面判斷如果是第一頁就獲取總頁數,然后循環入隊列:
PHP12345678910111213141516171819202122
preg_match('#共(.*?)頁#',$data_page,$out);for($i=0;$i$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
PHP1234567891011
// 獲取內容頁preg_match_all('##',$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提取內容頁字段
PHP1234567891011121314151617181920
'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,如果你們有好的想法,也可以來告訴我,我把他采集下來,供大家參考 ^_^