最近开始入坑Python爬虫,专业是地理信息系统,对地理位置相关的信息比较感兴趣,所以就试着爬南京链家的二手房数据,并利用百度API绘制出热力图。Python的版本是Python3.6,然后用到了requests库和BeautifulSoup库还有csv库,IDE用的是PyCharm

一、安装requests库和BeautifulSoup库

windows命令行下,输入pip install requests回车安装完成后,继续输入pip install BeautifulSoup回车

二、观察链家二手房网页链家规律以及html规律

南京链家二手房网页为https://nj.lianjia.com/ershoufang/pg1/,其中pg后面的数字表示第几页。所以访问时设置一个列表循环访问即可。再来看看链家网站的html规律,谷歌浏览器开发者模式查看元素,可以看到
,二手房的信息全部保存在li class=’clear’里面,等会用bs库解析网页的时候会用到。

三、申请百度开发者密匙,用于后面根据二手房小区的名字查询二手房的经纬度信息

在百度开发者平台上http://lbsyun.baidu.com/,注册,然后申请密匙,应用名称可以随便填,应用类型选择浏览器端即可。百度地图根据名称查询地点的经纬度的教程可以参考 这篇博客http://blog.csdn.net/qq_23926575/article/details/72569995

四、爬网页,并将结果存储在csv文件中

准备工作全部完成,开始爬网页,并将结果存储在程序根目录下da.csv中,话不多说,直接上源码

from bs4 import BeautifulSoup
import requests
import csv
import re
def getlocation(name):#调用百度API查询位置bdurl='http://api.map.baidu.com/geocoder/v2/?address='output='json'ak='你的密匙'#输入你刚才申请的密匙callback='showLocation'uri=bdurl+name+'&output=t'+output+'&ak='+ak+'&callback='+callbackres=requests.get(uri)s=BeautifulSoup(res.text)lng=s.find('lng')lat=s.find('lat')if lng:return lng.get_text()+','+lat.get_text()url='https://nj.lianjia.com/ershoufang/pg'
heade={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}#请求头,模拟浏览器登陆
page=list(range(0,101,1))
p=[]
hi =[]
fi=[]
for i in page:#循环访问链家的网页response=requests.get(url+str(i))soup=BeautifulSoup(response.text)#提取价格prices=soup.find_all('div',class_='priceInfo')for price in prices:p.append(price.span.string)#提取房源信息hs=soup.find_all('div',class_='houseInfo')for h in hs:hi.append(h.get_text())#提取关注度followInfo=soup.find_all('div',class_='followInfo')for f in followInfo:fi.append(f.get_text())print(i)#houses=[]#定义列表用于存放房子的信息
n=0
num=len(p)
file=open('da.csv', 'w', newline='')
headers = ['name', 'loc', 'style', 'size', 'price', 'foc']
writers = csv.DictWriter(file, headers)
writers.writeheader()
while n<num:#循环将信息存放进列表h0=hi[n].split('|')name=h0[0]loc=getlocation(name)style = re.findall(r'\s\d.\d.\s', hi[n])#用到了正则表达式提取户型if style:style=style[0]size=re.findall(r'\s\d+\.?\d+',hi[n])#用到了正则表达式提取房子面积if size:size=size[0]price=p[n]foc=re.findall(r'^\d+',fi[n])[0]##用到了正则表达式提取房子的关注度house = {'name': '','loc': '','style': '','size': '','price': '','foc': ''}#将房子的信息放进一个dict中house['name']=namehouse['loc']=lochouse['style']=stylehouse['size']=sizehouse['price']=pricehouse['foc']=focwriters.writerow(house)#将dict写入到csv文件中n+=1print(n)
file.close()

OK,运行代码,就可以看到在程序根目录下出现了da.csv文件,打开可以看到数据已经全部爬好了,查看数据发现经纬度字段会有空值,要在excel中将这些空值删除掉。

五、将数据处理成百度地图热力图API需要的格式

百度地图制作热力图的官方文档在http://developer.baidu.com/map/jsdemo.htm#c1_15%E3%80%82中,可以发现,热力图点的数据部分为

var points =[{"lng":经度,"lat":纬度,"count":数值},{"lng":经度,"lat":纬度,"count":数值},...]

所以我们要将我们存储在csv中的数据输出成这样的格式,代码如下(将二手房的关注度作为count的值):

