鱼C论坛

 找回密码
 立即注册
查看: 2776|回复: 11

[已解决]求奥迪官方经销商相关信息python爬虫代码

[复制链接]
发表于 2021-3-15 10:43:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大神好:

求奥迪官方经销商信息(经销商名称、省份、城市、地址、电话等))代码!
因为我只学过requests和beautifulsoup,如果可以的话,请使用这个,感谢!
最佳答案
2021-3-16 00:25:16
本帖最后由 YunGuo 于 2021-3-16 15:10 编辑
  1. import re
  2. import csv
  3. import requests

  4. def get_js():
  5.     url = 'https://contact.audi.cn/dictionary_js/map_dealer.js?v=0.3'
  6.     res = requests.get(url)
  7.     js = re.findall(r'var dealers = \[];(.*?)type\[0]', res.text, re.S)[0]
  8.     return js

  9. def get_city(js):
  10.     # 获取省份
  11.     provinces = re.findall("dprovinces\[\d+\]=\['(\d+)','\w(.*?)'\];", js)
  12.     province_dic = {code : province_name for code, province_name in provinces}
  13.     # 获取城市
  14.     city_infos = re.findall(r"dcitys\['(\d+)'\]=(.*?);", js)
  15.     citys_dic = {}
  16.     for city_info in city_infos:
  17.         c_code, citys = city_info
  18.         cit = {city[0]: city[1][2:] for city in eval(citys)}
  19.         citys_dic.update({province_dic[c_code]: cit})
  20.     return citys_dic

  21. def get_distributor(js, citys_dic):
  22.     # 获取经销商信息
  23.     distributor_infos = re.findall(r"dealers\['(\d+)'\]=(.*?);", js)
  24.     distributor_dic = {}
  25.     distributor_lis = []
  26.     for distributor_info in distributor_infos:
  27.         codes, infos = distributor_info
  28.         province = ''
  29.         city = ''
  30.         for k,v in citys_dic.items():
  31.             for kk,vv in v.items():
  32.                 if codes == kk:
  33.                     province = k
  34.                     city = vv
  35.                     break
  36.         for info in eval(infos):
  37.             distributor_name = info[1]
  38.             distributor_add = info[4]
  39.             distributor_tel = f'{info[-1]}-{info[3]}'
  40.             distributor_lis.append([province, city, distributor_name, distributor_add, distributor_tel])
  41.     return distributor_lis

  42. def save(item):
  43.     # 保存
  44.     with open('audi.csv', 'a', newline='') as f:
  45.         writer = csv.writer(f)
  46.         writer.writerow(['省份', '城市', '经销商', '地址', '联系方式'])
  47.         writer.writerows(item)
  48.     print('保存完成')

  49. if __name__ == '__main__':
  50.     js_code = get_js()
  51.     city_info = get_city(js_code)
  52.     distributor_lis = get_distributor(js_code, city_info)
  53.     save(distributor_lis)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-15 10:44:18 | 显示全部楼层
网站发一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-15 13:37:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-15 15:09:18 | 显示全部楼层
这有点南,我尽力了首先,要知道所有的代码在哪,可以从文件入手,如图0.这就找到了
然后按照网址进入     【传送门】   
你看看它的源码图1
代码如下

  1. import re
  2. import requests as r

  3. headers={"User-Agent":
  4.         "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0"}
  5. url = 'https://contact.audi.cn/dictionary_js/map_dealer.js?v=0.3'

  6. res = r.get(url,headers=headers)
  7. res.encoding                                               #解码,不然是繁体字
  8. l = re.findall(r'dealers.+]', res.text)
