PHP採集商家信息及採集方法概述(上)

 最近電子商務市場上面,有很多商家的導航,裏面收集了大量的商家信息,如果從事電子商務的這些信息還是有用的。我最近在做的一個項目就要用到這些信息,但是你總不能給別人要吧,這樣別人是不給滴。所以只有自己爬了。以前也寫過幾個類似的爬蟲爬取一個站點的某些信息總結說來就是

第一:確定要爬取的資源。

第二:確定爬取資源的資源地址(url)

第三:分析找出資源地址規律

第四:抓取資源地址。

第五:循環獲取地址的內容

第六:匹配抓取內容入庫

第六:完結,使用抓取數據。

上一次爬取的是一淘的商家信息,大概有5000個商家信息。當時匹配用的是正則匹配,整個html的正則有時候比較麻煩。這次用的是phpquery(這裏做個簡介,稍後會單獨寫一篇介紹的文章)。

這一次爬取一家網(shop.yijia.com)的數據 商家信息有100000個,這次把爬取的思路和相關代碼給大家分享下,以便有以後有相同或者類似的需求的參考交流學習。如果有需要這次爬取的數據的留言吧,可以給。

爬取開始...........

第一:

確定爬取的資源。我要爬取的是商家信息,這個網站號稱“商城超過500家並從萬餘家電子商務網站中精選23個分類,最後我確實爬取到90585個商家,去除重複的無效的大概也有50000+的有效商家列表。那麼我要爬取的就是這些商家信息,如果每一個商家是一個record那麼我大概要爬取10萬條數據。

第二:

確定爬取資源地址。一家網的商家地址在shop.yijia.com。商家分爲二級分類,一級大類例如:服裝飾品,美容護髮,數碼產品等。在一級下面有二級分類,二級下面就直接是商家列表,每一頁是十個。一家網的規律很好找

我們來找一些例子分析....

第一級大類:

服裝飾品:http://shop.yijia.com/listshop/index_1/

美容護髮:http://shop.yijia.com/listshop/index_2/

數碼產品:http://shop.yijia.com/listshop/index_1048/

一類的大類其實只有十來個,我沒有爬取直接手動添加了。(爬取是爲了簡化勞動,如果爲了十來條數據去寫個爬蟲,就不值當了)

第二級類別:我們拿服裝飾品下面分類(女裝,女鞋,女包,男裝,男鞋,男包)的來舉例,

女裝,http://shop.yijia.com/listshop/index_1_25/

女鞋:http://shop.yijia.com/listshop/index_1_26/

女包:http://shop.yijia.com/listshop/index_1_27/

很明顯的規律,這裏就細說了,如果這個觀察不出來,那個就不要採集了

然後分類下面的分頁 我們拿女裝來舉例

第一頁:http://shop.yijia.com/listshop/index_1_25_0_0_1/

第二頁:http://shop.yijia.com/listshop/index_1_25_0_0_2/

第三頁:http://shop.yijia.com/listshop/index_1_25_0_0_3/

 

第三:

分析資源地址規律,這裏比較簡單的規律,其實一般統一網站的資源類型資源地址不會差別太大,

關鍵是最後一個參數index_x_y_0_0_z

其中x 一級分類 y二級分類 z分頁 至於當中兩個0幹嘛的 我也不知道。觀察抽取分析後就是都是這樣的。

第四:抓取資源地址,抓取後我們不能隨便的保存是吧,最好能分類保存,這裏就設計到一個本地數據庫的設計,可以參考的猜解。

    第一步:一級分類入庫,我這裏手動拷貝的畢竟只有十來條

    第二步:抓取二級分類,這裏觀察頁面結構可以發現,一級分類頁面中的內容中頁面結構相似 在一級分類頁面的一個div是保存二級分類的目錄樹的 dd id="dd_open_1" 裏面的

  1. <dd id="dd_open_1">  
  2. <ul>  
  3.     <li class="sel"><a href="/listshop/index_1_25/" target="_self">女裝</a></li> 
  4.     <li><a href="/listshop/index_1_26/" target="_self">女鞋</a></li> 
  5.     <li><a href="/listshop/index_1_27/" target="_self">女包</a></li> 
  6.     <li><a href="/listshop/index_1_28/" target="_self">男裝</a></li> 
  7.     <li><a href="/listshop/index_1_29/" target="_self">男鞋</a></li> 
  8.     <li><a href="/listshop/index_1_30/" target="_self">男包</a></li> 
  9.     <li><a href="/listshop/index_1_31/" target="_self">內衣</a></li> 
  10.     <li><a href="/listshop/index_1_32/" target="_self">配飾</a></li> 
  11.     <li><a href="/listshop/index_1_33/" target="_self">飾品</a></li> 
  12.     <li><a href="/listshop/index_1_34/" target="_self">運動服飾</a></li> 
  13.     <li><a href="/listshop/index_1_1086/" target="_self">成衣定製</a></li> 
  14. </ul>  
  15. </dd> 

 

