Python 实现高德地图找房

知识点
requests、BeautifulSoup、csv 等库的简单使用
高德地图 JavaScript API 的使用

1.安装需要的库:

sudo pip3 install --upgrade pip
sudo pip3 install bs4
sudo pip3 install lxml

用到三个文件:crawl.py、rent.csv与index.html,其中:

crawl.py 是一个非常简单的爬取网页的脚本。
rent.csv 由 crawl.py 生成,是房源文件。
index.html 是最重要的显示地图的部分。
实现的流程大致如下:

3-1

我为什么不把 js 代码和 css 代码从 index.html 中分出来呢,写脚本怎么顺手怎么来就好。

代码没有难度,主要就是看看几个 API 如何使用,下面给出文档链接:

高德 JavaScript API 帮助文档
高德 JavaScript API 示例中心
Requests: HTTP for Humans
Beautiful Soup 4.2.0 文档

本节将通过实践操作,带领大家利用高德 API 和 Python 解决租房问题。

注意:由于前端页面可能会经常发生变动,大家在这里主要掌握这种分析方法,如果页面发生了变化依然可以按照对应的方法进行爬取。

2.分析一下我们需要爬取的页面:https://bj.58.com/pinpaigongyu/。

选择好目标价位:

1

按 F12 键或右键点击检查分析元素:

1

我们发现所有的租房信息都是一个 li 标签,并且都位于 ul 标签下,当我们往下移的时候,相应的标签也会越来越多,所以我们便可以利用有无 list 类来判定是否为租房请求。当然,这是在没有任何条件获取到的全部信息,但很多信息我们是不会看的,既然有租房的意愿,那么我们就有一个大致的心理承受价格,因此我们可以来分析一下该网站的 url 构造形式,大致了解了它的路径规则:/pingpaigongyu/pn/{page}/minprice={min_rent}_{max_rent}

看一下页面能够提供给我们什么信息:

1

框框圈出的信息对我们来说已经足够了,点进去后还可以查看其他各类信息:

1

这些信息有些是经过了加密,并不一定准确,然后我们就可以根据以上信息来写一个小的爬虫程序。

创建 crawl.py 文件,这里先直接给出全部代码。

#!/usr/bin/env python3
from bs4 import BeautifulSoup # 网页解析模块
import requests # 网络请求模块
import csv # csv 文件模块
import time
import lxml
# 网址
url = "https://bj.58.com/pinpaigongyu/pn/{page}/?minprice=2000_4000"

# 初始化页码
page = 0
# 打开rent.csv文件,如果没有就创建一个,并设置写入模式
csv_file = open("rent.csv","w",encoding="utf-8")
# 创建writer对象
csv_writer = csv.writer(csv_file, delimiter=',')
# 循环所有页面
while True:
    page += 1
    print("fetch: ", url.format(page=page))
    time.sleep(1)
    # 抓取目标页面
    response = requests.get(url.format(page=page))
    # 设置编码模式
    response.encoding = 'utf-8'
    # 创建一个BeautifulSoup对象,获取页面正文
    html = BeautifulSoup(response.text,features="lxml")
    # 获取当前页面的房子信息
    house_list = html.select(".list > li")

    # 循环在读不到新的房源时结束
    if not house_list:
        break
       # 房子信息
    for house in house_list:
        # 获取房子标题
        house_title = house.select("h2")[0].string
        # 获取房子链接地址
        house_url = house.select("a")[0]["href"]
        # 对标题进行分隔
        house_info_list = house_title.split()
        # 如果第二列是公寓名则取第一列作为地址
        if "公寓" in house_info_list[1] or "青年社区" in house_info_list[1]:
            house_location = house_info_list[0]
        else:
            house_location = house_info_list[1]

        house_money = house.select(".money")[0].select("b")[0].string
        # 写入一行数据
        csv_writer.writerow([house_title, house_location, house_money, house_url])
        # 关闭文件
csv_file.close()

鉴于爬的量不大所以就简单处理了。代码中已经给出了大部分注释,这里只对requests、BeautifulSoup、csv 库的使用进行说明:

csv 一般用作表格文件,直接用文本编辑器打开也可读,行与行之间就是换行来隔开,列与列之间就是用逗号(也可指定其它字符)隔开,Python 标准库中的 csv 库就是用来读写 csv 文件的。

requests 是一个对使用者非常友好的 http 库,看一遍 Quickstart 就能基本掌握它的使用。

用到它的地方也就仅仅两句:

# 抓取目标页面
response = requests.get(url.format(page=page))
# 获取页面正文
response.text

Beautiful Soup 是一个用来解析 html 或者 xml 文件的库,支持元素选择器,使用起来也非常方便:

# 创建一个 BeautifulSoup 对象
html = BeautifulSoup(response.text,features="lxml")

# 获取 class=list 的元素下的所有 li 元素
house_list = html.select(".list > li")

# 得到标签包裹着的文本
house.select("h2")[0].string
# 得到标签内属性的值
house.select("a")[0]["href"]

由于该网站设置了反爬虫机制非常容易被屏蔽。因此在每次爬取页面时使用 time.sleep(1),1 代表 1 秒。讲解完毕,运行代码 python3 crawl.py。注意如果是非会员在实验环境中不能联网,执行爬取的操作大家可以在本地进行)。等执行完毕查看目录会发现已经生成了 rent.csv 文件:

因为反爬虫以及数据加密的原因所以数据可能是乱码的,大家可以使用这个文件继续接下来的实验。

wget https://labfile.oss.aliyuncs.com/courses/599/rent.csv

后面我们需要从本地导入这个文件,大家需要下载这个文件到本地。

页面大框架可直接从示例中心复制:高德 JavaScript API 示例中心。

在 /home/project 目录下新建 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>
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值