百度地图对城市的农家乐地点,位置,评分,是否附近有地铁站的python爬虫编写

任务思路

首先对百度地图地点的爬取,你需要找到城市所在地,你想查找的是什么,最后加上附加的东西,然后进行抓取

操作所需要的东西

百度地图爬取,需要申请百度地图api,才能获取到百度地图的数据,因为百度地图的数据是进行反爬取的所以你不能直接的进行数据的抓取
申请地址:http://lbsyun.baidu.com/index.php?title=%E9%A6%96%E9%A1%B5

需求:
建立白名单ak地址:http://lbsyun.baidu.com/apiconsole/key/create

在这里进行ak的申请

在这里插入图片描述这里申请ak,其实是你调用地图数据的接口

查看你需要的服务类型,这里选择的是web地图api
在这里插入图片描述

进入找到你要使用的接口类型,然后了解他的参数,不同的参数有不同的作用,通过添加和减少,得到你需要的显示方式,之后 可以进行爬虫的编写了
在这里插入图片描述

代码思路:首先先去找到数据的显示的网页在哪里,在进行数据的解析,最后保存你需要的数据

代码展示

import re
import xlwt
import urllib.request
import urllib.parse
from urllib import parse
import jiphy
import time
import csv
import sys
import time
import xlrd
import xlutils.copy
# jiphy.to.javascript(python_code)
def design_url():
    url_list = []   #因为有81条数据所以定义一个容器
    for i in range(0,5):
        #请求url地址
        url_1 = 'http://api.map.baidu.com/place/v2/search?'
        quary = '%E4%BC%91%E9%97%B2%E5%B1%B1%E5%BA%84'   #农家乐的编码,因为中文没法翻译所以进行转换
        tag ='life'   #表示为餐饮
        region = '%E6%88%90%E9%83%BD'   #表示成都市,中文无法编译进行转换
        scope = '2'   #取值为1或是为空时,表示返回基本信息,取值为2时候,返回详细的信息
        sort_name ='overall_rating'   #显示评价分数
        page_size = '20'  #每页显示20条数据
        
        page_num = i   #分页代码,0表示第一页,1表示第二页
        city_limit = 'true'   #仅仅召回region内的数据
        output = 'xml'   #表示输出的形式,是json还是xml
        ak =你申请的接口  #api接口
        #生成访问的url
        url_last = url_1+'query='+quary+'&tag='+tag+'&region='+region+'&scope='+scope+'&sort_name='+sort_name+'&page_size='+page_size+'&page_num='+str(i)+'city_limit='+city_limit+'&output='+output+'&ak='+ak
        url_list.append(url_last)
    return url_list
def train_url_list(area):
    train_list = []   #因为有81条数据所以定义一个容器
    for i in area:
        #请求url地址
        url_1 = 'http://api.map.baidu.com/place/v2/search?'
        quary = '%E5%9C%B0%E9%93%81'   #地铁的编码,因为中文没法翻译所以进行转换
        tag ='%E4%BA%A4%E9%80%9A'   #表示为交通
        region = urllib.parse.quote('成都市'+i)   #表示成都市,中文无法编译进行转换
        radius = '1000'
        output = 'xml'   #表示输出的形式,是json还是xml
        ak = 你申请的接口   #api接口
        #生成访问的url
        url_last = url_1+'query='+quary+'&tag='+tag+'&region='+region+'&radius='+radius+'&output='+output+'&ak='+ak
        train_list.append(url_last)
    return train_list
def open_url(url):
    req = urllib.request.Request(url)
    req.add_header('User-Agent','Mozilla/5.0 (你的电脑信息')
    page = urllib.request.urlopen(req)
    html = page.read().decode('utf-8')
    return html