import csvreader=csv.reader(open('da.csv'))
for row in reader:loc=row[1]sloc=loc.split(',')lng=''lat=''if len(sloc)==2:#第一行是列名需要做判断lng=sloc[0]lat=sloc[1]count=row[5]out='{\"lng\":'+lng+',\"lat\":'+lat+',\"count\":'+count+'},'print(out)

这样在编译器中会输出格式化好的经纬度信息,如下图所示:

接着新建一个html文件,将百度api中的示例代码拷贝进去,将var points中的点值换成刚才输出的值。最后,因为百度由于百度地图JavaScript API热力图默认的是以天安门为中心的北京区域地图,而我们的数据是南京的,所以这里还需要对热力图中“设置中心点坐标和地图级别”的部分进行修改。修改BMap.Point中的值为南京市中心的值,修改级别为12.

最后将html代码如下(因为点的数量实在太多,在这里我就只放三个点进去):

  <!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="viewport" content="initial-scale=1.0, user-scalable=no" /><script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=lB1LFGD8N6ydaTCSmVxiPYSly973KBHa"></script><script type="text/javascript" src="http://api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js"></script><title>热力图功能示例</title><style type="text/css">ul,li{list-style: none;margin:0;padding:0;float:left;}html{height:100%}body{height:100%;margin:0px;padding:0px;font-family:"微软雅黑";}#container{height:90%;width:100%;}#r-result{width:100%;}</style>
</head>
<body><div id="container"></div><div id="r-result"><input type="button"  onclick="openHeatmap();" value="显示热力图"/><input type="button"  onclick="closeHeatmap();" value="关闭热力图"/></div>
</body>
</html>
<script type="text/javascript">var map = new BMap.Map("container");          // 创建地图实例var point = new BMap.Point(118.800459,32.06715);map.centerAndZoom(point, 12);             // 初始化地图,设置中心点坐标和地图级别map.enableScrollWheelZoom(); // 允许滚轮缩放var points =[{"lng":101.538291069,"lat":30.0223723448,"count":41},{"lng":101.727603422,"lat":36.6316356868,"count":8},{"lng":99.7141240332,"lat":27.8175439265,"count":44}];if(!isSupportCanvas()){alert('热力图目前只支持有canvas支持的浏览器,您所使用的浏览器不能使用热力图功能~')}//详细的参数,可以查看heatmap.js的文档 https://github.com/pa7/heatmap.js/blob/master/README.md//参数说明如下:/* visible 热力图是否显示,默认为true* opacity 热力的透明度,1-100* radius 势力图的每个点的半径大小* gradient  {JSON} 热力图的渐变区间 . gradient如下所示*  {.2:'rgb(0, 255, 255)',.5:'rgb(0, 110, 255)',.8:'rgb(100, 0, 255)'}其中 key 表示插值的位置, 0~1.value 为颜色值.*/heatmapOverlay = new BMapLib.HeatmapOverlay({"radius":20});map.addOverlay(heatmapOverlay);heatmapOverlay.setDataSet({data:points,max:100});//是否显示热力图function openHeatmap(){heatmapOverlay.show();}function closeHeatmap(){heatmapOverlay.hide();}closeHeatmap();function setGradient(){/*格式如下所示:{0:'rgb(102, 255, 0)',.5:'rgb(255, 170, 0)',1:'rgb(255, 0, 0)'}*/var gradient = {};var colors = document.querySelectorAll("input[type='color']");colors = [].slice.call(colors,0);colors.forEach(function(ele){gradient[ele.getAttribute("data-key")] = ele.value;});heatmapOverlay.setOptions({"gradient":gradient});}//判断浏览区是否支持canvasfunction isSupportCanvas(){var elem = document.createElement('canvas');return !!(elem.getContext && elem.getContext('2d'));}
</script>  

最后,打开html文件,在浏览器中可以看到,热力图的效果如下,看起来还不错。

不过,因为在上面用百度API根据地名查询经纬度的部分,查询得到的经纬度有些并不是南京的,这个问题暂时还没想到解决办法。

