好,现在进入高阶代码篇。

目的:

爬取昆明市中学的兴趣点POI。

关键词:中学

已有ak:9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO

昆明市坐标范围:

左下角:24.390894,102.174112

右上角:26.548645,103.678942

URL模板:

http://api.map.baidu.com/place/v2/search?query=中学& bounds=24.390894,102.174112,26.548645,103.678942&page_size=20&page_num=0&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO

工具:python2.7

我们将使用python语言来写爬虫代码。

1.功能分解

先把这个爬虫要实现的功能做一个分解。

已经知道在这个URL中,变量是bounds和page_num的值。

Bounds范围值要采取矩形分割,分4个矩形,就是4组坐标范围,page_num的值从0到19之间。

1组坐标范围20个page_num值,4×20=80。要生成的URL阵列是80个。

每个URL都能生成一个网页,每个网页上的信息都要被爬下来,保存到一个txt文件中。

A.根据bounds和page_num组合生成URL。

B.根据URL爬取网页数据,添加到txt文件中。

这将是一个循环代码:

Bounds=[矩形1,矩形2,矩形3,矩形4]

Page_nums=[0、1、2……19]

For 矩形 in bounds:

For page_num in page_nums:

URL=http://api.map.baidu.com/place/v2/search?query=中学& bounds=矩形&page_size=20&page_num=page_num&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO

URL内容爬取,添加入txt文件

Next

Next

End

这个代码的框架说完了。

然后进入每个功能的代码如何实现环节。

2.功能代码实现。

代码要实现的功能是哪几个呢?

按照步骤分:

A.bounds列表的生成。

B.URL列表的生成。

C.爬取的网页内容保存到txt文本中。

(1)bounds列表生成

再说一下,因为这个是零基础教程,所以我会讲解得非常细致,python代码会由浅入深,从最简单最基础的开始。

我们看一下坐标范围:

左下角:24.390894,102.174112

右上角:26.548645,103.678942

纬度差是2.157751,经度差是1.50483。

用代码表示一下坐标范围:

lat_1=24.390894

lon_1=102.174112

lat_2=26.548645

lon_2=103.678942

lat是纬度的英文,lon是经度的英文。

我们切分矩形的话,这个矩形的坐标肯定是由上面这几个坐标范围计算的来的,内插运算。

为了计算简便,我们就切方形吧,这个方形的边长我们设定一个值,假设是las(length of a side,边长英文)。

那么第一个矩形的左下角坐标是lat_1+las,lon_1,右上角坐标是lat_1+las*2,lon_1+las;第二个矩形的左下角坐标是lat_1+las,lon_1+las,右上角坐标是lat_1+las*2,lon_1+las*2……

我们设定的计算规则是:

整个坐标范围的大矩形我们叫它矩形A,切分的小矩形我们叫它矩形B。

矩形A的左下角坐标是:lat_1,lon_1,右上角坐标是lat_2,lon_2;

矩形B的边长是las。

那么计算一下矩形B的数量:

(int((lat_2-lat_1)/las)+1)*(int((lon_2-lon_1)/las)+1)

int是一个取整函数。

int(1.334)=1

int((lat_2-lat_1)/las)+1计算的是在纬度上切了几个,int((lon_2-lon_1)/las)+1计算的是在经度上切了几个,乘积就是一共几个矩形。

我们看下面一段代码:

lat_1=24.390894

lon_1=102.174112

lat_2=26.548645

lon_2=103.678942 #坐标范围

las=1 #给las一个值1

lat_count=int((lat_2-lat_1)/las+1)

lon_count=int((lon_2-lon_1)/las+1)

for lat_c in range(0,lat_count):

lat_b1=lat_1+las*lat_c

for lon_c in range(0,lon_count):

lon_b1=lon_1+las*lon_c

print str(lat_b1)+','+str(lon_b1)

#这段代码生成的是矩形B的左下角坐标

在IDLE中敲入这些代码,运行结果是:

24.390894,102.174112

24.390894,103.174112

25.390894,102.174112

25.390894,103.174112

26.390894,102.174112

26.390894,103.174112

因为我把las设置为1了,所以切出来6个矩形,这是这六个矩形的左下角坐标。

这行代码很简单,只涉及到两组内嵌的循环语句:for lat_c in range(0,lat_count):