那麼好的規律找到了哦 只要在每個一級頁面裏面的id爲dd_open_1裏面的ul就行了

循環是一個一級分類的頁面內容然後抓取裏面的li 和對應的href

然後 是二級分類對應的分頁數量

進入一個二級分類然後查看 這裏有不同的方法 不過這要找到有一種可行就可以了我說下我的,如果有分頁那麼一定會有一個尾頁 那麼尾頁的url中的最後一個參數是

(int a)/ 那麼 a就是這個分頁的數量

我們來看個示例

  1. <div class="pager cardlist03"><a href="/listshop/index_1_25_0_0_1/" target="_self">首頁</a> 
  2.     <a href="/listshop/index_1_25_0_0_1/" target="_self">上一頁</a> 
  3.     <a href="/listshop/index_1_25_0_0_1/" target="_self">1</a> 
  4.     &nbsp;2&nbsp;<a href="/listshop/index_1_25_0_0_3/" target="_self">3</a> 
  5.     <a href="/listshop/index_1_25_0_0_4/" target="_self">4</a> 
  6.     <a href="/listshop/index_1_25_0_0_5/" target="_self">5</a> 
  7.     <a href="/listshop/index_1_25_0_0_3/" target="_self">下一頁</a> 
  8.     <a href="/listshop/index_1_25_0_0_500/" target="_self">尾頁</a> 
  9.     &nbsp;共500頁&nbsp;到第 
  10.     <!-- .....省略輸入框代碼 太長了 不好截斷 哈哈 --> 
  11. </div> 

我的做法是取得 div class="pager" 的這個然後取得裏面的最後一個a標籤

獲取他的屬性href 用explode 已‘_’ 截斷 然後取得的數值就是他如果沒有就默認一頁如果有就是相應的頁數。

然後在最後的商家頁面中有我們需要的兩個信息,商家簡介和url 。logo在商家列表頁裏面可以獲得。這個就說了見代碼吧。

 

這樣我們得到了所有的資源路徑(規律,推出所有的分類)

 

下面的就是採集階段了。

這裏就不多說了直接上代碼。

注意:

第一:這裏分了三個小腳本,因爲是在pc上跑。如果在服務器上可以合成一個來跑。

第二:不要惡意和暴力採集,這樣對大家都不好,會被當成DDOS ***屏蔽你的ip或者給網站服務器太大壓力致使崩潰的。剛開始就被封了IP  然後我這裏一次採集後sleep(1) 就沒什麼問題了。

代碼相關

數據庫結構

 

  1. 'yj_shop_category', 'CREATE TABLE `yj_shop_category` ( 
  2.   `sc_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主鍵id'
  3.   `sc_name` varchar(255) NOT NULL COMMENT '分類名稱'
  4.   `sc_parent_id` int(10) NOT NULL DEFAULT '0' COMMENT '父類id'
  5.   `sc_url` varchar(255) NOT NULL COMMENT '分類url'
  6.   `sc_page_num` int(6) NOT NULL COMMENT '共多少個分頁'
  7.   `sc_current_page_num` int(6) NOT NULL DEFAULT '1' COMMENT '當前採集頁'
  8.   `sc_add_time` int(10) NOT NULL COMMENT '增加時間'
  9.   `is_grab` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否採集過'
  10.   PRIMARY KEY (`sc_id`) 
  11. ) ENGINE=InnoDB AUTO_INCREMENT=126 DEFAULT CHARSET=utf8' 
  12.  
  13. 'yj_shop_information', 'CREATE TABLE `yj_shop_information` ( 
  14.   `si_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '商家主鍵'
  15.   `si_name` varchar(255) NOT NULL COMMENT '商家名稱'
  16.   `si_cat_id` int(10) NOT NULL COMMENT '商家所屬分類'
  17.   `si_shop_url` varchar(255) NOT NULL COMMENT '一家中的商家url'
  18.   `si_true_url` varchar(255) NOT NULL COMMENT '實際url'
  19.   `si_yijia_url` varchar(255) NOT NULL COMMENT '一家中商家簡介頁面'
  20.   `si_logo_url` varchar(255) NOT NULL COMMENT 'logo圖片地址'
  21.   `si_desc` text NOT NULL COMMENT '詳細描述'
  22.   `si_front_desc` text NOT NULL COMMENT '簡介描述'
  23.   `si_add_time` int(10) NOT NULL COMMENT '增加時間'
  24.   PRIMARY KEY (`si_id`) 
  25. ) ENGINE=InnoDB AUTO_INCREMENT=86367 DEFAULT CHARSET=utf8' 
  26.  

這一篇就到這裏然後我們下一篇說具體的採集代碼

 

PHP採集商家信息及採集方法概述(下)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章