ZOL中關(guān)村在線手機(jī)參數(shù)爬蟲

需求

由于安卓手機(jī)的配置不盡相同,在公司推出安卓版360度全景相機(jī) Insta360 Air 后,客服經(jīng)常會收到來電,詢問其手機(jī)型號是否適用該產(chǎn)品。大部分情況下顧客只知道自己的手機(jī)型號,卻不知道其詳細(xì)參數(shù),這讓客服的工作量大大增加。于是客服主管希望能把ZOL 中關(guān)村在線里的所有安卓系統(tǒng)的手機(jī)型號和其對應(yīng)的參數(shù)通過爬蟲搜集下來,做成Excel表格方便以后隨時隨地檢索手機(jī)參數(shù)。

分析

條件篩選

在選擇限定的操作系統(tǒng)條件后,得到該url,經(jīng)過測試發(fā)現(xiàn),url最后下劃線后面的數(shù)為頁碼。不過,手機(jī)列表的參數(shù)信息是不完整的,點(diǎn)擊更多參數(shù)可以得到每個手機(jī)型號的詳細(xì)參數(shù)信息,所以我們應(yīng)該存下每個手機(jī)型號更多參數(shù)頁面的url。

手機(jī)列表

針對每一個型號的手機(jī),訪問其參數(shù)詳情頁進(jìn)行參數(shù)采集。

參數(shù)詳情

