ZOL中关村在线手机参数爬虫

需求

由于安卓手机的配置不尽相同,在公司推出安卓版360度全景相机 Insta360 Air 后,客服经常会收到来电,询问其手机型号是否适用该产品。大部分情况下顾客只知道自己的手机型号,却不知道其详细参数,这让客服的工作量大大增加。于是客服主管希望能把ZOL 中关村在线里的所有安卓系统的手机型号和其对应的参数通过爬虫搜集下来,做成Excel表格方便以后随时随地检索手机参数。

分析

条件筛选

在选择限定的操作系统条件后,得到该url,经过测试发现,url最后下划线后面的数为页码。不过,手机列表的参数信息是不完整的,点击更多参数可以得到每个手机型号的详细参数信息,所以我们应该存下每个手机型号更多参数页面的url。

手机列表

针对每一个型号的手机,访问其参数详情页进行参数采集。

参数详情

关于如何选用何种方式进行爬虫采集。由于ZOL中关村在线的手机信息数据都是在请求url时就同步返回给浏览器的,不存在js异步加载的问题,所以我们可以直接用urllib2库或者requests来请求url获取网页信息。由于网页信息比较复杂,我们需要 Beautiful Soup 来帮助我们解析html页面,获取参数信息。(Beautiful Soup教程

实现

下面通过代码加注释来介绍具体的操作步骤,在这之前希望大家已经看过上面的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
#存放手机参数详情页面的列表
link_list = []
base_url = 'http://detail.zol.com.cn/cell_phone_advSearch/subcate57_1_s1398-s7074-s6500-s6502-s6106_1_1__'
#控制页面数
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='更多参数>>')
    for link in temp:
        link_list.append('http://detail.zol.com.cn' + link['href'])  #把每个手机型号的参数详情页存进数组

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有可能会导致BeautifulSoup解析出错
    for linebreak in soup.find_all('br'):
        linebreak.extract()

    #使用Beautiful Soup提供的方法定位我们想要得到的参数信息
    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'操作系统']
        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)

#创建工作簿
workbook = xlwt.Workbook(encoding='utf8')           
#创建sheet                
sheet1 = workbook.add_sheet(u'手机参数表', cell_overwrite_ok=True)  
row0 = [u'品牌', u'机型', u'是否支持OTG', u'安卓版本', u'操作系统', u'运行内存',
        u'机身内存', u'扩展容量', u'CPU型号', u'GPU型号', u'CPU频率', u'存储卡', u'用户界面', u'电池容量', u'电池类型', u'核心数']
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'操作系统'),
            getValue(res, u'RAM容量'),
            getValue(res, u'ROM容量'),
            getValue(res, u'扩展容量'),
            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'核心数')
        ]
        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

结果

导出的Excel表格如下图所示:

Excel表格

文章标题:ZOL中关村在线手机参数爬虫
文章作者:Ciel Ni
文章链接:http://www.cielni.com/2017/07/28/zol-phone-crawler/
有问题或建议欢迎在我的博客讨论,转载或引用希望标明出处,感激不尽!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 声明:本文讲解的实战内容,均仅用于学习交流,请勿用于任何商业用途! 一、前言 强烈建议:请在电脑的陪同下,阅读本文...
    Bruce_Szh阅读 12,588评论 6 28
  • 要玩大数据,没有数据怎么玩?这里推荐一些33款开源爬虫软件给大家。 爬虫,即网络爬虫,是一种自动获取网页内容的程序...
    评评分分阅读 7,835评论 2 121
  • 近来,不少准备参加实习工作或是应届生问我,我该如何入手数据分析呢?要看哪些书籍呢?的确,每一个技能需要一定知识基础...
    大圣众包阅读 917评论 0 20
  • 今天是2016年12月14日,这说明再过16天就是一个崭新的一年,过去的一年如白驹过隙,一晃而过。 回想一年的工作...
    雪山之子阅读 151评论 0 1
  • 你在左岸,听风看雨 我在右岸,看你等晚霞 夜空闪过烟火 躲不过一场相遇 远方的鸟儿,不用为我忧心 月光映出我们的背...
    深北羽翼阅读 161评论 3 4