关闭

Python爬虫-利用百度地图API接口爬取数据并保存至MySQL数据库

标签: mysql数据库pythonapi
1786人阅读 评论(0) 收藏 举报
分类:

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

分析-02.png

其次,利用百度地图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/xml
ak:用户的访问密钥,可以在百度地图API平台上进行申请

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

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

分析-03.png

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

import requests
import json
import MySQLdb
from 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=False
cur.close()
conn.close()

从MySQL导出数据的结果:

分析-05.png

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

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

分析-06.png

在表park建立表结构如下:

分析-07.png

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

from datetime import datetime
import requests
import json
import MySQLdb

#city表中拿到uid
conn=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导出数据的结果:

分析-08.png

0
0
查看评论

python网络爬虫学习(一)通过GET和POST方式获取页面内容

python网络爬虫学习 (一)通过GET和POST方式获取页面内容网络爬虫,即Web Spider,是一个很形象的名字。 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。HTTP协议中定义了四个与服务器进行交互的方法,分别是GET, POST,PUT,DELETE ,实际对应对...
  • kelvinmao
  • kelvinmao
  • 2016-05-20 21:06
  • 10124

Python爬虫系列:爬取小说并写入txt文件

Python爬虫系列——爬取小说并写入txt文件     文章介绍了如何从网站中爬取小说并写入txt文件中,实现了单章节写取,整本写取,多线程多本写取。爬虫使用的python版本为python3,有些系统使用python指令运行本脚本,可能出现错误,此时可以试...
  • baidu_26678247
  • baidu_26678247
  • 2017-07-13 17:14
  • 11714

python网络爬虫入门(六)—— 30余行代码爬取教务网成绩并存入Excel

30余行代码爬取四川大学教务网并存入Excel
  • waking_up88688
  • waking_up88688
  • 2017-03-27 14:24
  • 3444

Python 实现简单的爬虫功能并保存到本地

昨天下班后忽然兴起想写一个爬虫抓抓网页上的东西。花了一个钟简单学习了python的基础语法,然后参照网上的例子自己写了个爬虫。 #coding=utf-8 import urllib.request import re import os ''' Urllib 模块提...
  • feifeiwendao
  • feifeiwendao
  • 2016-03-29 18:19
  • 9372

python爬虫---post抓取查询数据简单说明

一、做python爬虫,在爬取数据前,一般需要对网页进行简单分析。这里推荐用火狐的HttpFox,简单实用。 二、爬取查询数据,查询类型的,说明是要post相关数据过去才能get到想要的数据。        如下图,巨潮信息网的,通过查询显示想要的数据,然后抓...
  • lishenluo
  • lishenluo
  • 2016-10-13 22:23
  • 4743

爬取调用百度地图API搜索的底层详细数据

# 原创作品,转载请注明出处,谢谢!@杨福星 (http://blog.csdn.net/luckystar92/article/details/####)1、百度地图开放平台JavaScript API 类参考http://lbsyun.baidu.com/cms/jsapi/reference/...
  • luckystar92
  • luckystar92
  • 2017-06-28 17:49
  • 2449

使用python及百度API对百度poi数据进行爬取(一)

档案系统初期算是告一段落了,利用一点时间继续爬取POI。和领导聊聊,受益匪浅。之前我的想法是爬取一份poi数据,直接能用;而领导听了之后,觉得更好的方式是爬取多个渠道来源的POI数据,然后做一个数据比较融合(最终事情能不能成不好说,但是经过这么一回,细节技术上有所提高,宏观把控整体项目流程能力有所长...
  • u010723516
  • u010723516
  • 2017-06-07 09:57
  • 3522

Python爬虫(二)--利用百度地图API批量获取城市所有的POI点

上篇关于爬虫的文章,我们讲解了如何运用Python的requests及BeautifuiSoup模块来完成静态网页的爬取,总结过程,网页爬虫本质就两步: 1、设置请求参数(url,headers,cookies,post或get验证等)访问目标站点的服务器; 2、解析服务器返回的文档,提取需要的信息...
  • WenWu_Both
  • WenWu_Both
  • 2017-04-15 21:56
  • 18029

Python爬虫 百度地图搜索数据采集

之前在网上看到有流传VBA编写的版本,不过参数固定,通用性并不强,趁空闲时间用Python来简单分析制作一个简单的爬虫小脚本。 三个参数主要考虑的,一个是地理位置,一个是关键词,一个是页数。在抓包的过程中对“页数”这个参数纠结了很久,一直没看明白,后面仔细对比才找到猫腻。 先说说地理位置: ...
  • joson1234567890
  • joson1234567890
  • 2016-07-22 14:16
  • 10925

零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(进阶篇)

好,现在进入进阶篇教程。 1.获取昆明市的bounds值 看到下面这个东西了吧?在文本框里写入昆明市,或者其他的行政区划地名,北京市、朝阳区、大河沟子村什么的。 这也是通过调用百度地图开放平台API实现的。 实现起来很简单,把下面这段代码复制到一个txt文件中,然后把txt文件的拓展名改成h...
  • sinat_41310868
  • sinat_41310868
  • 2017-12-07 21:48
  • 640
    个人资料
    • 访问:15159次
    • 积分:353
    • 等级:
    • 排名:千里之外
    • 原创:20篇
    • 转载:0篇
    • 译文:0篇
    • 评论:9条
    文章分类
    文章存档
    最新评论