• 1、python爬虫requests的简单实现
    • 2、访问高德地图API,返回查询信息
      • 曲折实现的原因
        • 经过本人对官方文档的demo进行调试,有些地址直接地理编码,返回的结果没有行政区域
        • 所以曲线救国,采用了先获取该地址的经纬度,再获取该地址的行政区域和编码
      • 实现步骤
        • (1)输入地址,返回经纬度
        • (2)输入经纬度,返回行政区域和行政编码
        • (3)python连接数据库
        • (4)python读取数据库中的数据
        • (5)python开始循环查询行政区域和行政编码,查不到经纬度的跳过
        • (6)python将查询到的信息插入相应的数据库
    • 3、代码
      •   访问接口
        •  1 import requests
           2 import json
           3 
           4 
           5 #传入地址,返回对应的经纬度信息
           6 def getLocation(address,key):
           7     
           8     
           9     url = 'https://restapi.amap.com/v3/geocode/geo?key=%s&address=%s'%(key,address)
          10     res = requests.get(url)
          11     try:
          12         # 将 JSON 对象转换为 Python 字典
          13         json_data = json.loads(res.text)
          14         #取字典里的localtion的值,将键放到方括号里
          15         location=json_data['geocodes'][0]['location']
          16     except:
          17         location=''
          18         #print("没有location")
          19     return location
          20 
          21 #传入经纬度,返回
          22 def getADaddress(location,key):
          23     longitude=location.split(',')[0]
          24     latitude=location.split(',')[1]
          25     #url = 'https://restapi.amap.com/v3/geocode/regeo?key=%s&location=%s'%(key,location)
          26     url ='https://www.amap.com/service/regeo?longitude=%s&latitude=%s'%(longitude,latitude)
          27     res = requests.get(url)
          28     # 将 JSON 对象转换为 Python 字典
          29     json_data = json.loads(res.text)
          30     #取字典里的ADaddress的值,将键放到方括号里
          31     """province=json_data['regeocode']['addressComponent']['province']
          32     city=json_data['regeocode']['addressComponent']['city']
          33     district=json_data['regeocode']['addressComponent']['district']
          34     adcode=json_data['regeocode']['addressComponent']['adcode']
          35     ADaddress=[province,city,district]
          36     data=[adcode,ADaddress]"""
          37     ADaddress=json_data['data']['desc'].split(',')[0]+json_data['data']['desc'].split(',')[1]+json_data['data']['desc'].split(',')[2]
          38     adcode=json_data['data']['districtadcode']
          39     data=(adcode,ADaddress)
          40     return data
          41     
          42 
          43 def getData(key,address):
          44     location=getLocation(address,key)
          45     try:
          46         data=getADaddress(location,key)
          47     except:
          48         data=('','')
          49         #print("location传入失败")
          50     return data

           

        • 数据库操作
          •   
             1 import mysql.connector
             2 
             3 
             4 def conn():
             5     mydb = mysql.connector.connect(
             6       host="localhost",
             7       user="xxxx",
             8       passwd="xxxx",
             9       database="xxxxx"
            10     )
            11     return mydb
            12 
            13 def getData(mydb):
            14     mycursor = mydb.cursor()
            15      
            16     mycursor.execute("SELECT xx, xxxx FROM xxxxx ")
            17     
            18     myresult = mycursor.fetchall()
            19      
            20     return myresult
            21 
            22 def update(mydb,val):
            23     mycursor = mydb.cursor()
            24      
            25     sql = "UPDATE xxxxx SET xxxxxx = %s ,xx= %s WHERE xx = %s"
            26      
            27     mycursor.execute(sql, val)
            28      
            29     mydb.commit()
            30      
            31 
            32     

             

          • Client
            •   
               1 import MapStudy
               2 import MySql
               3 
               4 if __name__ == '__main__':
               5     key='e1f2ea153a4d6c972194944737a5bd0d'
               6     list1=MySql.getData(MySql.conn())
               7     for i in range(len(list1)):  
               8         address=list1[i][1].split()[0]
               9         #print(address)
              10         #print(type(address))
              11         datasimple=MapStudy.getData(key,address)
              12         #元组相加还是元组
              13         list1[i]=list1[i]+datasimple
              14         print(list1[i])
              15         val=(list1[i][2],list1[i][3],list1[i][0])
              16         MySql.update(MySql.conn(),val)
              17     
              18     

               

    • 4、教训:
      • (1)在做中学,针对实例,先跑通,会使用,之后再来理解其中的每一部分的含义和内容
      • (2)官方文档不一定适合小白,前人经验或许更有用
      •   (3)根据经纬度返回行政区划和行政区划编码,使用官方提供的接口,当值为空时,会返回list,对于我们数据的处理,增加了判断的复杂性
    •  5、总耗时
      •   2020年3月12日6.5h
      •   2020年3月13日3h52m7s
posted on 2020-03-13 01:37  生长的力量  阅读(693)  评论(0编辑  收藏  举报