本篇作者:BlueDamage同学
相信大家都有买手机的需求,那么全网上手机到底有多少个品牌呢,哪一种的手机价格最划算,评分最高,屏幕最大,硬件最牛等等这些信息我们都想知道,不如自己动手爬下整个全网的手机,慢慢研究,至少买手机的时候可以参考参考嘛.这篇文章综合了爬虫,代理,数据库多个知识,非常不错.
环境: 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
- 然后我们点击下一页,发现第二页变成了:http://detail.zol.com.cn/cell_phone_index/subcate57_0_list_1_0_1_2_0_2.html,第三页是3
- url的地址规律很明显, 大家可以继续点击下一页看一下,一直点下去,发现一共有108页
-
每个手机的id是在index后面的数字串,比如下图的左下角的底部
1141273是这个红框里面手机的id
网页二: 手机综述介绍页面
随意选择一款手机的连接, 进入其综述介绍的页面
在这个页面, 想要获取手机的名称及品牌, 同时也获取几种价格(参考报价及商家报价),此外还想获取图片, 参数及点评页面的url
由上三图可见, 图片, 参数及点评页面的url的构造, 都需要获取在1167243(手机id)前1168的数字串(前置id)
网页三: 手机参数页面
由图可见, 该手机有九大属性(基本参数, 屏幕,网络...), 大属性对应着几项小属性, 小属性对应着具体的内容,希望在爬取此页面时, 构造一个属性的大字典
attrs={'基本属性':{'上市时间':'','手机类型':''},}
网页四: 手机点评页面
在点评页面, 要获取点评人数, 平均评分及详细评分, 好评块与差评块
2.程序框架
代码我们可以用Py2,也可以用Py3.因为用到的库py2和py3都有,我们先看一下整体的框架图:
- 由于目标网站是中文网站,考虑网站里面有大量的中文字符串,为了减少麻烦,我们还是用Py3
- 数据库这边我们用SQL数据库,用简单的sqlite3去操作一下
- 反爬其实是一个比较头疼的问题,本篇代理是一个不错的选择
- 整体的代码需要设计4个类,爬虫类,代理类,数据库类,考虑到采集手机的信息特别多再封装一个手机类,这样封装和隔离度比较好.如果要数据分析的话,可以再设计一个类,下面我们具体看一下吧
1.手机类
因为要采集的手机的信息太多了,从手机的价格,品牌,参数,屏幕,网络,硬件,摄像头,服务支持,评价等等,有十几种信息要采集,所以封装成类是比较好的方法
self.attribute是一个大字典,字典套字典的数据结构
2.数据库类
数据库是把4900多只手机的所有信息全部存起来,为了便于查询和处理,我们设计了12个独立的表格,但是每个表格都用手机id作为key,所以联合查询也很方便.
看一下代码,其实代码跟我们前面介绍的sqlite3教程有点类似
因为数据库入门,特别是SQL语法我们讲了很多,这里不再一一重复,有兴趣的同学可以去看一下历史文章里面(数据库入门篇系列文章),下面是手机基本信息表和评分表两个表
我们从网页上爬取数据,然后存入数据库,所有的数据都是从mobilePhoneList里面获取,里面存放了每一个手机类的信息
看一下12个表中的phone table长啥样:
一共4921部手机,忽然发现还有很多老牌的手机依然在网站上有销售
结论:
需要源码的同学,请留言
网友评论