Python+高德API解决实习租房问题
首先是在实验楼上看到这个项目的。刚好准备暑假实习租房,正好可以用到。实验和做项目的过程中也遇到了一些问题,特在此记录一下
Python版本:python 3.4
系统:Windows
1、首先实验中是通过从58上获取北京地区品牌公寓的租房信息,而本人是需要获得杭州的租房信息,因此目的地点不同,而且也不是要租品牌公寓,而是要获取实习工作地点附近的小区,然后对比小区进行实地勘察租房,这样来说才能租到相对便宜和好的房间。因此本项目中的房源主要是从安居客上面获取杭州600-1000价格房源的小区地址,然后将这些地址保存为csv文件。
具体获取房源小区的代码如下:
from bs4 import BeautifulSoup
import requests
import csv
import timeuser_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
headers = {'User-Agent': user_agent}csv_file = open("rent.csv","w", -1,"UTF-8",newline='')
csv_writer = csv.writer(csv_file, delimiter=',')while True:page += 1url = 'https://hz.zu.anjuke.com/fangyuan/zj5362-p' + str(page) + '/'print("fetch: ", url)time.sleep(1)response = requests.get(url,headers=headers)html = BeautifulSoup(response.text,features="lxml")house_list = html.select("div.zu-itemmod")# 循环在读不到新的房源时结束if not house_list:breakfor house in house_list:title= house.select("address.details-item a")[0].stringcsv_writer.writerow([title])csv_file.close()
将获取的代码保存入csv格式的文件中。上面保存入csv文件的信息需要注意的是本人使用的是Python3版本,原先看的实验楼实验中的python版本是2,所以信息即使保存入csv中,但是由于编码的问题,最后在调用高德API时出现了无法读取csv文件信息的问题。解决办法就是将csv文件写入的代码改为csv_file = open("rent.csv","w", -1,"UTF-8",newline=''),其中newline=''表示不换行写入。
2、其中在爬取信息的时候还遇到了一个问题,刚开始使用的是58同城爬取信息。但是58上面对价格这样的数字进行了编码,所以爬取到的价格信息是乱码的数字,形如:“齤閏麣”,通过查找网上的讲解和代码,解决了这个问题。具体的解决可以参考下面的代码:其中string表示获得的乱码的字符串,bs64_str是从网页中获得的编码方式
response = requests.get(url.format(page=page))
bs64_str = re.findall("charset=utf-8;base64,(.*?)'\)", response.text)[0]
def get_page_show_ret(string,bs64_str):font = TTFont(BytesIO(base64.decodebytes(bs64_str.encode())))c = font['cmap'].tables[0].ttFont.tables['cmap'].tables[0].cmapret_list = []for char in string:decode_num = ord(char)if decode_num in c:num = c[decode_num]num = int(num[-2:]) - 1ret_list.append(num)else:ret_list.append(char)ret_str_show = ''for num in ret_list:ret_str_show += str(num)return ret_str_show
3、获取到爬取的信息后,就可以进行调用高德API获取租房的信息了。具体的html代码和js代码如下所示,先贴出代码,后面再进行解释:
html文件:index.html
<html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width"><title>实习租房</title><link rel="stylesheet" href="http://cache.amap.com/lbs/static/main1119.css" /><link rel="stylesheet" href="http://cache.amap.com/lbs/static/jquery.range.css" /><script src="http://cache.amap.com/lbs/static/jquery-1.9.1.js"></script><script src="http://cache.amap.com/lbs/static/es5.min.js"></script><script src="http://webapi.amap.com/maps?v=1.3&key=5407348a92a67591a9f03dcfab278f0d&plugin=AMap.ArrivalRange,AMap.Scale,AMap.Geocoder,AMap.Transfer,AMap.Autocomplete"></script><script src="http://cache.amap.com/lbs/static/jquery.range.js"></script><style>.control-panel {position: absolute;top: 30px;right: 20px;}.control-entry {width: 280px;background-color: rgba(119, 136, 153, 0.8);font-family: fantasy, sans-serif;text-align: left;color: white;overflow: auto;padding: 10px;margin-bottom: 10px;}.control-input {margin-left: 120px;}.control-input input[type="text"] {width: 160px;}.control-panel label {float: left;width: 120px;}#transfer-panel {position: absolute;background-color: white;max-height: 80%;overflow-y: auto;top: 30px;left: 20px;width: 250px;}</style>
</head><body>
<div id="container"></div>
<div class="control-panel"><div class="control-entry"><label>选择工作地点:</label><div class="control-input"><input id="work-location" type="text"></div></div><div class="control-entry"><label>选择通勤方式:</label><div class="control-input"><input type="radio" name="vehicle" value="SUBWAY,BUS" onClick="takeBus(this)" checked/> 公交+地铁<input type="radio" name="vehicle" value="SUBWAY" onClick="takeSubway(this)" /> 地铁</div></div><div class="control-entry"><label>导入房源文件:</label><div class="control-input"><input type="file" name="file" onChange="importRentInfo(this)" /></div></div>
</div>
<div id="transfer-panel"></div>
<script src="rent.js"></script>
</body></html>
html中包含了地图接口的API,具体可以参看实验楼实验https://www.shiyanlou.com/courses/599以及高德开发者工具https://lbs.amap.com/api/javascript-api/example/map/get-mapzoom。其中需要解析的js文件命名为rent.js,这个也可以自己命名,重命名后记得将上面代码中指定的src="rent.js"改为自己的定义的问价名。
4、加载的js文件的代码如下:
var map = new AMap.Map("container", {resizeEnable: true,zoomEnable: true,center: [120.129072,30.222854],zoom: 11
});var scale = new AMap.Scale();
map.addControl(scale);var arrivalRange = new AMap.ArrivalRange();
var x, y, t, vehicle = "SUBWAY,BUS";
var workAddress, workMarker;
var rentMarkerArray = [];
var polygonArray = [];
var amapTransfer;
var infoWindow = new AMap.InfoWindow({offset: new AMap.Pixel(0, -30)
});var auto = new AMap.Autocomplete({input: "work-location"
});
AMap.event.addListener(auto, "select", workLocationSelected);function takeBus(radio) {vehicle = radio.value;loadWorkLocation()
}function takeSubway(radio) {vehicle = radio.value;loadWorkLocation()
}function importRentInfo(fileInfo) {var file = fileInfo.files[0].name;loadRentLocationByFile(file);
}function workLocationSelected(e) {workAddress = e.poi.name;loadWorkLocation();
}function loadWorkMarker(x, y, locationName) {workMarker = new AMap.Marker({map: map,title: locationName,icon: 'http://webapi.amap.com/theme/v1.3/markers/n/mark_r.png',position: [x, y]});
}
function loadWorkRange(x, y, t, color, v) {arrivalRange.search([x, y], t, function(status, result) {if (result.bounds) {for (var i = 0; i < result.bounds.length; i++) {var polygon = new AMap.Polygon({map: map,fillColor: color,fillOpacity: "0.4",strokeColor: color,strokeOpacity: "0.8",strokeWeight: 1});polygon.setPath(result.bounds[i]);polygonArray.push(polygon);}}}, {policy: v});
}
function addMarkerByAddress(address) {var geocoder = new AMap.Geocoder({city: "杭州",radius: 1000});geocoder.getLocation(address, function(status, result) {if (status === "complete" && result.info === 'OK') {var geocode = result.geocodes[0];rentMarker = new AMap.Marker({map: map,title: address,icon: 'http://webapi.amap.com/theme/v1.3/markers/n/mark_b.png',position: [geocode.location.getLng(), geocode.location.getLat()]});rentMarkerArray.push(rentMarker);rentMarker.content = "<div>房源:<a target = '_blank' href='http://hz.58.com/pinpaigongyu/?key=" + address + "'>" + address + "</a><div>"rentMarker.on('click', function(e) {infoWindow.setContent(e.target.content);infoWindow.open(map, e.target.getPosition());if (amapTransfer) amapTransfer.clear();amapTransfer = new AMap.Transfer({map: map,policy: AMap.TransferPolicy.LEAST_TIME,city: "杭州市",panel: 'transfer-panel'});amapTransfer.search([{keyword: address}, {keyword: workAddress}], function(status, result) {})});}})
}function delWorkLocation() {if (polygonArray) map.remove(polygonArray);if (workMarker) map.remove(workMarker);polygonArray = [];
}
function delRentLocation() {if (rentMarkerArray) map.remove(rentMarkerArray);rentMarkerArray = [];
}
function loadWorkLocation() {delWorkLocation();var geocoder = new AMap.Geocoder({city: "杭州",radius: 1000});geocoder.getLocation(workAddress, function(status, result) {if (status === "complete" && result.info === 'OK') {var geocode = result.geocodes[0];x = geocode.location.getLng();y = geocode.location.getLat();loadWorkMarker(x, y);loadWorkRange(x, y, 60, "#3f67a5", vehicle);map.setZoomAndCenter(11, [x, y]);}})
}function loadRentLocationByFile(fileName) {delRentLocation();var rent_locations = new Set();$.get(fileName, function(data) {data = data.split("\n");data.forEach(function(item, index) {rent_locations.add(item.split(",")[0]);});rent_locations.forEach(function(element, index) {addMarkerByAddress(element);});});
}
js代码具体的解释可以参看实验楼中具体的解释,我就不多说了。需要注意的是想要切换城市,首先要将 center: [120.129072,30.222854],中的经纬度改过来,具体的经纬度可以通过高德开发者的链接进行查看https://lbs.amap.com/api/javascript-api/example/map/get-mapzoom;然后需要将下面对应的城市中文名字修改过来。具体的细节以及代码解释可以参考上面给出的链接,看看高德开发者中的相应接口实现就能够理解了。
5、效果展示:
图中,右上角是选择的工作地点,确定地点后,选择交通方式,这里选择公交➕地铁,然后导入上面爬取的租房信息,图中标出的蓝色坐标就是对应的有房源的小区,点击房源就能得到相应的地图规划。
6、运行html文件以及加载js文件时通过webstorm平台实现的,其实也可以搭建简易的服务器进行实现,具体方法如下:
(1)打开cmd窗口,将路径转换到html和js文件所在的文件夹
(2)然后在路径下输入python -m http.server 888
(3)最后在浏览器中输入http://localhost:888/
就能实现打开html文件,只要cmd窗口不关,直接在浏览器中输入地址就能访问了。
Python+高德API解决实习租房问题相关推荐
- Python + 高德API实现自助找房
(一)本节知识点: 1,Python requests.BeautifulSoup.csv模块的使用 2,高德地图JavaScript API使用 参考文档: 1.高德 JavaScript ...
- python调用高德api路径规划_Python调用高德API实现批量地址转经纬度并写入表格的功能...
本段代码是先将需要转换经纬度的地址爬取在 '地址.csv' 文件里,文件截图示例: 代码展示 # coding=utf-8 # SPL # 时间:2020/12/20 21:15 import csv ...
- python调取高德api_Python调用高德API实现批量地址转经纬度并写入表格的功能
本段代码是先将需要转换经纬度的地址爬取在 '地址.csv' 文件里,文件截图示例: 代码展示 # coding=utf-8 # SPL # 时间:2020/12/20 21:15 import csv ...
- 高德API+Python解决租房问题
项目简介:编写Python脚本爬取某租房网站的房源信息,利用高德的 js API 在地图上标出房源地点,划出距离工作地点1小时内可到达的范围,附上公交路径规划功能查看不同路径的用时. 本教程由ekCi ...
- python解决租房问题_高德API+Python解决租房问题
项目简介:编写Python脚本爬取某租房网站的房源信息,利用高德的 js API 在地图上标出房源地点,划出距离工作地点1小时内可到达的范围,附上公交路径规划功能查看不同路径的用时. 本教程由ekCi ...
- python解决租房问题_高德API+Python帮你解决租房问题
项目简介:编写Python脚本爬取某租房网站的房源信息,利用高德的 js API 在地图上标出房源地点,划出距离工作地点1小时内可到达的范围,附上公交路径规划功能查看不同路径的用时. 本教程由ekCi ...
- 高德python解决租房项目费用_高德API+Python解决租房问题
项目简介:编写Python脚本爬取某租房网站的房源信息,利用高德的 js API 在地图上标出房源地点,划出距离工作地点1小时内可到达的范围,附上公交路径规划功能查看不同路径的用时.项目由ekCit发 ...
- 高德API+Python解决租房问题(.NET版)
源码地址:https://github.com/liguobao/58HouseSearch 在线地址:58公寓高德搜房(全国版):http://codelover.link:8080/ 周末闲着无事 ...
- 高德API+.NET解决租房问题(可能是最可靠房源:上海互助租房)
作者:李国宝 链接:https://zhuanlan.zhihu.com/p/22113421 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. PS:最近点赞和关注的 ...
- python分析成都房租信息,以及利用高德API查找租房
python分析成都租房信息,以及利用高德API查找租房 使用的技术 效果 爬虫 需要爬取的网页分析 爬虫源码 数据可视化 利用高德API查找租房 github地址 使用的技术 爬虫:Beautifu ...
最新文章
- sleep: invalid time interval ‘1s\r’
- python储存_python数据储存
- 自定义设置一个屏保程序
- ECS 游戏框架背景知识
- Spring如何优雅地发送异步发送通知?
- python 消息框架_消息框架message
- 积累的历年博客终于发完了
- Java教学系列视频教程孔浩
- 微信小程序中的列表渲染
- dhcp、tftp基础
- Solidworks常用插件介绍
- 【应用时间序列分析】第一章 时间序列分析简介
- python 点对点语音,Python(PyS60)实现简单语音整点报时
- 基于主成分分析法的PCA人脸识别算法实现
- 【项目实战】高并发内存池
- 关于KingbaseES启动数据库服务时,license授权文件路径的相关问题
- 在vue中报export ‘default‘ (imported as ‘Vue‘) was not found in ‘vue 解决办法
- Linux错误:bash:finger 未找到命令...
- 可能是国内第一篇全面解读Java现状及趋势的文章
- 机器学习:回归分析—— 一元线性回归、多元线性回归的简单实现
热门文章
- LeetCode刷题:电话号码的字母组合
- 赚q其实没那么难,不信你来看看
- PowerSensor AI教程1.1 - 数字识别 - tf模型训练
- cron表达式使用详解及C#中创建cron表达式,和计算下次执行时间
- 证书速览 | CISP-PTE含金量高吗?到底值不值得考?
- C语言--字符串和字符串函数(二)
- oracle library chace,Oracle library cache pin
- CMake、CMakeLists.txt
- 01-深度学习-win10系统下配置OpenCV-DNN模块使用CUDA(支持nvidia 显卡加速)
- 安卓 LinearLayout 的点击效果