用VB语言翻译一下这行就是 for lat_c=0 to lat_count step 1。

说明几个注意点:

a.python语言不需要声明变量。

b.for语句后面的:别忘了。

c.range(0,3)是[0,1,2],3不在数组里面,好好理解一下函数关系,这么个算法,说明左下角坐标是正好的,不会多一个。

d.python没有结束循环的语句,靠回车,表示嵌套关系靠的“ ”,四个空格,for语句冒号后面跟着的那行,比for语句后退了四个空格,说明这个语句是在for循环中的,如果语句要跳出for循环的话,那么就删掉四个空格,表示跳出循环。这是一个很有意思的python写码规则。

我们把这段代码改一改,获取矩形B的范围坐标:

lat_1=24.390894

lon_1=102.174112

lat_2=26.548645

lon_2=103.678942 #坐标范围

las=1 #给las一个值1

lat_count=int((lat_2-lat_1)/las+1)

lon_count=int((lon_2-lon_1)/las+1)

for lat_c in range(0,lat_count):

lat_b1=lat_1+las*lat_c

for lon_c in range(0,lon_count):

lon_b1=lon_1+las*lon_c

print str(lat_b1)+','+str(lon_b1)+','+str(lat_b1+las)+','+str(lon_b1+las)

#这段代码生成的是矩形B的范围坐标

运行结果如下:

24.390894,102.174112,25.390894,103.174112

24.390894,103.174112,25.390894,104.174112

25.390894,102.174112,26.390894,103.174112

25.390894,103.174112,26.390894,104.174112

26.390894,102.174112,27.390894,103.174112

26.390894,103.174112,27.390894,104.174112

好好理解一下这行代码。

(2)URL列表生成:

bounds列表生成之后,page_num在range(0,20)中遍历一遍,就生成了URL列表了。

代码如下:

看看这张图,好好理解一下循环与空格之间的关系,python没有结束循环的语句,就靠空格来做嵌套。

把这段代码完善一下,主要是URL那段怎么写。

其中:

url=’http://api.map.baidu.com/place/v2/search?query=中学& bounds=’+str(lat_b1)+’,’+str(lon_b1)+’,’+str(lat_b1+las)+’,’+str(lon_b1+las)+’&page_size=20&page_num=’+str(page_num)+’&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO’

print url

URL列表也生成了,是不是曙光在望了?

继续!

(3)网页解析

我们先学习一下网页的爬取,依然用这行URL来学习。

http://api.map.baidu.com/place/v2/search?query=中学& bounds=24.390894,102.174112,26.548645,103.678942&page_size=20&page_num=0&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO

我用的python2.7,我们写一段代码,把这个URL上的数据爬下来。

打开IDLE,file——new file(ctrl+n),新建一个py文件,在里面敲代码。当然也可以在python shell里面一行一行敲,对于初学者来说,这种方式比较合适,一行一行敲,错了就有提示。

我们简单敲入一段代码,看看怎么爬取网页:

在代码的最开始,我们看到导入了两个库,一个是urllib2库,一个是json,这是要解析百度开放平台URL必须要导入的两个库,urllib2是做网页解析的,而URL中,我们仔细查看,会看到“output=json”,URL的网页输出是以这种格式输出的。

输出结果如下:

但显然,我们不需要这样的数据,在结果“results”中,我们只需要name、lat、lng、address的值,这时候,就需要对json数据格式进行解析了。

我们把这段代码修改一下:

与上文不同的是,我们还导入了一个sys库,解释如图。

用加载的方式,json.load(response)在python中载入了URL生成的json数据,用一个循环读入了json数据中的results中name,仔细观察json数据结构就能理解这些代码。

运行结果如下:

当然,我们要获取的是四个值,name、lat、lng、address,那么把这行代码改写一下吧!

改写的代码部分如下:

for item in data['results']:

jname=item['name']

jlat=item['location']['lat']

jlon=item['location']['lng']

jadd=item['address']

(5)python默认编码问题。

python默认的编码是ASCII,不过URL解析的json文件编码是uft-8。

如果不对编码方式进行重新设定,就会出现中文乱码问题。

把python默认编码从ascii转到uft-8的代码是固定的。

# -*- coding:utf-8 -*

