隨著物質的提高,旅遊漸漸成為人們的焦點,火熱的國慶剛剛過去,乘著這股餘熱,我想很多人都想知道,大家一般會去哪裡玩呢,於是我花了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'); };和上面獲取城市列表一樣,設定列表匹配裡面加上來路URL
'list_url_regexes' => array( "http://www.mafengwo.cn/gonglve/ajax.php?act=get_travellist&mddid=d+", )和上面獲取城市列表一樣,設定列表匹配規則:
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); }然後在on_list_page 回調裡面判斷如果是第一頁就獲取總頁數,然後循環入隊列:
// 获取内容页 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); } }通過上面兩個步驟,我們就把所有熱門城市下的遊記列表都放入到了隊列,接下來我們進行第三步,從這些清單裡面取得內容頁URL,然後提取內容。 3、取得熱門城市下的遊記清單在on_list_page 方法裡面會得到清單頁的內容,從這些內容裡面我們可以提取內容頁的URL
'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, ), )下來我們來設定field提取內容頁欄位
rrreee
rrreee下來我們來設定field提取內容頁欄位
rrreeerrreee下來我們來設定field提取內容頁欄設計一張資料表:
當然我們還可以獲得遊記的瀏覽量、收藏、分享、置頂、遊玩金額等等,太多了,方法類似。到此程式就設計完了,總共不到200行的程式碼,得益於phpspider自帶了多進程擷取功能,資料很快就採集完成,總共7W多點。
得到這些數據以後,我們能做什麼呢? !Top10 旅遊城市分別是
可以看得出,雲南是個好地方,也是博主日夜思念的地方啊。 。 。 🎜🎜五一和國慶期間旅遊城市佔比🎜可以看得出,五一的時候大家喜歡去西藏玩,國慶卻更青睞青島,好吧,這兩個地方博主都沒去過,表示好受傷~_~!
~接下來我們來看看這一年來北京和杭州的旅遊旺季
可以看出七八月份去北京的人會比較多,這個時候北京是最爽的,不熱也不冷,博主就曾經有一年8月份去的北京,舒服死了^_^
我們再來看看杭州
看得出3月底到4月中旬是杭州適合遊玩的季節啊,那時候春暖花開,天氣也不錯,聽說太子灣公園每年那時候都會有櫻花和鬱金花展,非常美,艾瑪旅遊病又犯了~_~!
好吧文章到此就結束了,其實還想分析更多,例如採集熱門路線啊,熱門景點啊,熱門圖集啊,還有旅遊路線的價位啊,最終形成一個旅遊的APP,如果你們有好的想法,也可以來告訴我,我把他採集下來,供大家參考^_^