具体步骤:

1、进入宝马官网,查找经销商查询界面

http://www.bmw.com.cn/cn/zh/general/dealer_locator/content/dealer_locator.html

2、使用火狐浏览(需要安装Firebug和HttpFox)

找到json数据存储位置:https://secure.bmw.com.cn/cn/_common/_js/dealer_locator/dealer_locator.json

3、查看json数据以后,json中包含省份,城市,店面类型,经销商信息,并且发现里面的经销商数据中包含地域的编号信息,所以决定制作省份字典、城市字典、类型字典,并且和经销商中数据进行比对输出。

4、得到省份信息主要代码:

     def get_province_dict(self):
province_dict={}
#创建省份信息字典
json_data = urllib2.urlopen(self.index_url).read()
#读取json页面
jsons = json_data.split(';')
#将几组json数据分开
json_province = jsons[0][jsons[0].index('=')+1:-1]
#jsons[0]是省份信息
json_province = json_province+']'
#将得到的字符串整理成正常的json数据格式
provinces = json.loads(json_province)
#读取json数据
for province in provinces:
province_dict[province.get('id')] = province.get('nz')
#得到ID和省份名称存入相应的字典中
return province_dict

5、得到城市信息的方法遇上面一样

     def get_city_dict(self):
city_dict={}
json_data = urllib2.urlopen(self.index_url).read() #读取json数据
#print json_data
jsons = json_data.split(';')
#print jsons[1]# 城市信息
json_city = jsons[1][jsons[1].index('=')+1:-1]
json_city = json_city+']'
citys = json.loads(json_city)
#print provinces
for city in citys:
#print province.get('nz')
city_dict[city.get('id')] = city.get('nz') for key in city_dict:#测试字典
print key
print city_dict[key]
return city_dict

6、获得店面类型的信息也类似

    def get_type_dict(self):
type_dict={}
json_data = urllib2.urlopen(self.index_url).read() #读取json数据
#print json_data
jsons = json_data.split(';')
#print jsons[2]# 店面类型信息
json_type = jsons[2][jsons[2].index('=')+1:-1]
json_type = json_type+']'
types = json.loads(json_type)
#print provinces
for typea in types:
#print province.get('nz')
type_dict[typea.get('id')] = typea.get('nz')
return type_dict

7、由于json中店面的类型是通过ID与类型ID进行匹配的,所以需要将类型的名称与店面id进行匹配制成字典

     def get_dealer_type_dict(self):
dealer_type_dict={}
types = self.get_type_dict()
#调用之前的类型方法,用于后面的匹配
json_data = urllib2.urlopen(self.index_url).read() #读取json数据
#print json_data
jsons = json_data.split(';')
#print jsons[4]# 店面与类型关系信息
json__delaer_type = jsons[4][jsons[4].index('=')+1:-1]
json__delaer_type = json__delaer_type+']'
delaer_types = json.loads(json__delaer_type)
#print provinces
for delaer_type in delaer_types:#有用31-34编号的信息不是所需信息搜易使用if剔除
if delaer_type.get('tp')==31:
continue
if delaer_type.get('tp')==32:
continue
if delaer_type.get('tp')==33:
continue
if delaer_type.get('tp')==34:
continue
print delaer_type.get('tp')
dealer_type_dict[delaer_type.get('br')] = types[delaer_type.get('tp')]
return dealer_type_dict

8、处理经销商数据方法

     def get_dealer_info(self):
province_dict = self.get_province_dict()
city_dict = self.get_city_dict()
dealer_type_dict = self.get_dealer_type_dict() json_data = urllib2.urlopen(self.index_url).read() jsons = json_data.split(';')
#print jsons[3]#经销商信息
json_dealer = jsons[3][jsons[3].index('=')+1:-1]
#由于此处的json数据过大,致使json.loads()发生异常
#所以选择拼凑成列表的格式进行生成
json_dealer = json_dealer.replace('[','')
json_dealer = json_dealer.replace(']','')
json_dealer = json_dealer.replace('},','}},')
json_dealer = json_dealer.split('},')
#以上为拼凑过程
dealers = list(json_dealer)
#将字符串转变成列表
dealer_info_list = []
for dealer in dealers:
l={}
dealer = json.loads(dealer)
#字符减少可以使用json.loads()进行处理,得到字典
print dealer.get('nz')
l[Constant.PROVINCE] = province_dict[dealer.get('pv')]
#用经销商数据中的省份ID匹配省份字典中的ID,得到中文的省份名称
l[Constant.CITY] = city_dict[dealer.get('ct')]
l[Constant.TYPE] = dealer_type_dict[dealer.get('id')]
l[Constant.NAME] = dealer.get('nz')
l[Constant.ADDRESS] = dealer.get('az')
l[Constant.TEL] = dealer.get('tel')
l[Constant.EMAIL] = dealer.get('em')
l[Constant.WEBSHOP] = dealer.get('ws')
l[Constant.SINA] = dealer.get('wb')
l[Constant.LENDER] = dealer.get('fnz')
l[Constant.LENDERTEL] = dealer.get('ft')
l[Constant.AFTERSALE] = dealer.get('flt')
l[Constant.FAX] = dealer.get('fax')
l[Constant.POSTCODE] = dealer.get('zp')
dealer_info_list.append(l)
self.saver.add(dealer_info_list)#提交保存
self.saver.commit()