import os

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

把这段代码放在代码前端即可。

我们将要实现的代码前端如图,保证代码行的顺序。

(6)txt文件写入

f=open(r'D:\python\kunmingschool.txt','a')

f.write('zhongxue')

f.close()

这是一段最简单的文本写入代码,打开D:\python\kunmingschool.txt这个文件,以添加方式写入,写入zhongxue,把文件关闭。

A.文件全路径前面加一个r,这是防止字符转译的,就是怕识别不了路径。

B.a的意思是以添加方式写入,如果是w的话,就是覆盖方式写入。

C.写入完成后,要把文件关闭,close(),括号别忘了。

把网页解析和txt文件写入,联合一下。

还是把这个URL上的内容写入txt文件,文件的全路径是D:\python\kunmingschool.txt。

http://api.map.baidu.com/place/v2/search?query=中学& bounds=24.390894,102.174112,26.548645,103.678942&page_size=20&page_num=0&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO

这段的代码如下:

n\是python里面的换行符。

运行结果如下图:

至此,要用到的功能代码,我们都会了,现在只要把它们都组合到一切就可以了。

3.全部代码

# -*- coding:utf-8 -*

import json #导入json库

import os

import urllib2 #导入urllib2库

import sys #我知道了,这个东东是为了把默认编码从ascii转到uft-8。

reload(sys)

sys.setdefaultencoding('utf-8')

lat_1=24.390894

lon_1=102.174112

lat_2=26.548645

lon_2=103.678942 #坐标范围

las=1 #给las一个值1

ak='9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO'

keyword='中学'

push=r'D:\python\12345.txt'

#我们把变量都放在前面,后面就不涉及到变量了,如果要爬取别的POI,修改这几个变量就可以了,不用改代码了。

f=open(push,'a')

lat_count=int((lat_2-lat_1)/las+1)

lon_count=int((lon_2-lon_1)/las+1)

for lat_c in range(0,lat_count):

lat_b1=lat_1+las*lat_c

for lon_c in range(0,lon_count):

lon_b1=lon_1+las*lon_c

for i in range(0,20):

page_num=str(i)

url='http://api.map.baidu.com/place/v2/search?query='keyword'& bounds='+str(lat_b1)+','+str(lon_b1)+','+str(lat_b1+las)+','+str(lon_b1+las)+'&page_size=20&page_num='+str(page_num)+'&output=json&ak='+ak

response = urllib2.urlopen(url2)

data=json.load(response)

for item in data['results']:

jname=item['name']

jlat=item['location']['lat']

jlon=item['location']['lng']

jadd=item['address']

j_str=jname+','+str(jlat)+','+str(jlon)+','+jadd+'\n'

f.write(j_str)

f.close()

说实话,一个脚本里面嵌入了四个循环,程序员见了能打人,不过能用就行。

接下来将要进入进阶篇教程,在这里会涉及到如何获取区域范围,例如昆明市的bounds值;如何更合理的切分矩形;如何简化代码,如何将代码移植到python3中;可否用别的方式、函数语句获取poi数据;通过什么样的设置可以更高效的获取poi;python中文乱码的解决方式;request、time等模块的应用;过程参考资料汇总……

---------------------

作者:铁血阿郎

来源:CSDN

原文:https://blog.csdn.net/sinat_41310868/article/details/78746224

版权声明:本文为博主原创文章,转载请附上博文链接!

