需求
由于安卓手機(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ī),訪問其參數(shù)詳情頁進(jìn)行參數(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表格如下圖所示:

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