首先是在实验楼上看到这个项目的。刚好准备暑假实习租房,正好可以用到。实验和做项目的过程中也遇到了一些问题,特在此记录一下

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解决实习租房问题相关推荐

  1. Python + 高德API实现自助找房

    (一)本节知识点:     1,Python requests.BeautifulSoup.csv模块的使用 2,高德地图JavaScript API使用 参考文档: 1.高德 JavaScript ...

  2. python调用高德api路径规划_Python调用高德API实现批量地址转经纬度并写入表格的功能...

    本段代码是先将需要转换经纬度的地址爬取在 '地址.csv' 文件里,文件截图示例: 代码展示 # coding=utf-8 # SPL # 时间:2020/12/20 21:15 import csv ...

  3. python调取高德api_Python调用高德API实现批量地址转经纬度并写入表格的功能

    本段代码是先将需要转换经纬度的地址爬取在 '地址.csv' 文件里,文件截图示例: 代码展示 # coding=utf-8 # SPL # 时间:2020/12/20 21:15 import csv ...

  4. 高德API+Python解决租房问题

    项目简介:编写Python脚本爬取某租房网站的房源信息,利用高德的 js API 在地图上标出房源地点,划出距离工作地点1小时内可到达的范围,附上公交路径规划功能查看不同路径的用时. 本教程由ekCi ...

  5. python解决租房问题_高德API+Python解决租房问题

    项目简介:编写Python脚本爬取某租房网站的房源信息,利用高德的 js API 在地图上标出房源地点,划出距离工作地点1小时内可到达的范围,附上公交路径规划功能查看不同路径的用时. 本教程由ekCi ...

  6. python解决租房问题_高德API+Python帮你解决租房问题

    项目简介:编写Python脚本爬取某租房网站的房源信息,利用高德的 js API 在地图上标出房源地点,划出距离工作地点1小时内可到达的范围,附上公交路径规划功能查看不同路径的用时. 本教程由ekCi ...

  7. 高德python解决租房项目费用_高德API+Python解决租房问题

    项目简介:编写Python脚本爬取某租房网站的房源信息,利用高德的 js API 在地图上标出房源地点,划出距离工作地点1小时内可到达的范围,附上公交路径规划功能查看不同路径的用时.项目由ekCit发 ...

  8. 高德API+Python解决租房问题(.NET版)

    源码地址:https://github.com/liguobao/58HouseSearch 在线地址:58公寓高德搜房(全国版):http://codelover.link:8080/ 周末闲着无事 ...

  9. 高德API+.NET解决租房问题(可能是最可靠房源:上海互助租房)

    作者:李国宝 链接:https://zhuanlan.zhihu.com/p/22113421 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. PS:最近点赞和关注的 ...

  10. python分析成都房租信息,以及利用高德API查找租房

    python分析成都租房信息,以及利用高德API查找租房 使用的技术 效果 爬虫 需要爬取的网页分析 爬虫源码 数据可视化 利用高德API查找租房 github地址 使用的技术 爬虫:Beautifu ...

最新文章

  1. sleep: invalid time interval ‘1s\r’
  2. python储存_python数据储存
  3. 自定义设置一个屏保程序
  4. ECS 游戏框架背景知识
  5. Spring如何优雅地发送异步发送通知?
  6. python 消息框架_消息框架message
  7. 积累的历年博客终于发完了
  8. Java教学系列视频教程孔浩
  9. 微信小程序中的列表渲染
  10. dhcp、tftp基础
  11. Solidworks常用插件介绍
  12. 【应用时间序列分析】第一章 时间序列分析简介
  13. python 点对点语音,Python(PyS60)实现简单语音整点报时
  14. 基于主成分分析法的PCA人脸识别算法实现
  15. 【项目实战】高并发内存池
  16. 关于KingbaseES启动数据库服务时,license授权文件路径的相关问题
  17. 在vue中报export ‘default‘ (imported as ‘Vue‘) was not found in ‘vue 解决办法
  18. Linux错误:bash:finger 未找到命令...
  19. 可能是国内第一篇全面解读Java现状及趋势的文章
  20. 机器学习:回归分析—— 一元线性回归、多元线性回归的简单实现

热门文章

  1. LeetCode刷题:电话号码的字母组合
  2. 赚q其实没那么难,不信你来看看
  3. PowerSensor AI教程1.1 - 数字识别 - tf模型训练
  4. cron表达式使用详解及C#中创建cron表达式,和计算下次执行时间
  5. 证书速览 | CISP-PTE含金量高吗?到底值不值得考?
  6. C语言--字符串和字符串函数(二)
  7. oracle library chace,Oracle library cache pin
  8. CMake、CMakeLists.txt
  9. 01-深度学习-win10系统下配置OpenCV-DNN模块使用CUDA(支持nvidia 显卡加速)
  10. 安卓 LinearLayout 的点击效果