复制代码
这里只好用正则,不然没法弄然后得到一个列表,里面就是一切信息,不过我后面也化简不了了,只能先这样了
然后就是你为什么要爬这个网站,用课上教的例子随便写写它不香吗ε=( o`ω′)ノ


图0

图0

图1

图1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 00:25:16 | 显示全部楼层    本楼为最佳答案   
本帖最后由 YunGuo 于 2021-3-16 15:10 编辑
  1. import re
  2. import csv
  3. import requests

  4. def get_js():
  5.     url = 'https://contact.audi.cn/dictionary_js/map_dealer.js?v=0.3'
  6.     res = requests.get(url)
  7.     js = re.findall(r'var dealers = \[];(.*?)type\[0]', res.text, re.S)[0]
  8.     return js

  9. def get_city(js):
  10.     # 获取省份
  11.     provinces = re.findall("dprovinces\[\d+\]=\['(\d+)','\w(.*?)'\];", js)
  12.     province_dic = {code : province_name for code, province_name in provinces}
  13.     # 获取城市
  14.     city_infos = re.findall(r"dcitys\['(\d+)'\]=(.*?);", js)
  15.     citys_dic = {}
  16.     for city_info in city_infos:
  17.         c_code, citys = city_info
  18.         cit = {city[0]: city[1][2:] for city in eval(citys)}
  19.         citys_dic.update({province_dic[c_code]: cit})
  20.     return citys_dic

  21. def get_distributor(js, citys_dic):
  22.     # 获取经销商信息
  23.     distributor_infos = re.findall(r"dealers\['(\d+)'\]=(.*?);", js)
  24.     distributor_dic = {}
  25.     distributor_lis = []
  26.     for distributor_info in distributor_infos:
  27.         codes, infos = distributor_info
  28.         province = ''
  29.         city = ''
  30.         for k,v in citys_dic.items():
  31.             for kk,vv in v.items():
  32.                 if codes == kk:
  33.                     province = k
  34.                     city = vv
  35.                     break
  36.         for info in eval(infos):
  37.             distributor_name = info[1]
  38.             distributor_add = info[4]
  39.             distributor_tel = f'{info[-1]}-{info[3]}'
  40.             distributor_lis.append([province, city, distributor_name, distributor_add, distributor_tel])
  41.     return distributor_lis

  42. def save(item):
  43.     # 保存
  44.     with open('audi.csv', 'a', newline='') as f:
  45.         writer = csv.writer(f)
  46.         writer.writerow(['省份', '城市', '经销商', '地址', '联系方式'])
  47.         writer.writerows(item)
  48.     print('保存完成')

  49. if __name__ == '__main__':
  50.     js_code = get_js()
  51.     city_info = get_city(js_code)
  52.     distributor_lis = get_distributor(js_code, city_info)
  53.     save(distributor_lis)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-16 09:08:43 | 显示全部楼层
柿子饼同学 发表于 2021-3-15 15:09
这有点南,我尽力了首先,要知道所有的代码在哪,可以从文件入手,如图0.这就找到了
然后按照网 ...

谢谢大神,因为实际当中需要用这个,自己在爬取的时候,感觉书上的都用不到,挫败感十足。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-16 09:09:35 | 显示全部楼层

我刚才在pycharm上试了一下,还没有通过,不过先给最佳答案了,大神!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 15:08:49 | 显示全部楼层
本帖最后由 YunGuo 于 2021-3-16 15:12 编辑
不分南北东西 发表于 2021-3-16 09:09
我刚才在pycharm上试了一下,还没有通过,不过先给最佳答案了,大神!


我运行没有问题。你运行如果有问题,可以把报错信息发给我看看。
另外,之前在复制代码的时候漏了一个引入requests库,上面代码已经重新编辑补上。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-16 20:11:47 | 显示全部楼层
YunGuo 发表于 2021-3-16 15:08
我运行没有问题。你运行如果有问题,可以把报错信息发给我看看。
另外,之前在复制代码的时候漏了一个 ...

运行没有问题了,大神,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-8 10:53:39 | 显示全部楼层
YunGuo 发表于 2021-3-16 15:08
我运行没有问题。你运行如果有问题,可以把报错信息发给我看看。
另外,之前在复制代码的时候漏了一个 ...

大神,你好:
今年3月份的时候,我发子一个求奥迪官方经销商相关信息代码的帖子,当时你帮我解决了。我今天复习代码的时候,有一个地方不太明白,再次请教一下,盼答复,感谢!

url = 'https://contact.audi.cn/dictionary_js/map_dealer.js?v=0.3'
    res = requests.get(url)
    js = re.findall(r'var dealers = \[];(.*?)type\[0]', res.text, re.S)[0]
    return js
倒数第二行[0]是什么意思啊(我自行运行了一下,如果没有[0]就不会换行),感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-8 11:00:27 From FishC Mobile | 显示全部楼层
不分南北东西 发表于 2021-6-8 10:53
大神,你好:
今年3月份的时候,我发子一个求奥迪官方经销商相关信息代码的帖子,当时你帮我解决了。我 ...

re.findall返回的是一个列表
[0]就是第一个元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-8 21:34:54 | 显示全部楼层
wp231957 发表于 2021-6-8 11:00
re.findall返回的是一个列表
[0]就是第一个元素

谢谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 14:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表