9.4 宝马
宝马官方网站中有一个查询本地经销商的搜索工具,其网址为https://www.bmw.de/de/home.html?entryType=dlo ,界面如图9.8所示。
图9.8
该工具将地理位置作为输入参数,然后在地图上显示附近的经销商地点,比如在图9.9中以Berlin 作为搜索参数。
图9.9
使用Firebug,我们会发现搜索触发了如下AJAX请求。
https://c2b-services.bmw.com/c2b-localsearch/services/api/v3/ clients/BMWDIGITAL_DLO/DE/ pois?country=DE&category=BM&maxResults=99&language=en& lat=52.507537768880056&lng=13.425269635701511
这里,maxResults 参数被设为99 。不过,我们可以使用第1章中介绍的技术增大该参数的值,以便在一次请求中下载所有经销商的地点。下面是将maxResults 的值增加到1000 时的输出结果。
>>> url = 'https://c2b-services.bmw.com/ c2b-localsearch/services/api/v3/clients/BMWDIGITAL_DLO/DE/ pois?country=DE&category=BM&maxResults=%d&language=en& lat=52.507537768880056&lng=13.425269635701511' >>> jsonp = D(url % 1000) >>> jsonp 'callback({"status":{ ... })'
AJAX请求提供了JSONP 格式的数据,其中JSONP是指填充模式的JSON (JSON with padding )。这里的填充通常是指要调用的函数,而函数的参数则为纯JSON数据,在本例中调用的是callback 函数。要想使用Python的json 模块解析该数据,首先需要将填充部分截取掉。
>>> import json >>> pure_json = jsonp[jsonp.index('(') + 1 : jsonp.rindex(')')] >>> dealers = json.loads(pure_json) >>> dealers.keys() [u'status', u'count', u'translation', u'data', u'metadata'] >>> dealers['count'] 731
现在,我们已经将德国所有的宝马经销商加载到JSON对象中,可以看出目前总共有731个经销商。下面是第一个经销商的数据。
>>> dealers['data']['pois'][0] {u'attributes': {u'businessTypeCodes': [u'NO', u'PR'], u'distributionBranches': [u'T', u'F', u'G'], u'distributionCode': u'NL', u'distributionPartnerId': u'00081', u'fax': u'+49 (30) 20099-2110', u'homepage': u'http://bmw-partner.bmw.de/ niederlassung-berlin-weissensee', u'mail': u'nl.berlin@bmw.de', u'outletId': u'3', u'outletTypes': [u'FU'], u'phone': u'+49 (30) 20099-0', u'requestServices': [u'RFO', u'RID', u'TDA'], u'services': []}, u'category': u'BMW', u'city': u'Berlin', u'country': u'Germany', u'countryCode': u'DE', u'dist': 6.65291036632401, u'key': u'00081_3', u'lat': 52.562568863415, u'lng': 13.463589476607, u'name': u'BMW AG Niederlassung Berlin Filiale Wei\xdfensee', u'postalCode': u'13088', u'street': u'Gehringstr. 20'}
现在可以保存我们感兴趣的数据了。下面的代码片段将经销商的名称和经纬度写入一个电子表格当中。
with open('bmw.csv', 'w') as fp: writer = csv.writer(fp) writer.writerow(['Name', 'Latitude', 'Longitude']) for dealer in dealers['data']['pois']: name = dealer['name'].encode('utf-8') lat, lng = dealer['lat'], dealer['lng'] writer.writerow([name, lat, lng])
运行该示例后,得到的bmw.csv 表格中的内容类似如下所示。
Name,Latitude,Longitude BMW AG Niederlassung Berlin Filiale Weißensee,52.562568863415, 13.463589476607 Autohaus Graubaum GmbH,52.4528925,13.521265 Autohaus Reier GmbH & Co. KG,52.56473,13.32521
从宝马官网抓取数据的完整源代码可以从https://bitbucket.org/ wswp/code/src/tip/chapter09/bmw.py 获取。
翻译外文内容
你可能已经注意到宝马的第一个截图(见图9.8)是德文的,而第二个截图(见图9.9)是英文的。这是因为第二个截图中的文本使用了Google翻译的浏览器扩展进行了翻译。当尝试了解如何在外文网站中定位时,这是一个非常有用的技术。宝马官网在经过翻译后,仍然可以正常运行。不过还是要当心Google翻译可能会破坏一些网站的正常运行,比如依赖原始值的表单,其中的下拉菜单内容被翻译时就会出现问题。
在Chrome中,Google翻译可以通过安装`Google Translate`扩展获得;在Firefox中,可以安装`Google Translator`插件;而在IE中,则可以安装`Google Toolbar`。此外,还可以使用`http://translate.google.com`进行翻译,不过这样通常会打断原有功能,因为要从Google的网站中获取相关内容。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论