打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python爬虫

首先,我这里有一份相关城市以及该城市的公园数量的txt文件:

其次,利用百度地图API提供的接口爬取城市公园的相关信息。
所利用的API接口有两个:

1、http://api.map.baidu.com/place/v2/search?q=公园&region=北京&output=json&ak=用户的访问密匙2、http://api.map.baidu.com/place/v2/detail?uid=xxxxx&output=json&scope=2&ak=用户的访问密匙第一个API接口可以获得城市公园的一般信息第二个API接口可以获得城市公园 的详细信息参数说明:q:检索的关键字region:检索的区域(市级以上)page_size:每一页的记录数量page_num:分页页码output:输出格式json/xmlak:用户的访问密钥,可以在百度地图API平台上进行申请

一、尝试第一个API获取数据并存储至MySQL数据库

下面是对第一个API接口进行访问时返回的结果:

因为我们的最终结果都是要存储在MySQL数据库中,为了操作上的方便,我直接使用了图形管理工具MySQL-Front新建了数据库:baidumap,并在里面新建两张表,表1city用来存储第一个API的结果,表2park用来存储第二个API的结果。表1结构如下:


接下来就是写代码请求数据,并将结果存储在表city中:

import requestsimport jsonimport MySQLdbfrom datetime import datetime#从txt文件中获取相关城市并重新生成一个列表city_list=[]with open('cities.txt','r',encoding='utf-8') as f:    for eachline in f:        if eachline !='' and eachline !='\n':            city=eachline.split('\t')[0]            city_list.append(city)    f.close()#定义一个getjson函数用来解析返回的数据def getjson(palace,page_num=0):    headers = {        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'    }    url='http://api.map.baidu.com/place/v2/search'    params={        'q':'公园',        'region':palace,        'scope':'2',        'page_size':'20',        'page_num':page_num,        'output':'json',        'ak':'XM53LMurtNQaAPFuKVy1WzSyZCNmNA9H',    }    response=requests.get(url=url,params=params,headers=headers)    html=response.text    decodejson=json.loads(html)    return decodejson#连接数据库、获得游标,获取数据并插入到数据库中在获取数据时使用get()方法比较好,避免造成无相关数据时程序的中断conn=MySQLdb.connect(host='localhost',user='root',password='root',db='baidumap',charset='utf8')cur=conn.cursor()for city in city_list:    not_last_page=True    page_num=0    while not_last_page:        decodejson=getjson(city,page_num)        print(city,page_num)        if decodejson.get('results'):            for result in decodejson.get('results'):                park=result.get('name')                lat=result.get('location').get('lat')                lng=result.get('location').get('lng')                address=result.get('address')                street_id=result.get('street_id')                uid=result.get('uid')                sql="""INSERT INTO baidumap.city (city,park,location_lat,location_lng,address,street_id,uid,time)VALUES (%s,%s,%s,%s,%s,%s,%s,%s);"""                cur.execute(sql,(city,park,lat,lng,address,street_id,uid,datetime.now()))                conn.commit()            page_num=page_num+1        else:            not_last_page=Falsecur.close()conn.close()

从MySQL导出数据的结果:

二、尝试第二个API获取数据

第二个API接口:http://api.map.baidu.com/place/v2/detail?uid=xxxxx&output=json&scope=2&ak=用户的访问密匙
里面有一个参数uid,这个参数我们就从之前所保存的city表中进行获取,然后我们尝试对这个API进行访问,返回的结果是:

在表park建立表结构如下:

先从表city拿到uid,然后利用第二个API接口进行请求,拿到数据,存储至表park中,代码如下:

from datetime import datetimeimport requestsimport jsonimport MySQLdb#city表中拿到uidconn=MySQLdb.connect(host='localhost',user='root',password='root',db='baidumap',charset='utf8')cur=conn.cursor()sql="Select uid from baidumap.city WHERE id>0;"cur.execute(sql)conn.commit()uids=cur.fetchall()##定义一个getjson函数用来解析返回的数据def getjson(uid):    try:        headers={            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'        }        params={            'uid':uid,            'scope':'2',            'output':'json',            'ak':'XM53LMurtNQaAPFuKVy1WzSyZCNmNA9H',        }        url='http://api.map.baidu.com/place/v2/detail'        response=requests.get(url=url,headers=headers,params=params)        html=response.text        decodejson=json.loads(html)        return decodejson    except:        pass#获取数据,存储数据for uid in uids:    uid=uid[0]    print(uid)    decodejson=getjson(uid)    data=decodejson.get('result')    if data:        park=data.get('name')        location_lat = data.get('location').get('lat')        location_lng=data.get('location').get('lng')        address=data.get('address')        street_id=data.get('street_id')        telephone=data.get('telephone')        detail=data.get('detail')        uid=data.get('uid')        tag=data.get('detail_info').get('tag')        detail_url=data.get('detail_info').get('detail_url')        type=data.get('detail_info').get('type')        overall_rating=data.get('detail_info').get('overall_rating')        image_num=data.get('detail_info').get('image_num')        comment_num=data.get('detail_info').get('comment_num')        shop_hours=data.get('detail_info').get('shop_hours')        alias=data.get('detail_info').get('alias')        scope_type=data.get('detail_info').get('scope_type')        scope_grade=data.get('detail_info').get('scope_grade')        description=data.get('detail_info').get('description')        sql="""INSERT INTO baidumap.park(park,location_lat,location_lng,address,street_id,telephone,detail,uid,tag,detail_url,type,overall_rating,image_num,comment_num,shop_hours,alias,scope_type,scope_grade,description,time) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);"""        cur.execute(sql,(park,location_lat,location_lng,address,street_id,telephone,detail,uid,tag,detail_url,type,overall_rating,image_num,comment_num,shop_hours,alias,scope_type,scope_grade,description,datetime.now()))        conn.commit()cur.close()conn.close()

从MySQL导出数据的结果:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
自己动手实现4大免费聊天机器人:小冰、图灵、腾讯、青云客
识别人脸关键点给人脸加眼镜特效
Python采集百度地图数据
appcan与使用getJSON与服务器交互的例子
JavaScript Promise API
jsonp 进行 Javascript 的跨域数据访问
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服