關(guān)于如何選用何種方式進(jìn)行爬蟲采集。由于ZOL中關(guān)村在線的手機(jī)信息數(shù)據(jù)都是在請求url時就同步返回給瀏覽器的,不存在js異步加載的問題,所以我們可以直接用urllib2庫或者requests來請求url獲取網(wǎng)頁信息。由于網(wǎng)頁信息比較復(fù)雜,我們需要 Beautiful Soup 來幫助我們解析html頁面,獲取參數(shù)信息。(Beautiful Soup教程

實(shí)現(xiàn)

下面通過代碼加注釋來介紹具體的操作步驟,在這之前希望大家已經(jīng)看過上面的Beautiful Soup教程,對Beautiful Soup的使用方法有一定了解。

# -*- coding: UTF-8 -*-
import sys
import urllib2
import re
import xlwt
import time
from bs4 import BeautifulSoup

reload(sys)
sys.setdefaultencoding("utf-8")

def getValue(res, key):
    try:
        result = res[key]
    except:
        result = ''
    return result
#存放手機(jī)參數(shù)詳情頁面的列表
link_list = []
base_url = 'http://detail.zol.com.cn/cell_phone_advSearch/subcate57_1_s1398-s7074-s6500-s6502-s6106_1_1__'
#控制頁面數(shù)
for i in range(1, 145):    
    url = base_url + str(i) + '.html#showc'
    response = urllib2.urlopen(url)
    page = response.read()
    soup = BeautifulSoup(page, 'html.parser')
    ul = soup.find('ul', class_='result_list')
    print url
    temp = ul.find_all('a', text='更多參數(shù)>>')
    for link in temp:
        link_list.append('http://detail.zol.com.cn' + link['href'])  #把每個手機(jī)型號的參數(shù)詳情頁存進(jìn)數(shù)組

res_list = []
for url in link_list:
    response = urllib2.urlopen(url)
    page = response.read()
    #使用beautiful soup解析html頁面,page是字符串
    soup = BeautifulSoup(page, 'html.parser')
    result = {}
    #去掉多余的br,br有可能會導(dǎo)致BeautifulSoup解析出錯
    for linebreak in soup.find_all('br'):
        linebreak.extract()

    #使用Beautiful Soup提供的方法定位我們想要得到的參數(shù)信息
    div = soup.find('div',class_='breadcrumb')
    a_list = div.find_all('a')
    brand = a_list[2].string
    model = a_list[3].string
    result['brand'] = brand
    result['model'] = model
    th = soup.find('th',text='硬件')
    tr = th.parent
    list = tr.find('ul',class_='category-param-list').find_all('li')
    for li in list:
        spans = li.find_all('span')
        key = spans[0].string
        value = spans[1].string
        # print spans[1]
        if value == None:
            value = ''
            temp = spans[1].stripped_strings
            for i in temp:
                value += i + ','
        # print key,value
        result[key] = value
    try:
        system = result[u'操作系統(tǒng)']
        if 'Android' in system:
            pattern = re.compile("Android.{0,}", re.S)
            items = re.findall(pattern, system)
            try:
                android = str(items[0])
            except:
                android = ''
        else: android = ''
    except:
        android = ''
    result['android'] = android

    try:
        span  = soup.find('span',text='連接與共享')
        temp = span.parent.find_all('span')[1]
        hasOTG =  'OTG' in temp.strings
        if hasOTG:
            result['OTG'] = 'Y'
        else:
            result['OTG'] = 'N'
    except:
        result['OTG'] = 'N'
    for key in result:
        print key,result[key]
    res_list.append(result)

#創(chuàng)建工作簿
workbook = xlwt.Workbook(encoding='utf8')           
#創(chuàng)建sheet                
sheet1 = workbook.add_sheet(u'手機(jī)參數(shù)表', cell_overwrite_ok=True)  
row0 = [u'品牌', u'機(jī)型', u'是否支持OTG', u'安卓版本', u'操作系統(tǒng)', u'運(yùn)行內(nèi)存',
        u'機(jī)身內(nèi)存', u'擴(kuò)展容量', u'CPU型號', u'GPU型號', u'CPU頻率', u'存儲卡', u'用戶界面', u'電池容量', u'電池類型', u'核心數(shù)']
for i in range(0, len(row0)):
    sheet1.write(0, i, row0[i])
row_index = 1
for res in res_list:
        rows = [
            getValue(res, 'brand'),
            getValue(res, 'model'),
            getValue(res, 'OTG'),
            getValue(res, 'android'),
            getValue(res, u'操作系統(tǒng)'),
            getValue(res, u'RAM容量'),
            getValue(res, u'ROM容量'),
            getValue(res, u'擴(kuò)展容量'),
            getValue(res, u'CPU型號'),
            getValue(res, u'GPU型號'),
            getValue(res, u'CPU頻率'),
            getValue(res, u'存儲卡'),
            getValue(res, u'用戶界面'),
            getValue(res, u'電池容量'),
            getValue(res, u'電池類型'),
            getValue(res, u'核心數(shù)')
        ]
        for i in range(len(rows)):
            sheet1.write(row_index, i, rows[i])
        row_index += 1
t = str(time.time())
workbook.save(t + '.xls')  # 保存文件

Github地址: https://github.com/NiShuang/mobile_info_crawler

結(jié)果

導(dǎo)出的Excel表格如下圖所示:

Excel表格

文章標(biāo)題:ZOL中關(guān)村在線手機(jī)參數(shù)爬蟲
文章作者:Ciel Ni
文章鏈接:http://www.cielni.com/2017/07/28/zol-phone-crawler/
有問題或建議歡迎在我的博客討論,轉(zhuǎn)載或引用希望標(biāo)明出處,感激不盡!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 聲明:本文講解的實(shí)戰(zhàn)內(nèi)容,均僅用于學(xué)習(xí)交流,請勿用于任何商業(yè)用途! 一、前言 強(qiáng)烈建議:請?jiān)陔娔X的陪同下,閱讀本文...
    Bruce_Szh閱讀 13,025評論 6 28
  • 要玩大數(shù)據(jù),沒有數(shù)據(jù)怎么玩?這里推薦一些33款開源爬蟲軟件給大家。 爬蟲,即網(wǎng)絡(luò)爬蟲,是一種自動獲取網(wǎng)頁內(nèi)容的程序...
    評評分分閱讀 8,163評論 2 121
  • 近來,不少準(zhǔn)備參加實(shí)習(xí)工作或是應(yīng)屆生問我,我該如何入手?jǐn)?shù)據(jù)分析呢?要看哪些書籍呢?的確,每一個技能需要一定知識基礎(chǔ)...
    大圣眾包閱讀 1,029評論 0 20
  • 今天是2016年12月14日,這說明再過16天就是一個嶄新的一年,過去的一年如白駒過隙,一晃而過。 回想一年的工作...
    雪山之子閱讀 260評論 0 1
  • 你在左岸,聽風(fēng)看雨 我在右岸,看你等晚霞 夜空閃過煙火 躲不過一場相遇 遠(yuǎn)方的鳥兒,不用為我憂心 月光映出我們的背...
    深北羽翼閱讀 213評論 3 4

友情鏈接更多精彩內(nèi)容