返回介绍

9.4 宝马

发布于 2024-02-05 23:37:18 字数 3864 浏览 0 评论 0 收藏 0

宝马官方网站中有一个查询本地经销商的搜索工具,其网址为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是指填充模式的JSONJSON 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文