def find_position():
    name,area,address,overall_rating,train = [], [], [], [], []
    for i in design_url():   #访问链接地址
        html = open_url(i)
        #查找农家乐名字
        p = r'<name>.+?</name>'
        s1 = re.findall(p,html)
        for i in s1:
            i =str(i)
            i = i.replace('<name>','')
            i = i.replace('</name>','')
            name.append(i)
        #查找地区
        p = r'<area>.+?</area>'
        s1 = re.findall(p,html)
        for i in s1:
            i =str(i)
            i = i.replace('<area>','')
            i = i.replace('</area>','')
            area.append(i)
        #查找位置
        p = r'<address>.+?</address>'
        s1 = re.findall(p,html)
        for i in s1:
            i =str(i)
            i = i.replace('<address>','')
            i = i.replace('</address>','')
            address.append(i)
        #查找评分
        html = html.replace("\t",'').replace(' ','').replace('\n','')
        p = r'<detail_info>.*?</detail_info>'
        p_1 = r'<overall_rating>.+?</overall_rating>'
        s1 = re.findall(p,html)
        overall_rating_test = []
        for i in s1:   #先划分为每一个分组
            i = str(i)
            s = re.findall(p_1,i)
            if len(s):
                overall_rating_test.append(s)
            else:
                overall_rating_test.append('无')
        for i in overall_rating_test:
            i =str(i)
            i = i.replace('<overall_rating>','')
            i = i.replace('</overall_rating>','')
            overall_rating.append(i)
        time.sleep(30)
    train_list = train_url_list(area)
    for i in train_list:
        html = open_url(i)
        html = html.replace("\t",'').replace(' ','').replace('\n','')
        p = r'<results>.*?</results>'
        p_1 = r'<address>.*?</address>'
        s1 = re.findall(p,html)
        time.sleep(2)
        for i in s1:   #先划分为每一个分组
            i = str(i)
            s = re.findall(p_1,i)
            if len(s):
                train.append('有')
                break
            else:
                train.append('无')
                break
    return name,area,address,overall_rating,train
def sava_data():
    name,area,address,overall_rating,train = find_position()
    #写入数据
    xls = xlrd.open_workbook("d:/baidu_map.xls")
    wt = xlutils.copy.copy(xls)
    sheets = wt.get_sheet('成都市休闲山庄')
    for i in range(len(name)):
        sheets.write(i+1,0,name[i])   #将名字写入第一列
    for i in range(len(area)):
        sheets.write(i+1,1,area[i])   #将区域写入第2列
    for i in range(len(address)):
        sheets.write(i+1,2,address[i])   #将地址写入第3列
    for i in range(len(overall_rating)):
        sheets.write(i+1,3,overall_rating[i])   #将评分写入第4列
    for i in range(len(train)):
        sheets.write(i+1,4,train[i])   #将有无地铁写入第4列
    wt.save("d:/baidu_map.xls")
    print("完成")
if __name__ == '__main__':
    ty = sys.getfilesystemencoding()   #获取文件系统的编码形式
    print("文件编码形式是:%s"%(ty))
    sava_data()

代码介绍:
首先是存储网页的一个函数,因为网页数据api的显示是一页最多20个,所以他是显示不完的,你要将多个页的url交给他去处理

第二个函数后面说明

第三个函数是打开你的网页的一个操作,他的作用是将你的url地址进行打开和返回他的源码的操作,在这里里面,进行了隐藏你访问地址的操作,让他认为是人在操作,而不是爬虫在抓取你的数据,就不会对你进行阻拦

第四个函数是对数据进行解析,得到你需要的数据,然后存在列表里面

第五个函数,是对你的数据进行存储,在这里需要注意的是xlrd库他没有操作xls表的权力,所以需要进行copy操作让其他库对他进行操作,他的弊端是,我的表和表名是我自己事先写好的,所以这是一个可以完善的地方,大家可以进行优化

返回到第三个函数,你得到的你的位置的地址信息,然后调用二个函数进行操作,他的作用是,根据你抓取到的位置信息,然后定位查找周边

总结:操作思路就是找到地址,打开,进行数据匹配

因为本人能力有限,适合初学者,有错误的地方大家佐证。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值