Python爬取链家的数据并绘制热力图
最近开始入坑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爬取链家的数据并绘制热力图相关推荐
- python爬取链家新房数据_Python爬虫实战:爬取链家网二手房数据
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 买房装修,是每个人都要经历的重要事情之一.相对于新房交易市场来说,如今的二手房交易市场一点也 ...
- python爬取链家新房数据
没有搜索到关于python爬虫,所以自己写一个 from bs4 import BeautifulSoup import requests import time import pandas as p ...
- python爬取链家网的房屋数据
python爬取链家网的房屋数据 爬取内容 爬取源网站 爬取内容 爬取思路 爬取的数据 代码 获取房屋url 获取房屋具体信息 爬取内容 爬取源网站 北京二手房 https://bj.lianjia. ...
- python 爬取链家数据_用python爬取链家网的二手房信息
题外话:这几天用python做题,算是有头有尾地完成了.这两天会抽空把我的思路和方法,还有代码贴出来,供python的初学者参考.我python的实战经历不多,所以代码也是简单易懂的那种.当然过程中还 ...
- python爬房源信息_用python爬取链家网的二手房信息
题外话:这几天用python做题,算是有头有尾地完成了.这两天会抽空把我的思路和方法,还有代码贴出来,供python的初学者参考.我python的实战经历不多,所以代码也是简单易懂的那种.当然过程中还 ...
- python关于二手房的课程论文_基于python爬取链家二手房信息代码示例
基本环境配置 python 3.6 pycharm requests parsel time 相关模块pip安装即可 确定目标网页数据 哦豁,这个价格..................看到都觉得脑阔 ...
- python爬取链家新房_Python爬虫实战:爬取链家网二手房数据
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 买房装修,是每个人都要经历的重要事情之一.相对于新房交易市场来说,如今的二手房交易市场一点也 ...
- 租房不入坑不进坑,Python爬取链家二手房的数据,提前了解租房信息
目录 前言 一.查找数据所在位置: 二.确定数据存放位置: 三.获取html数据: 四.解析html,提取有用数据: 前言 贫穷限制了我的想象,从大学进入到社会这么久,从刚开始的兴致勃勃,觉得钱有什么 ...
- python 爬取链家成交房数据案例
爬取链家网流程为request.get得到网页信息,将得到的信息放入BeautifulSoup,再调用select爬取所需信息,用re正则表达式进行更细的筛选,用strip过滤无用字符串.具体代码如下 ...
最新文章
- 基于sqlcmd命令行工具管理SQL server
- Excel 公式(细节若干)
- 一个老王开枪案例带你一步一步领略程序开发的魅力
- “约见”面试官系列之常见面试题第十二篇之cookie和localstorage(建议收藏)
- PHP内存管理机制与垃圾回收机制
- 熬了几个大夜,学完一套985博士总结的计算机视觉学习笔记(20G高清/PPT/代码)...
- 【论文笔记】node2vec:可扩展的网络特征学习
- 【Java 学习笔记】 抽象类和接口
- mysql用binlog回复_mysql binlog回复数据,亲测
- Springboot小区物业管理系统毕业设计源码051745
- 齐齐哈尔大学计算机考研资料汇总
- Windows 7 旗舰版高效办公 - 驱动安装
- 爬虫框架开发(4)--- 项目实战——新浪滚动新闻资讯实时数据采集
- EndNote仅修改一处引文格式为作者(年代)即Author(Date)的方法
- Xmanager 5问题记录
- 【java】Java连接mysql数据库及mysql驱动jar包下载和使用
- 关于STM32串口3的使用,接收并解析一帧数据
- 开启不明确行为的潘多拉盒子——解释
- 华为、腾讯、百度扎堆进入的自动驾驶仿真市场,到底藏着怎样的秘密?
- sandglass(沙漏)——一个让人解脱的python时间处理库