精华内容
下载资源
问答
  • 高德地图爬虫

    千次阅读 2019-02-27 11:11:13
    高德地图爬虫 工具:Pycharm,win10,Python3.6.4 1.需求分析 这篇爬虫和上一篇百度地图爬虫要求一样,百度地图爬虫我发现有一个auth参数会一直变化,一旦变化则获取的数据是不准确的,所以我上高德地图看了一下,...

    高德地图爬虫

    工具:Pycharm,win10,Python3.6.4

    1.需求分析

    这篇爬虫和上一篇百度地图爬虫要求一样,百度地图爬虫我发现有一个auth参数会一直变化,一旦变化则获取的数据是不准确的,所以我上高德地图看了一下,高德地图没有这个反爬机制。但是高德地图大概爬取120个页面就会跳一次验证码,我这里是通过换IP解决这个问题的。

    2.数据准备

    同样我们需要全国地级市信息,用之前的数据即可

    3.爬虫思路

    首先打开高德地图搜索一个城市的养老院数量,看看需要的参数有哪些,已经我们要的信息在什么地方。

    按照这个步骤我们就能看到我们要的养老院数量就存放在这个位置,我们只需要获取该网页即可获取信息。网页参数如下

    红色方框即为我们需要的参数,有些参数可以省略,这个自行尝试。

    代码如下:

    import requests
    import json
    import xlwt
    from urllib.parse import urlencode
    import xlrd
    
    # 设置请求头,模拟浏览器访问
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
    }
    
    
    def get_page(keyword1, keyword2):
        try:
            data = {
                # 'wd': keyword1+keyword2,  # 修改关键字
                'query_type': 'TQUERY',
                'pagesize': '20',
                'pagenum': '1',
                'qii': 'true',
                'cluster_state': '5',
                'need_utd': 'true',
                'utd_sceneid': '1000',
                'div': 'PC1000',
                'addr_poi_merge': 'true',
                'is_classify': 'true',
                'zoom': '12',
                # 'city': '310000',
                # 'geoobj': '121.184146|31.118573|121.678531|31.212581',
                'keywords': keyword1 + keyword2,
            }
            # 把字典对象转化为url的请求参数
            url = 'https://www.amap.com/service/poiInfo?' + urlencode(data)
            # print(url)
            response = requests.get(url, headers=headers, timeout=60)
            response.encoding = 'utf-8'
            html = response.text
            # print(html)
            return html
        except:
            get_page(keyword1, keyword2)
    
    
    def parse_page(html):
        try:
            html = json.loads(html)
            # print(html)
            num = html['data']['total']
            # print(num)
            return num
        except:
            return '0'
    
    
    def write2excel(keywords1, nums, keyword2):
        book = xlwt.Workbook()
        sheet = book.add_sheet('sheet1')
        hang = 0
        for i in range(len(keywords1)):
            lie = 0
            sheet.write(hang, lie, keywords1[i])
            lie += 1
            sheet.write(hang, lie, str(nums[i]))
            hang += 1
        book.save(keyword2 + '.xls')
    
    
    def readExcel(filename):
        keywords = []
        # 打开文件
        wordbook = xlrd.open_workbook(filename)
        # 获取sheet4
        Sheet4 = wordbook.sheet_by_name('Sheet4')
        # 获取sheet4的第一列
        cols = Sheet4.col_values(0)
        for col in cols:
            keywords.append(col.strip())
        return keywords
    
    
    if __name__ == '__main__':
        keywords2 = ['养老院', '敬老院', '养老中心', '养老公寓']
        # keywords2 = ['养老院']
        for keyword2 in keywords2:
            nums = []
            keywords1 = readExcel('2.xls')
            # keywords1 = ['合肥市肥西县']
            for i in range(len(keywords1)):
                html = get_page(keywords1[i], keyword2)
                num = parse_page(html)
                nums.append(num)
                # print(type(nums[0]))
                print(keywords1[i], num)
    
            write2excel(keywords1, nums, keyword2)
    

     

    展开全文
  • 1、由于高德地图有20*45条poi的限制,所以每次能爬取45页,需要尽可能的缩小爬取范围,才能尽可能多的获取poi数据; 2、所以我们最应该考虑的问题是缩小范围,利用程序对城市内每一个区县行政区分别进行爬虫,以获取...
  • 本文将从高德地图api获取开始讲起,希望能帮助大家真正理解高德地图到底能为我们的工作和学习做些什么,其次,本文从实例出发,为大家讲解利用高德地图给我们提供的poi编码和城市编码,通过python3.7和pyinstaller...

    一、关于高德地图

    高德是中国领先的数字地图内容、导航和位置服务解决方案提供商。高德地图产品更多的还是我们查找位置和路线的一个工具,但实际上地图能够实现的层面还有很多,甚至是将现实的商家店铺以及场所搬至虚拟的地图上,然后每个地理位置对应的是一个POI点。这样一来,地图呈现的将不再是一张标有地理位置的图片,而是一个虚拟的现实世界。POI编码表
    poi编码表(更新时间2017年8月10日)

    二、简述爬虫原理

    这个世界上最大的网络爬虫是搜索引擎(百度、谷歌等),通过网址、关键词模糊查询等方式就可以返回一个网页或者众多的词条数据。只不过我们需要通过机器语言(python、java等)对这些数据的源码进行解析才能使其成为结构化的数据(csv、xlsx等格式),便于我们分析和处理。(如果有需要爬虫一般网页(淘宝、链家网)数据的同学,后期我会更新这方面的内容)
    地图和一般的网页数据有一点区别,是因为地图和有道词典在线翻译类似,使用了一种非常简便的网页开发技术–Ajax。
    高德地图中整合了众多深度POI点,这些POI点也就是高德地图搜索内容中的23个关键词类别。当我们需要在高德地图上搜索某个地点(poi)时,需要输入这个地点关键词。然后高德地图就会返回与这个关键词匹配的地点(poi),这是一种最简单的爬虫,既不能以某种格式(csv或xlsx)储存在我们的电脑中(只能在浏览器或app中查看),返回的poi数量也非常有限。
    高德地图已开放地图基础服务API接口,我们可以从这个接口获取高德地图的各种数据,今天我们只对poi数据爬取进行讲解。

    三、申请高德地图开发者账户

    地址:https://lbs.amap.com/
    一般情况下,申请成为个人开发者:填写个人信息(包括:姓名、手机、邮箱等),信息验证成功后,即可成为高德个人开发者。

    四、申请key

    控制台→应用管理→我的应用→创建新应用→添加key(非常简单,不赘述)基础服务API调用量

    五、通过python实现高德地图poi数据的爬虫

    1、查阅高德城市编码表(地址:https://lbs.amap.com/api/webservice/download)
    2、找到需要的城市,复制adcode,比如北京市;
    城市编码(北京)
    3、代码:

    import requests
    import pandas as pd
    import json
    import time
    import math
    
    ad = input("请输入需要爬取的城市名称:")
    #感谢郑允豪@Smart3S的基础代码和思路,划分城市行政区的方式,帮我们实现了突破高德地图20*45条限制。
    #由于篇幅限制,下述其他城市行政区代码,读者可自行根据高德地图官方提供的城市编码进行添加。
    if ad == "天津市":
    	arr=['120101','120102','120103','120104''120105','120106','120110','120111','120112','120113','120114','120115','120116','120117','120118','120119']
    elif ad == "北京市":
        arr=['110101','110102','110105','110106','110107','110108','110109','110111','110112','110113','110114','110115','110116','110117','110118','110119']
    
    
    key_word = input("请输入需要爬取的关键词:")
    key_=input("请输入高德地图控制台key密钥(数据量大时需申请多个密钥):")
    url1="https://restapi.amap.com/v3/place/text?keywords="+str(key_word)+"&city="
    url2="&output=JSON&offset=20&key="+str(key_)+"&extensions=all&page="
    x=[]
    num=0
    for i in range(0,len(arr)):
            city=arr[i]
            for page in range(1,46):
                if page==45:
                    print("警告!!POI检索可能受到限制!!")
                thisUrl=url1+city+url2+str(page)
                data=requests.get(thisUrl)
                s=data.json()
                aa=s["pois"]
                if len(aa)==0:
                    break
                for k in range(0,len(aa)):
                        s1=aa[k]["name"]
                        s2=aa[k]["type"]
                        s3=aa[k]["address"]
                        s4=aa[k]["adname"]
                        s5=aa[k]["location"].split(",")
                        x.append([s1,s2,s3,s4,float(s5[0]),float(s5[1])])
                        num+=1
                        print("爬取了 "+str(num)+" 条数据")
     
    c = pd.DataFrame(x)
    #可更换存储路径
    c.to_csv('**E:/高德地图爬取/**'+str(key_word)+'('+str(ad)+')'+'.csv',encoding='utf-8-sig')
    
    print(str(key_word)+'('+str(ad)+')'+'数据爬取完毕!')
    print('100秒后,将关闭此窗口!')
    time.sleep(100)
    

    六、pyinstaller打包.py文件成.exe可执行文件

    安装pyinstaller

    .py文件只能在装有python环境的设备上运行,如果一个设备没有安装python及需要的第三方库,是无法运行.py文件的。
    如果你编写了一个python程序,需要分享给你的一个朋友,恰巧你朋友的设备没有安装python,这是就需要用到pyinstaller了,打包成exe文件后可在同类型的系统中运行。
    方法一:打开CMD,运行pip install pyinstaller
    不行?试试第二种方法,设置延迟,添加国内源
    方法二:打开CMD,运行pip install pyinstaller --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple
    不行?试试第三种方式,下载pyinstaller
    方法三:1、下载pyinstaller,地址:http://www.pyinstaller.org/downloads.html
    2、将其解压至python安装目录下
    3、打开CMD,运行cd C:\Program Files\Python37-32\PyInstaller-3.5
    python setup.py install

    pyinstaller打包.py

    方法一:在xxx.py同目录下按住shift右键打开CMD(命令窗口),运行pyinstaller -F xxx.py
    如果你这样能打包成功并且能够成功运行,那么恭喜你,hin优秀!
    如果不行,我说一下我遇到的坑。。。。。。
    1、递归深度问题
    Python默认的递归深度是有限制的,当递归深度超过默认值的时候,用pyinstaller打包时
    就会引发RecursionError:maximum recursion depth exceeded while calling a python object。
    这个问题一般会出现在执行“方法一”后出现下图的情况:递归错误
    解决方法:最大递归层次的重新调整,解决方式是手工设置递归调用深度。
    我的解决方式需要用到执行“方法一”后生成在同目录下的一个文件——xxx.spec,用记事本打开添加下列语句:
    import sys
    sys.setrecursionlimit(10000)递归错误解决方式
    之后,我们需要对xxx.spec文件进行打包操作。
    2、lib not found
    在同目录下右键打开CMD,执行pyinstaller -F xxx.spec
    出现了这个问题:缺乏依赖
    解决方法:上图(1)libzmq.cp37-win32.pyd;
    (2)C:\Program Files\Python37-32\Lib\site-packages\zmq\backend\cython,
    一个文件,一个路径,这代表什么呢?
    教大家一个出现类似问题的解决方式:在路径中没有找到该文件,很简单,我们在python安装路径下查找一下该文件,发现它在C:\Program Files\Python37-32\Lib\site-packages\zmq中,我们把这个文件复制到C:\Program Files\Python37-32\Lib\site-packages\zmq\backend\cython中就ok了。依赖缺乏解决
    3、缺乏numpy模块
    终于生成了xxx.exe文件,运行一下,又出现了一个问题:numpy缺乏
    解决方法:缺乏numpy模块,不一定是你没有安装,如果是,请安装;下面我说说安装了numpy也出现问题的情况,问题可能在版本上;
    打开CMD,执行两行代码:(1)pip uninstall numpy (2)pip install numpy==1.16.2

    完美解决!!!!!!!!!!

    七、POI.exe功能简述

    此程序要实现的功能是输入城市名称(市级)、关键词、key,3个参数,获取城市范围内所有区(县)的“关键词”poi数据。
    思路:1、由于高德地图有20*45条poi的限制,所以每次能爬取45页,需要尽可能的缩小爬取范围,才能尽可能多的获取poi数据;
    2、所以我们最应该考虑的问题是缩小范围,利用程序对城市内每一个区县行政区分别进行爬虫,以获取最大poi数量;

    八、运行POI.exe

    1、双击POI.exe
    2、由于key的输入有点困难,我们通常需要复制,在打开程序后需要右击程序上边缘→属性→勾选“快速编辑模式”(定位好光标,右键即可粘贴)快速编辑模式
    3、输入城市名称(例如广州市):
    输入城市名称
    4、输入关键词(例如学校)、key(前面有申请方式):
    输入关键词、key
    5、爬虫结束
    爬虫结束
    6、查看爬虫结果(注:存储为.csv文件,在E:/高德地图爬取/文件中(可在程序中更改存储路径),此数据可利用后两列(4、5)坐标–火星坐标系,在gis中进行可视化)
    爬虫结果

    九、总结

    1、利用python编写爬虫程序,优点就是语句简洁,上手简单;
    2、python依赖的第三方库非常多,下载安装常常会出现问题,需多在百度、CSDN上查找类似问题的解决方式;
    3、python非常不适合可执行文件.exe的编写,打包问题非常多,所以还是尽量在python环境中直接运行;
    4、本文编写的POI.exe程序在win32系统中打包,所以可能只能在类似环境中运行;
    5、爬虫结果可在gis中进行可视化,如需坐标转换,请自行研究。

    展开全文
  • 高德地图美食爬虫

    2020-06-29 16:10:37
    前言:今天讲下高德地图全国美食爬虫。 反爬点: 高德地图反爬主要是: 1.IP代理。 2.headers(referer,cookie必要的),referer:随便个可以不变。cookie:必要的参数:isg,l,cna(可自行数字大小写字母组合),uab_...

    前言:今天讲下高德地图全国美食爬虫。

    反爬点:

    高德地图反爬主要是:

    1.IP代理。

    2.headers(referer,cookie必要的),referer:随便个可以不变。cookie:必要的参数:isg,l,cna(可自行数字大小写字母组合),uab_collina(固定值)

    3.限制最大45页,可地区精确到区及二级分类精确到火锅来尽可能最大获取,避免最大页数问题.

    
    import requests,random,string,time,pymongo,re,json,datetime,logging
    from Config import Config
    from urllib import parse
    logging.basicConfig(filename="show.log",filemode="a",format="%(asctime)s-%(name)s-%(levelname)s-%(message)s",level=logging.INFO)
    
    
    class Amap(object):
        def __init__(self):
            self.isg = 'XXXX'
            self.l = 'XXX'
            self.cna = 'XXXX' 
    
    
        def get_pro(self):
            get_pro_list = self.post_city.find({})
            for get_pro in get_pro_list[9:]:
                print('begin......{}'.format(get_pro['pro_name']))
                pro_name = get_pro['pro_name']
                for every_city in get_pro['city_list']:
                    choose_city = every_city
                    city_name = choose_city['city_name']
                    print('begin city ....{}'.format(city_name))
                    city_adcode = choose_city['city_adcode']
                    # 1获取城市所有区及美食二级分类
                    show_url = 'https://www.amap.com/service/poiInfo?query_type=TQUERY&pagesize=20&pagenum=1&qii=true&cluster_state=5&need_utd=true&utd_sceneid=1000&div=PC1000&addr_poi_merge=true&is_classify=true&zoom=17&city={}&geoobj=121.9098|25.510585|111.923414|24.516816&_src=around&keywords=美食'.format(city_adcode)
                    headers = self.get_headers(city_adcode)
                    show_json = self.request_url(show_url,headers)
                    # print('11111',show_json)
                    if show_json:
                        # 区分类
                        area_list = []
                        if 'bizAreaData' in show_json:
                            districts = show_json['bizAreaData']['districts']
                            for k in districts:
                                area_dict = {}
                                area_dict['area_name'] = k['name']
                                area_dict['area_value'] = k['districts']
                                area_list.append(area_dict)
                            self.deal_areas(pro_name, city_name, city_adcode, area_list)
                        else:
                            print('该市并未有区......')
                            area_list = []
                            self.deal_areas(pro_name, city_name, city_adcode, area_list)
    
                    else:
                        print('{} 未获取到 json数据.......'.format(city_name))
    
    
    
    
        def deal_areas(self,pro_name,city_name,city_adcode,area_list):
            classify_list = Config.classify_list
            if len(area_list) > 0:
                for j in area_list:
                    area_name = j['area_name']
                    area_site_list = j['area_value']
                    for k in area_site_list:
                        if re.search('全部',k['name']):
                            continue
                        else:
                            area_site_adcode = k['adcode']
                            area_site_name = k['name']
                            for m in classify_list:
                                classify_name = m['classify_name']
                                classify_value = m['classify_value']
                                print('{}...{}..{}.get shop {} begin.....'.format(city_name, area_name, area_site_name,
                                                                                  classify_name))
                                self.deal_information(pro_name,city_name,city_adcode,area_name,area_site_adcode,area_site_name,classify_name,classify_value)
            else:
                print('该市分区为0..........')
                area_name = ''
                area_site_adcode = ''
                area_site_name = ''
                classify_list2 = Config.classify_list2
                for m in classify_list2:
                    classify_name = m['classify_name']
                    second_classify_list = m['second_list']
                    if len(second_classify_list) > 0:
                        for l in second_classify_list:
                            print('{}...{}..{}.get shop {} begin.....'.format(city_name, area_name, area_site_name,
                                                                              classify_name))
                            self.deal_other_information(pro_name, city_name, city_adcode, area_name, area_site_adcode, area_site_name,
                                                  classify_name,l)
                    else:
                        print('{}...{}..{}.get shop {} begin.....'.format(city_name, area_name, area_site_name,
                                                                          classify_name))
                        self.deal_other_information(pro_name, city_name, city_adcode, area_name, area_site_adcode,
                                                    area_site_name,
                                                    classify_name, '')
    
    
        def deal_other_information(self,pro_name, city_name, city_adcode, area_name, area_site_adcode, area_site_name,
                                                  classify_name,second_classify_str):
            if second_classify_str:
                second_un = parse.quote(second_classify_str)
            else:
                second_un = parse.quote(classify_name)
            geoobj = parse.quote('')
            i = 1
            a = 0
            while True:
                url = 'https://ditu.amap.com/service/poiInfo?query_type=TQUERY&pagesize=20&pagenum={}&qii=true&cluster_state=5&need_utd=true&utd_sceneid=1000&div=PC1000&addr_poi_merge=true&is_classify=true&zoom=14.18&city={}&geoobj={}&keywords={}'.format(str(i),city_adcode,geoobj,second_un)
                headers = self.get_headers(city_adcode)
                resp_json = self.request_url(url,headers)
                if resp_json:
                    shop_total = int(resp_json['data']['total'])
                    print('总共{}个店铺'.format(resp_json['data']['total']))
                    if 'poi_list' in resp_json['data']:
                        now_num = len(resp_json['data']['poi_list'])
                        a += now_num
                    else:
                        break
                    print('当前已爬取{}个店铺'.format(a))
                    if shop_total > 0:
                        for j in resp_json['data']['poi_list']:
                            shop_id = j['id']
                            shop_name = j['name']
                            # print(shop_name)
                            shop_address = j['address']
                            # print(shop_address)
                            shop_tel = j['tel']
                            shop_latitude = j['latitude']
                            shop_longitude = j['longitude']
                            if 'value' in j['domain_list'][8]:
                                second_classify = j['domain_list'][8]['value']
                            else:
                                second_classify = ''
                            self.save_info(pro_name, city_name, area_name, area_site_name, classify_name, shop_id, shop_name,
                                           shop_address, shop_tel, shop_latitude, shop_longitude, second_classify)
                    else:
                        print('shop num is none.......')
                        break
                else:
                    print('{}...{}..{}.get shop type  information failed'.format(city_name, area_name, area_site_name))
                    break
                i += 1
    
    
    
        def deal_information(self,pro_name,city_name,city_adcode,area_name,area_site_adcode,area_site_name,classify_name,classify_value):
            geoobj = parse.quote('')
            classify_data = parse.quote('business_area_flag=1;adcode={};custom=business_area:{}+{}+sort_rule=5;reserved_keywords=true'.format(area_site_adcode,area_site_name,classify_value))
            user_loc = parse.quote('')
            need_params = 'city={}&geoobj={}&_src=around&classify_data={}&user_loc={}&keywords=%E7%BE%8E%E9%A3%9F'.format(
                city_adcode, geoobj, classify_data, user_loc)
            i = 1
            a = 0
            while True:
                need_url1 = 'https://www.amap.com/service/poiInfo?query_type=TQUERY&pagesize=20&pagenum={}&qii=true&cluster_state=5&need_utd=true&utd_sceneid=1000&div=PC1000&addr_poi_merge=true&is_classify=true&zoom=17&'.format(str(i))
                every_url = need_url1 + need_params
                headers = self.get_headers(city_adcode)
                resp_json = self.request_url(every_url,headers)
                # print('22222',resp_json)
                if resp_json:
                    shop_total = int(resp_json['data']['total'])
                    print('总共{}个店铺'.format(resp_json['data']['total']))
                    if 'poi_list' in resp_json['data']:
                        now_num = len(resp_json['data']['poi_list'])
                        a += now_num
                    else:
                        break
                    print('当前已爬取{}个店铺'.format(a))
                    if shop_total > 0:
                        for j in resp_json['data']['poi_list']:
                            shop_id = j['id']
                            shop_name = j['name']
                            shop_address = j['address']
                            shop_tel = j['tel']
                            shop_latitude = j['latitude']
                            shop_longitude = j['longitude']
                            if 'value' in j['domain_list'][8]:
                                second_classify = j['domain_list'][8]['value']
                            else:
                                second_classify = ''
                            self.save_info(pro_name,city_name,area_name,area_site_name,classify_name,shop_id,shop_name,shop_address,shop_tel,shop_latitude,shop_longitude,second_classify)
                    else:
                        print('shop num is none.......')
                        break
                else:
                    print('{}...{}..{}.get shop type  information failed'.format(city_name,area_name,area_site_name))
                    break
                i += 1
    
    
        def get_headers(self,city_adcode):
            headers = {
                'Accept': '*/*',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'zh-CN,zh;q=0.9',
                'Host': 'www.amap.com',
                'X-Requested-With': 'XMLHttpRequest',
                'User-Agent': random.choice(Config.pc_user_agent_list),
                'Referer': 'XXXXXXXXXXXXXX'.format(city_adcode),
               isg={}; l={}'.format(cna,
                # isg, l)
                'Cookie': 'cna={}; _uab_collina=XXXXXXXX;isg={}; l={}'.format(cna,isg,l)
    
            }
            return headers
    
        def request_url(self,url,headers):
            i = 0
            while i <=5:
                if i == 5:
                    print('retry five times {}'.format(url))
                    logging.info("get url five times failed %s" % url)
                    return {}
                try:
                    resp = requests.get(url, headers=headers, proxies=Config.proxies, verify=False,timeout=2)
                    # print(resp.text)
                    resp_json = json.loads(resp.text)
                    if 'status' in resp_json:
                        return resp_json
                    else:
                        print('被反爬啦,重新尝试了....{}次'.format(str(i)))
                        i +=1
                        continue
                except Exception as f:
                    print('get json data failed {}'.format(str(f)))
                i += 1
    
    
    

    全国抓取完毕大概是140W 去掉没有联系方式的,只有98W数据,数据量还是不大的。

    本文只供学习。不得用于商业。若侵权,请联系本博主。谢谢。

    展开全文
  • python_爬取高德地图某条公交线路_赠高德地图key 原创不易,转发请带本文链接 使用高德地图可以搜索单条公交线路,使用代码可以一次性爬取高德地图公交 赠送一个企业高德key,大部分高德的接口日访问量30万 88d2e276...

    python_爬取高德地图某条公交线路_赠高德地图key

    原创不易,转发请带本文链接

    使用高德地图可以搜索单条公交线路,使用代码可以一次性爬取高德地图公交
    赠送一个企业高德key,大部分高德的接口日访问量30万
    88d2e276d696bb7d9cbbc748bd11a405

    import json
    import pandas as pd
    import requests
    from utils.geolocataion_converting import gcj02_to_wgs84
    from utils.read_write import writeOneCSV, writeCSV
    
    '''
        此文件用于使用公交线路号爬取指定公交线路数据
    '''
    
    header = {
        'Accept': '*/*',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Connection': 'keep-alive',
        'Host': 'restapi.amap.com',
        'Origin': 'https://restapi.amap.com',
        'Referer': 'https://restapi.amap.com/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0',
    }
    
    # 开始请求高德地图的API
    def get_geo(linename):
        url = "https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key=88d2e276d696bb7d9cbbc748bd11a405&output=json&pageIndex=1&" \
              "city=%E6%B7%B1%E5%9C%B3&offset=1&keywords=" + str(
            linename) + "路" + "&platform=JS&logversion=2.0&appname=file%3A%2F%2F%2FD%3A%2F%25E9%25A1%25B9%25E7%259B%25AE%25E6%2596%2587%25E4%25BB%25B6%2F%25E5%25BB%25BA%25E8%25A7%2584%25E9%2599%25A2%2F%25E5%2589%258D%25E7%25AB%25AF%25E8%258E%25B7%25E5%258F%2596%25E5%2585%25AC%25E4%25BA%25A4%25E8%25B7%25AF%25E7%25BA%25BF%25E6%2595%25B0%25E6%258D%25AE%2Fbus_route.html&csid=D177451A-E355-4D49-A2CB-B87937FD9208&sdkversion=1.4.15"
        try:
            # 添加header
            response = requests.get(url, headers=header)
            data = json.loads(response.text)
            return data
        except ValueError:
            print("出现异常,请重新运行!" + str(ValueError))
    
    
    #把数据处理成arcgis能够处理的线
    def write_polyline(LID, polyline, path):
        lon_lat_list = polyline.split(';')
        geo_list = []
        for index in range(len(lon_lat_list)):
            geo = []
            lonlat = lon_lat_list[index].split(',')
            lon = lonlat[0]
            lat = lonlat[1]
            geo.append(LID)
            geo.append(index)
            geo.append(lon)
            geo.append(lat)
            geo_list.append(geo)
        writeCSV(geo_list, path)
    
    
    def write_polyline_wgs84(LID, polyline, path):
        lon_lat_list = polyline.split(';')
        geo_list = []
        for index in range(len(lon_lat_list)):
            geo = []
            lonlat = lon_lat_list[index].split(',')
            lon = lonlat[0]
            lat = lonlat[1]
            lon = float(lon)
            lat = float(lat)
            lng, lat = gcj02_to_wgs84(lon, lat)
            geo.append(LID)
            geo.append(index)
            geo.append(lng)
            geo.append(lat)
            geo_list.append(geo)
        writeCSV(geo_list, path)
    
    
    def write_bus_stops(LID,all_bus_name, busstops, path):
        bus_station_list = []
        for station in busstops:
            bus_station = []
            name = station['name']
            location = station['location']
            id = station['id']
            sequence = station['sequence']
            lonlat = location.split(',')
            lon = lonlat[0]
            lat = lonlat[1]
            bus_station.append(LID)
            bus_station.append(all_bus_name)
            bus_station.append(name)
            bus_station.append(id)
            bus_station.append(sequence)
            bus_station.append(lon)
            bus_station.append(lat)
            bus_station_list.append(bus_station)
        writeCSV(bus_station_list, path)
    
    
    def write_bus_stops_wgs84(LID,all_bus_name, busstops, path):
        bus_station_list = []
        for station in busstops:
            bus_station = []
            name = station['name']
            location = station['location']
            sequence = station['sequence']
            id = station['id']
            lonlat = location.split(',')
            lon = lonlat[0]
            lat = lonlat[1]
            lon = float(lon)
            lat = float(lat)
            lng, lat = gcj02_to_wgs84(lon, lat)
            bus_station.append(LID)
            bus_station.append(all_bus_name)
            bus_station.append(name)
            bus_station.append(id)
            bus_station.append(sequence)
            bus_station.append(lng)
            bus_station.append(lat)
            bus_station_list.append(bus_station)
        writeCSV(bus_station_list, path)
    
    
    if __name__ == "__main__":
        # 序号	业户名称	 线路编号	起点站	终点站	 上行途径站点	 下行途径站点
        src = 'D:\data\jianguiyaun\\2019年9月深圳公交数据.xlsx'
        geo_path = 'D:\data\jianguiyaun\\深圳单向公交线路数据\\'
        route = pd.read_excel(src)
        route.drop(0)
        for row in route.itertuples(index=True, name='Pandas'):
            LID = getattr(row, '序号')
            bus_name = getattr(row, '线路编号')
            json_data = get_geo(bus_name)
            bus = []
            if int(json_data['count']) > 0:
                id = json_data['buslines'][0]['id']
                start_stop = json_data['buslines'][0]['start_stop']
                end_stop = json_data['buslines'][0]['end_stop']
                company = json_data['buslines'][0]['company']
                basic_price = json_data['buslines'][0]['basic_price']
                citycode = json_data['buslines'][0]['citycode']
                distance = json_data['buslines'][0]['distance']
                bus.append(LID)
                bus.append(id)
                bus.append(bus_name)
                bus.append(start_stop)
                bus.append(end_stop)
                bus.append(citycode)
                bus.append(distance)
                bus.append(company)
                bus.append(basic_price)
                writeOneCSV(bus,geo_path+'geo_bus.csv')
                polyline = json_data['buslines'][0]['polyline']
                write_polyline(LID,polyline,geo_path+'geo_bus_line_GCJ02.csv')
                write_polyline_wgs84(LID, polyline, geo_path + 'geo_bus_line_WGS84.csv')
    
                busstops = json_data['buslines'][0]['busstops']
                write_bus_stops(LID, bus_name,busstops, geo_path + 'geo_bus_station_GCJ02.csv')
                write_bus_stops_wgs84(LID, bus_name,busstops, geo_path + 'geo_bus_station_WGS84.csv')
    

    geolocataion_converting.py
    2019深圳公交线路数据
    read_write.py
    如需帮忙抓取某条公交车线路数据,请私聊我,我这暂时只有深圳的公交线路数据

    展开全文
  • 高德poi爬虫

    2021-04-11 22:52:24
    1. 点位周边搜索 ...pagesize=20&pagenum=1&qii=true&cluster_state=5&need_utd=true&utd_sceneid=1000&div=PC1000&addr_poi_merge=true&is_classify=true&...longitude=116.50
  • 四、完整代码 # encoding: utf-8 ''' @author 李华鑫 @create 2020-10-06 19:46 Mycsdn:https://buwenbuhuo.blog.csdn.net/ @contact: 459804692@qq.com @software: Pycharm @file: 高德地图_每个城市的天气.py @...
  • python_使用地址或公司名_爬虫爬取高德地图_百度地图_腾讯地图经纬度 import os import pandas as pd import urllib.parse import requests from utils.geolocataion_converting import gcj02_to_wgs84 ''' 此文件...
  • python代码,爬虫爬取高德地图POI数据,先注册高德个人账户,获取所需要的key,替代代码中的key,然后更改省市,更改想要的数据类型,python运行即可得到xlse数据
  • 前言目的:本文试图爬取全北京市不同类别POI的所有数据。 大致流程:爬取北京市边界坐标 坐标映射到网格,得到北京市的...但为了方便,可以直接用高德地图的示例操作1.1 打开网址:https://lbs.amap.com/api/webser...
  • 该资源为银川市高德地图poi数据excel文件 爬取的字段包括名称地址经纬度等重要信息进行了全部分类爬取和去重,数据质量有保障!
  • 爬取高德地图全国poi的爬虫

    千次阅读 2019-01-17 16:05:02
    基于python3.6的爬取高德全国poi数据的爬虫,稳定性更高,爬取效率更快,由于高德poi的数据量比较大,这里使用了mongodb和Elasticsearch作为存储,只需要修改key值和types种类即可,每个种类都是遍历全国的抓取. ...
  • 爬虫-高德地图

    千次阅读 2019-09-24 18:50:44
    import requests,random,json from fake_useragent import UserAgent ua = UserAgent() # proxies_list = [{'http': 'http://36.25.243.251:80', 'https': 'http://121.69.26.14:8080'}, # {'http': 'h...
  • Python链家租房信息爬虫高德地图展示

    千次阅读 热门讨论 2019-04-15 12:19:50
    Python链家租房信息爬虫高德地图展示 工具:Pycharm,Win10,Python3.6.4,高德API 1.数据爬取 首先我们明确要获取的信息。我们要北京的东城,西城,朝阳,海淀,丰台这5个地区的租房信息。打开链家租房网站,...
  • 我的环境python2.7。运行后生产csv文件rent.cvs,内容为58同城品牌合租爬取的合租房源数据。使用火狐浏览器访问(谷歌浏览器加载csv时显示跨域问题)
  • 高德地图数据爬取1.爬取思路2.python核心代码二.Arcmap制图1.文本点生成shp代码2.Arcmap设置样式 一.高德地图数据爬取 1.爬取思路 首先,谷歌浏览器打开高德地图官网,点击上方菜单栏地铁进入地铁线路网站如下,点击...
  • 爬虫实战:如何爬取高德地图

    千次阅读 2021-01-26 11:54:42
    提起高德地图,咱们每一个人都不会陌生,高德地图是一款非常好用的地区服务软件,很多用户在出行的时候都会使用这款软件,日程用来导航,也可以用来打车,一次呼叫多种车型,用户可以在这里获得更好的服务,随时都...
  • python爬虫爬取_高德地图_主要城市迁徙意愿排行榜_19年至今数据 还有一点:网站不提供具体人数,如果需要具体人数的话我有联通的2020年1-6月份的扩样后的具体人数数据 如需数据请加我qq,在我博客的其他文章里可以...
  • 高德爬虫2.0

    2021-06-05 00:00:50
    高德爬虫2.0代码感想 代码 # -*- coding:utf-8 -*- ''' gaode.py Created on Fri June 4 2021 @author: Wyt、Fzy ''' from urllib.parse import quote from urllib import request import json import xlwt from...
  • 基于python和amap(高德地图)web api的爬虫,用于搜索某POI点  目的: 通过Python实现的爬虫技术,及高德地图提供的web api,来获取地图上的POI点及其相关信息 方法: 1.通过Python的urllib模块来处理网络请求和...
  • 爬虫】Java关于高德地图爬取数据

    千次阅读 2019-01-16 22:45:05
    不管是目前什么行业,对数据分析和做出合适的判断才是最重要的选择,... 到高德开放平台 | 高德地图API注册账号,并且申请web服务的AK密钥,每次发送请求需要带着这个key去认证。注册账号登陆后点击右上角的控制台 ...
  • 一、工具 ...在高德地图开发文档里面创建应用以后获得自己的key,然后根据需要查看开发文档(本处选择“搜索POI”) 爬取到的数据默认是json格式,通过关键字逐层筛选就可以获得指定信息 在这里插入...
  • 本篇博文就以高德地图展开:https://www.amap.com/ 在打开后,我们发现有一堆div标签,但是并没有我们需要的数据,这个时候就可以判定其为动态网页,这个时候,我们就需要找接口 点击网络标签,我们可以看到网页向...
  • python爬取高德地图.zip

    2020-07-05 16:49:14
    Python爬取高德地图查询各城市天气。爬虫练习项目之一。从高德地图json数据接口获取天气,exe文件
  • 上传一个之前数据爬取过程中,编写的一个小程序,代码如下 # -*- coding: utf-8 -*- ...key='3d6da9b06#######' #使用的时候将自己在高德地图开发者上申请的Web服务key加入即可,这里的key是有问
  • 先上图 我的环境python2.7 运行后生产csv文件rent.cvs,内容为58同城品牌合租爬取的合租房源数据 使用火狐浏览器访问(谷歌浏览器加载csv时显示跨域问题) 爬取网站:... ...# -*- coding: utf-8 -...
  • 在浏览器中搜索高德地图,按F12,点击搜索 可以查看到西安市对应的citycode是610100 cityList表示出城市信息,有可能有城市的编号,我们复制他的url查看 在json在线解析中可以解析出此文件,我们可以看到有一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 962
精华内容 384
关键字:

高德地图爬虫

爬虫 订阅