php spider 参数详解,用phpspider框架做爬蟲分析旅游數據

https://github.com/owner888/phpspider (框架源碼)

隨着物質的提高,旅游漸漸成為人們的焦點,火熱的國慶剛剛過去,乘着這股余熱,我想很多人都想知道,大家一般會去哪里玩呢,

於是我花了10分鍾寫了一個采集馬蜂窩游記的小程序,當然速度能有這么快,完全依賴於PHP著名爬蟲框架phpspider。

國際慣例,我們先來看看代碼怎么寫,算作拋磚引玉吧 ^_^

馬蜂窩不同於常規網站,因為並發量高並且某些數據需要實時,比如觀看人數,點贊人數,所以網站多處使用了Ajax,而Ajax對於普通采集者來說,是個比較大的問題。

觀察了一下馬蜂窩網站,最終確定了采集路線:

獲取熱門城市 -> 獲取城市下的游記列表 -> 獲取游記內容 -> 提取游記內容的游記標題、城市、出發時間等,接下來我們用三個步驟來實現它。。。

1、獲取熱門城市

919684b91d86fd19e4d75d91d3dcbe78.png

首先我們要采集下這些熱門城市

f5c7911dc47101e823626a6c31ff55e2.png

當我們點擊頁數的時候,發現他的數據是Ajax加載的,末頁是297,而且使用的是POST方法

ce8017db0cecfc5d96091fcb79035b81.png

提交的參數如下:

7f41d980f86121e836877f5cbdd992ca.png

很明顯這個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、獲取熱門城市下的游記列表

點擊進入一個城市后,我們可以看到他下面的游記列表

8e08315ce0383145f29e1505e72d2abc.png

當然和上面一樣,也是Ajax加載的,我們可以打開chrome的開發者工具,點擊Network,然后隨意點擊一個分頁得到Ajax的URL:

4be0355039d9f5c2bed255e8c512ad14.png

和城市列表一樣,也是POST,參數如下:

aHR0cDovL2piY2RuMi5iMC51cGFpeXVuLmNvbS8yMDE2LzEwL2I0ODVhYTRlYjljMGU3ODM3MmRlMWI5NjNkZWM4YWRkLnBuZw==

很明顯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,),)

設計一張數據表:

2df4ede09cdfd76ea2a16cccf430b7a5.png

當然我們還可以獲取游記的瀏覽量、收藏、分享、置頂、游玩金額等等,太多了,方法類似。

到此程序就設計完了,總共不到200行的代碼,得益於phpspider自帶了多進程采集功能,數據很快就采集完成,總共7W多點。

ad30bbf53bc6ffb4c41d71b4b9dcbcfc.png

9a4e9f93ddc736abcaf244f479f975bd.png

得到這些數據以后,我們能干什么呢?!

Top10 旅游城市分別是

45084d82718a23b35b1b4cf6bad75ef0.png

可以看得出,雲南是一個好地方,也是博主日夜思念的地方啊。。。

五一和國慶期間旅游城市占比

6f66db8582d7f52fae2d016a05af05a0.png

9fe9743df5b79f3f6f9be6e957ca1eb6.png

可以看得出,五一的時候大家喜歡去西藏玩,國慶卻更青睞青島,好吧,這兩個地方博主都沒去過,表示好受傷~_~!

接下來我們來看看這一年來北京和杭州的旅游旺季

1894b95599194f3f18ae28d6341d7109.png

可以看出七八月份去北京的人會比較多,這個時候北京是最爽的,不熱也不冷,博主就曾經有有一年8月份去的北京,舒服死了^_^

我們再來看看杭州

dd38068a2e8a40a128841443ee1310c1.png

看得出3月底到4月中旬是杭州適合游玩的季節啊,那時候春暖花開,天氣也不錯,聽說太子灣公園每年那時候都會有櫻花和郁金花展,非常美,艾瑪旅游病又犯了~_~!

好吧文章到此就結束了,其實還想分析更多,比如采集熱門路線啊,熱門景點啊,熱門圖集啊,還有旅游路線的價位啊,最終形成一個旅游的APP,如果你們有好的想法,也可以來告訴我,我把他采集下來,供大家參考 ^_^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值