Python爬取链家的数据并绘制热力图相关推荐

  1. python爬取链家新房数据_Python爬虫实战:爬取链家网二手房数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 买房装修,是每个人都要经历的重要事情之一.相对于新房交易市场来说,如今的二手房交易市场一点也 ...

  2. python爬取链家新房数据

    没有搜索到关于python爬虫,所以自己写一个 from bs4 import BeautifulSoup import requests import time import pandas as p ...

  3. python爬取链家网的房屋数据

    python爬取链家网的房屋数据 爬取内容 爬取源网站 爬取内容 爬取思路 爬取的数据 代码 获取房屋url 获取房屋具体信息 爬取内容 爬取源网站 北京二手房 https://bj.lianjia. ...

  4. python 爬取链家数据_用python爬取链家网的二手房信息

    题外话:这几天用python做题,算是有头有尾地完成了.这两天会抽空把我的思路和方法,还有代码贴出来,供python的初学者参考.我python的实战经历不多,所以代码也是简单易懂的那种.当然过程中还 ...

  5. python爬房源信息_用python爬取链家网的二手房信息

    题外话:这几天用python做题,算是有头有尾地完成了.这两天会抽空把我的思路和方法,还有代码贴出来,供python的初学者参考.我python的实战经历不多,所以代码也是简单易懂的那种.当然过程中还 ...

  6. python关于二手房的课程论文_基于python爬取链家二手房信息代码示例

    基本环境配置 python 3.6 pycharm requests parsel time 相关模块pip安装即可 确定目标网页数据 哦豁,这个价格..................看到都觉得脑阔 ...

  7. python爬取链家新房_Python爬虫实战:爬取链家网二手房数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 买房装修,是每个人都要经历的重要事情之一.相对于新房交易市场来说,如今的二手房交易市场一点也 ...

  8. 租房不入坑不进坑,Python爬取链家二手房的数据,提前了解租房信息

    目录 前言 一.查找数据所在位置: 二.确定数据存放位置: 三.获取html数据: 四.解析html,提取有用数据: 前言 贫穷限制了我的想象,从大学进入到社会这么久,从刚开始的兴致勃勃,觉得钱有什么 ...

  9. python 爬取链家成交房数据案例

    爬取链家网流程为request.get得到网页信息,将得到的信息放入BeautifulSoup,再调用select爬取所需信息,用re正则表达式进行更细的筛选,用strip过滤无用字符串.具体代码如下 ...

最新文章

  1. 基于sqlcmd命令行工具管理SQL server
  2. Excel 公式(细节若干)
  3. 一个老王开枪案例带你一步一步领略程序开发的魅力
  4. “约见”面试官系列之常见面试题第十二篇之cookie和localstorage(建议收藏)
  5. PHP内存管理机制与垃圾回收机制
  6. 熬了几个大夜,学完一套985博士总结的计算机视觉学习笔记(20G高清/PPT/代码)...
  7. 【论文笔记】node2vec:可扩展的网络特征学习
  8. 【Java 学习笔记】 抽象类和接口
  9. mysql用binlog回复_mysql binlog回复数据,亲测
  10. Springboot小区物业管理系统毕业设计源码051745
  11. 齐齐哈尔大学计算机考研资料汇总
  12. Windows 7 旗舰版高效办公 - 驱动安装
  13. 爬虫框架开发(4)--- 项目实战——新浪滚动新闻资讯实时数据采集
  14. EndNote仅修改一处引文格式为作者(年代)即Author(Date)的方法
  15. Xmanager 5问题记录
  16. 【java】Java连接mysql数据库及mysql驱动jar包下载和使用
  17. 关于STM32串口3的使用,接收并解析一帧数据
  18. 开启不明确行为的潘多拉盒子——解释
  19. 华为、腾讯、百度扎堆进入的自动驾驶仿真市场,到底藏着怎样的秘密?
  20. sandglass(沙漏)——一个让人解脱的python时间处理库

热门文章

  1. 三菱m70 m80系统解密 三菱m80机床到期解锁
  2. 淘宝中的UV,PV,IPV
  3. 【ZJOJ1321】灯
  4. 在家里赚钱的工作,在家利用互联网赚钱,应该这样干!
  5. 微信原图暴露的只能是 Exif ,你的隐私不在这!!!
  6. java找中点_java中点是什么意思
  7. python少儿编程课件ppt_《Python 少儿趣味编程》
  8. 设计模式03 行为型模式
  9. 收集的JS常用正则表达式等
  10. swift android界面,使用 Swift 语言编写 Android 应用入门