利用python爬取赶集网租房信息,并使用BDP在地图上展示,效果如下
可视化展示结果.png
达到上面的效果只需要三个步骤
- 爬取房屋信息
- 转换地址的经纬度
- 上传到BDP中可视化展示
赶集网的反爬措施比较弱,就连数据都是写死在html页面中的,所以我们可以直接爬取,唯一需要注意的就是ip访问频率限制,可以使用ip代理来解决,因为这个小项目我并没有爬取多少数据便没有加上ip代理
import requests
from lxml import etree
from urllib.parse import quote
import csv
# 唯一的反爬措施更改请求头即可
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
with open('ganjizufan.csv', 'w', newline='') as fp:
w = csv.writer(fp)
w.writerow(['addr', 'price', 'url', 'lng', 'lat'])
# 爬取页数设置,赶集网每秒都在刷新房源,正序翻页重复比较多,从倒序开始向前翻页
for i in range(3, 1, -1):
res = requests.get('http://sz.ganji.com/wblist/chuzu/pn%s/' % i, headers=header)
html = etree.HTML(res.text)
home_list = html.xpath("//div[contains(@class,'f-list')]/div")
for home in home_list:
item = dict()
addr = home.xpath(".//span[@class='address-eara']/text()")
# 有些无地址的直接过滤了
if not addr:
continue
price = home.xpath(".//div[@class='price']/span[1]/text()")
url = home.xpath(".//dd[contains(@class,'dd-item')]/a/@href")
item['addr'] = addr[0][:-3]
item['price'] = price[0]
item['url'] = url[0]
# 使用百度地图API将地址转为经纬度
addr1 = '深圳' + addr[0][:-3]
# url的ak值可以自己去http://lbsyun.baidu.com/apiconsole/key申请一个,每天10万条足够用了
api_url = 'http://api.map.baidu.com/geocoder/v2/?address=%s&output=json&ak=zoYzjoMyVzHTrwPEFzus9SuRpEHyPfAg'\
% quote(addr1)
res = requests.get(api_url)
data = res.json()
item['lng'] = data['result']['location']['lng']
item['lat'] = data['result']['location']['lat']
with open('ganjizufan.csv', 'a') as fp:
w = csv.writer(fp)
w.writerow(item.values())
因为使用BDP地图展示需要使用经纬度,所以我们可以通过百度地图的API进行地址和经纬度的转换,上面代码中我使用的是自己的ak值,愿意折腾的同学可以自己去申请一个http://lbsyun.baidu.com/apiconsole/key,每天免费10万的次数还是很良心的。
爬取完成后将数据存为一个CSV文件中,然后我们就可以打开在BDP中进行可视化展示设置了。
BDP的官网https://me.bdp.cn/index.html,注册后就能免费使用了。
-
在控制台中先把爬取的数据上传
1.png -
新建一个新的空白仪表盘,然后创建一个新的地图图标并关联上之前上传的工作表。
2.png
点击工作表设置经纬度对应的数据栏后将工作栏拖下去即可完成展示了
3.png
4.png
刚刚发现BDP这种神器,以后就不用自己用matplotlib画图了,而且界面还更漂亮,添加图层后你还可以对每个字段进行筛选和显示颜色设置,可定制的东西有很多
6.png
网友评论