python爬取的代码_零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(代码篇)...相关推荐

  1. 爬虫python代码广告_零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(代码篇)...

    我是怎么想的,在新浪博客里写代码教程. 这篇博客的内容同步到了CSND博客中,那里不限制外链,也可以复制代码. http://blog.csdn.net/sinat_41310868/article/ ...

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

    实现目的:爬取昆明市范围内的全部中学数据,包括名称.坐标. 先进入基础篇,本篇主要讲原理方面,并实现步骤分解,为python代码编写打基础. 因为是0基础开始,所以讲得会比较详细. 如实现目的所讲,爬 ...

  3. 零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(代码篇)

    好,现在进入高阶代码篇. 目的: 爬取昆明市中学的兴趣点POI. 关键词:中学 已有ak:9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO 昆明市坐标范围: 左下角:24.390894 ...

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

    实现目的:爬取昆明市范围内的全部中学数据,包括名称.坐标. 先进入基础篇,本篇主要讲原理方面,并实现步骤分解,为python代码编写打基础. 因为是0基础开始,所以讲得会比较详细. 如实现目的所讲,爬 ...

  5. Python之爬取百度地图兴趣点(POI)数据

    关于爬虫系列,前三篇文章分别讲了三个简单案例,分别爬取了<你好,李焕英>电影豆瓣热门短评.58同城在售楼盘房源信息以及安居客网二手房小区详情页数据.通过前三个案例,相信大家都对爬虫有了简单 ...

  6. python多久能找到工作_零基础自学Python多久可以找工作?

    零基础自学Python多久可以找工作?零基础自学3个月很难找到工作.如果全职学习Python的话,学习6个的时间,不一定能达到找到工作的水平,掌握项目经验还需要更久,达到企业需要的岗位要求还需要多练习 ...

  7. python批量下载文件教程_零基础Python教程:教你爬取天堂网1920*1080大图片(批量下载)...

    这篇文章将针对上篇文章的未尽事宜进行完善,完成图片的批量抓取. /2 图片网址解析/ 1. 我们首先来分析一下这个图片的地址在哪里.我们选择图片,然后右击网页检查,可以看到图片的路径,如下图所示. 2 ...

  8. 长短时记忆神经网络python代码_零基础入门深度学习(6) - 长短时记忆网络(LSTM)

    无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就o ...

  9. python代码_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)

    本文内容主要介绍了Python代码注释规范代码实例解析,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下!!! 一.代码注释介绍 注释就是对代码的解释和说明 ...

  10. python血条游戏代码_零基础快速学十二课Python完整游戏代码,使用「格式符%」来处理...

    十二课Python不同数据类型的拼接方式,使用[格式符%]来处理 不过它还没有全部解决:打印出每局结果,三局两胜打印最终战果.这就是版本3.0需要做的事情. 打印战果,三局两胜. 对比2.0版本,在3 ...

最新文章

  1. 文本基线怎样去掉_ICML 2020 | 基于类别描述的文本分类模型
  2. vue修改数据连接数据库_vue实现数据的增删改查
  3. Uptime Tier Ⅳ标准数据中心的柴发油路设计关键点
  4. java io流顶层_Java中的IO流(一)
  5. 2010英语WCDMA,希望你也和一样!
  6. oracle中noguarantee,关于undo guarantee
  7. C++中XML的读写操作(生成XML 解析XML)
  8. linux添加环境变量并生效,linux(ubtuntu)添加环境变量,立即生效
  9. 【阿里妈妈营销科学系列】第四篇:营销渠道效果评估与归因
  10. 不入世的天才: 尼古拉·特斯拉
  11. Python练习:简单的登陆注册的信息管理;模块化;密码安全判断(没有用数据库和文件)
  12. 实在人做实干型产品——专访凯特伟业CEO云凤程
  13. 6pen Art - AI绘画平台
  14. 2021年三季度中国医疗服务行业A股上市企业营收排行榜:国际医学于1月17日起戴帽,简称变更为“ST国医”(附热榜TOP37详单)
  15. dnf一直接收服务器信息失败怎么办,dnf接收频道信息失败
  16. 开源私有lorawan server搭建
  17. Spatial Attention U-Net for Retinal Vessel Segmentation(ICPR 2020)
  18. elasticsearch安装配置
  19. 解决:运行pytest时,报错:'TestCaseFunction' object has no attribute 'get_marker'
  20. MQ消息的自动应答和手动应答| RabbitMQ系列(三)

热门文章

  1. [落选]狗熊会人才计划第6期选拔作业
  2. 通过W3C验证CSS
  3. 康诺特酒吧摘得2021全球50家最佳酒吧桂冠;华住与京能集团达成战略合作 | 全球旅报...
  4. Hydra/Medusa爆破工具命令参数和简单操作
  5. Oracle数据库之日期查询
  6. 前20位Googler今安在?
  7. Pod2g已发现可完美越狱iOS 5的漏洞
  8. 网页调用rm播放器代码 - 详细说明
  9. 7月31日 细雨霏霏 不是我的泪
  10. 澳洲网:澳高考生扎堆申请专业 热衷艺术及护理学位