厲害了!實戰爬取全網5000部手機|上篇

編程語言 文章 SQL 網絡爬蟲 中國統計網 中國統計網 2017-09-13

相信大家都有買手機的需求,那麼全網上手機到底有多少個品牌呢,哪一種的手機價格最划算,評分最高,屏幕最大,硬件最牛等等這些信息我們都想知道,不如自己動手爬下整個全網的手機,慢慢研究,至少買手機的時候可以參考參考嘛.這篇文章綜合了爬蟲,代理,數據庫多個知識,非常不錯.

環境: Python 3.5

用到的庫: os, re, random, time, sqlite3, requests, BeautifulSoup, pickle

用到的工具:Pycharm

1網站分析

這裡我們爬取的是中關村在線網站,我們首先要對目標網站進行仔細的分析,才能確定用什麼技術去處理:

  • 目標網站的url地址是否規整

  • 目標網站有無反爬蟲策略

  • 目標網站的數據是不是方便的提取,格式有無前後不一致,如何兼容

  • 目標網站是靜態網頁還是動態加載的,要不要用selenium模擬器去爬取

  • 目前網站的爬取規模數據有多大,要不要用框架爬取等等

下面我們先來分析一下目標網站吧

網頁一: 簡略手機信息頁面

打開zol手機頁面:

http://detail.zol.com.cn/cell_phone_index/

subcate57_0_list_1_0_1_2_0_1.html

厲害了!實戰爬取全網5000部手機|上篇

  • 然後我們點擊下一頁,發現第二頁變成了:http://detail.zol.com.cn/cell_phone_index/subcate57_0_list_1_0_1_2_0_2.html,第三頁是3

  • url的地址規律很明顯, 大家可以繼續點擊下一頁看一下,一直點下去,發現一共有108頁

  • 每個手機的id是在index後面的數字串,比如下圖的左下角的底部

厲害了!實戰爬取全網5000部手機|上篇

1141273是這個紅框裡面手機的id

網頁二: 手機綜述介紹頁面

隨意選擇一款手機的連接, 進入其綜述介紹的頁面

厲害了!實戰爬取全網5000部手機|上篇

在這個頁面, 想要獲取手機的名稱及品牌, 同時也獲取幾種價格(參考報價及商家報價),此外還想獲取圖片, 參數及點評頁面的url

厲害了!實戰爬取全網5000部手機|上篇

由上三圖可見, 圖片, 參數及點評頁面的url的構造, 都需要獲取在1167243(手機id)前1168的數字串(前置id)

網頁三: 手機參數頁面

厲害了!實戰爬取全網5000部手機|上篇

由圖可見, 該手機有九大屬性(基本參數, 屏幕,網絡...), 大屬性對應著幾項小屬性, 小屬性對應著具體的內容,希望在爬取此頁面時, 構造一個屬性的大字典

attrs={'基本屬性':{'上市時間':'','手機類型':''},}

網頁四: 手機點評頁面

厲害了!實戰爬取全網5000部手機|上篇

在點評頁面, 要獲取點評人數, 平均評分及詳細評分, 好評塊與差評塊

2程序框架

代碼我們可以用Py2,也可以用Py3.因為用到的庫py2和py3都有,我們先看一下整體的框架圖:

厲害了!實戰爬取全網5000部手機|上篇

  • 由於目標網站是中文網站,考慮網站裡面有大量的中文字符串,為了減少麻煩,我們還是用Py3

  • 數據庫這邊我們用SQL數據庫,用簡單的sqlite3去操作一下

  • 反爬其實是一個比較頭疼的問題,本篇代理是一個不錯的選擇

  • 整體的代碼需要設計4個類,爬蟲類,代理類,數據庫類,考慮到採集手機的信息特別多再封裝一個手機類,這樣封裝和隔離度比較好.如果要數據分析的話,可以再設計一個類,下面我們具體看一下吧

1.手機類

因為要採集的手機的信息太多了,從手機的價格,品牌,參數,屏幕,網絡,硬件,攝像頭,服務支持,評價等等,有十幾種信息要採集,所以封裝成類是比較好的方法

厲害了!實戰爬取全網5000部手機|上篇

self.attribute是一個大字典,字典套字典的數據結構

2.數據庫類

數據庫是把4900多隻手機的所有信息全部存起來,為了便於查詢和處理,我們設計了12個獨立的表格,但是每個表格都用手機id作為key,所以聯合查詢也很方便.

厲害了!實戰爬取全網5000部手機|上篇

看一下代碼,其實代碼跟我們前面介紹的sqlite3教程有點類似

厲害了!實戰爬取全網5000部手機|上篇

因為數據庫入門,特別是SQL語法我們講了很多,這裡不再一一重複,有興趣的同學可以去看一下歷史文章裡面(數據庫入門篇系列文章),下面是手機基本信息表和評分表兩個表

厲害了!實戰爬取全網5000部手機|上篇

我們從網頁上爬取數據,然後存入數據庫,所有的數據都是從mobilePhoneList裡面獲取,裡面存放了每一個手機類的信息

厲害了!實戰爬取全網5000部手機|上篇

看一下12個表中的phone table長啥樣:

厲害了!實戰爬取全網5000部手機|上篇

一共4921部手機,忽然發現還有很多老牌的手機依然在網站上有銷售

結論:


好了,全網爬5000部手機上篇,就先講道這裡,我在BlueDamage同學的稿件上重新做了排版和修正. 所有的源碼我都一一編譯調試過.由於這篇文章圖片已經累計近4M了,限於篇幅考慮,把爬蟲和反爬代理設計放在實戰下篇.BlueDamage同學寫的還是非常仔細的,從數據的採集爬取,到斷點續爬,整體的代碼很整潔,數據結構非常清晰,看的出Python功力很深,等講完下篇之後,會給大家源碼分享.

End.

運行人員:中國統計網小編(微信號:itongjilove)

微博ID:中國統計網

中國統計網,是國內最早的大數據學習網站,公眾號:中國統計網

http://www.itongji.cn

相關推薦

推薦中...