还有部分代码是用于将数据存入excel中的,就不贴出来了

最终结果是

我是爬虫新手,学python也就一个月,还是有高人指点的,代码很冗余,希望对新手有帮助,更希望高手提出意见,我加紧改进学习!!!!!!

宝马-中国官方网站服务站点信息爬去记录(解析json中数据)的更多相关文章

  1. 爬去酷狗top500的数据

    import requests from bs4 import BeautifulSoup import time headers={ #'User-Agent':'Nokia6600/1.0 (3. ...

  2. 用pyspider爬取并解析json字符串

    获取堆糖网站所有用户的id 昵称及主页地址 #!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2016-06-21 13:57: ...

  3. apache官方供下载所有项目所有版本的官方网站地址

    Apache官网有一个列举apache所有发布的项目的各个版本的官方网站,现在在此记录下来供大家快速浏览使用. 网站地址如下: http://archive.apache.org/dist/

  4. Python3爬取王者官方网站英雄数据

    爬取王者官方网站英雄数据 众所周知,王者荣耀已经成为众多人们喜爱的一款休闲娱乐手游,今天就利用python3 爬虫技术爬取官方网站上的几十个英雄的资料,包括官方给出的人物定位,英雄名称,技能名称,CD ...

  5. 中国农产品信息网站scrapy-redis分布式爬取数据

    ---恢复内容开始--- 基于scrapy_redis和mongodb的分布式爬虫 项目需求: 1:自动抓取每一个农产品的详细数据 2:对抓取的数据进行存储 第一步: 创建scrapy项目 创建爬虫文 ...

  6. 轻奢请向历史SAY NO_重青网_重庆青年报_重庆青年报电子版_重庆青年报网站_重庆青年报官方网站

    轻奢请向历史SAY NO_重青网_重庆青年报_重庆青年报电子版_重庆青年报网站_重庆青年报官方网站 轻奢请向历史SAY NO 经济学家George Taylor在他著名的"裙摆指数" ...

  7. XCodeGhost表明:为了安全,开发工具应该从官方网站下载

    今天的热门话题就是XCode编译器,这个神器在火热的移动互联网浪潮下也被人利用了,据文章分析 (XCode编译器里有鬼 - XCodeGhost样本分析)http://www.huochai.mobi ...

  8. 微软官方网站线上兼容测试平台-Browser screenshots

    前端开发时最不想做的就是在不同浏览器.平台和分辨率测试网页显示效果,通常这会浮现许多问题,尤其浏览器版本就可能让显示成效完全不同,也只好尽力维持让每一种设备都能正常浏览网页.修改到完全没有问题必须投入 ...

  9. 海蜘蛛网络科技官方网站 :: 做最好的中文软路由 :: 软件路由器 :: 软路由 :: 软件路由 :: RouterOs

    海蜘蛛网络科技官方网站 :: 做最好的中文软路由 :: 软件路由器 :: 软路由 :: 软件路由 :: RouterOs 企业简介 武汉海蜘蛛网络科技有限公司成立于2005年,是一家专注于网络新技术研 ...

随机推荐

  1. Android(java)学习笔记100:android开发中修改字体

    首先如果android内部自带的字体不是我们需要的字体,那我们就需要字体文件导入到android开发工程中,下午我们详细讲述: 1.我们首先分析知道,我想要TextView控件中文字的字体是:华文楷体 ...

  2. github使用成长记

    学校里一直都有自己写一些网页,一方面为了学习熟练技能,另一方面也是兴趣所在.但是独乐乐不如众乐乐,一直向往有那么一个平台能把自己做得东西分享给广大网友,并且想借着分享的契机和各位程序猿交流学习心得(这 ...

  3. ArcGIS Server 10.2 实战(四)格栅动态配色服务

    当你的地理处理服务输出的是格栅,那个不可避免地需要为格栅的各类型数据添加不同色彩进行区分,而默认时格栅的色彩是随机的,或者固定死一套着色方案是也显得不够人性化,难以满足多样的客户需求,下面谈谈如何解决 ...

  4. 虚拟机中Ubuntu设置固定IP方法

    --2013年7月29日20:39:16 场景:在搭建hadoop分布式系统的时候,每次重启节点,节点对应的ip发生变化,现在需要将每个节点绑固定的ip --原理: 设置节点用的网卡->绑定ip ...

  5. 转:XMPP协议、MQTT协议、HTTP协议、CoAP协议的基本比较

    一.先看下相关国外的专业数据对四大协议的比较: Protocol                                    CoAP                         XMP ...

  6. linux下svn命令常用操作

    1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain 简写:s ...

  7. javascript基础知识--函数定义

    函数声明式 function funname( 参数 ){ ...执行的代码 } 声明式的函数并不会马上执行,需要我们调用才会执行:funname(); * 分号是用来分隔可执行JavaScript语 ...

  8. 我的jquery之路

    不知不觉jquery已经看完了. 以前不知道jquery是什么,现在依然不是很清晰.或许学习的结果就是这样吧,忘记你所学的.

  9. HDOJ2030汉字统计

    汉字统计 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  10. JS调用iframe方式实现Web区域打印页面内容

    1.程序说明 1) 此程序可以实现选择页面中的区域进行打印,以iframe方式进行打印: 2) 与原生态的print() 区别在于,取消打印页面后可以完整保留当前访问页面的内容. 2.代码部分 1) ...