热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

爬取自如租房信息

很多北漂都是通过自如来租房,自如网站提供了地图找房的功能,可以在地图上找到附近的房源,但是这样还是不够直观,这时候爬虫就派上用场了,可以帮助找房者快速的找到需要的房子,节省找房的时

很多北漂都是通过自如来租房,自如网站提供了地图找房的功能,可以在地图上找到附近的房源,但是这样还是不够直观,这时候爬虫就派上用场了,可以帮助找房者快速的找到需要的房子,节省找房的时间。

开发环境

  • Firefox 开发版

  • VSCode 编辑器

  • Anaconda3 (python3环境)

  • Mongodb 用于存储数据


爬虫原理

首先打开浏览器的开发者选项,观察一下自如的地图找房api接口
在浏览器中打开自如地图找房首页 http://www.ziroom.com/map/,将地图大小设置为14,点击减号,在network中查找前后端交互的请求,













image.png


请求如下图所示







image.png


url为
http://www.ziroom.com/map/room/count?min_lng=116.236046&max_lng=116.443016&min_lat=39.934614&max_lat=40.02617&clng=116.339531&clat=39.980407&zoom=14
提交GET参数为

{
"min_lng": "116.236046",#最小的经度
"max_lng": "116.443016",#最大的经度
"min_lat": "39.934614",#最小的纬度
"max_lat": "40.02617",#最大的纬度
"clng": "116.339531",#中心的经度
"clat": "39.980407",#中心的纬度
"zoom": "14"#地图放大的级别
}

返回的数据为








image.png

点击小区进去(比如望京)
HTTP请求url为http://www.ziroom.com/map/room/count?min_lng=116.444611&max_lng=116.496353&min_lat=39.989225&max_lat=40.012107&clng=116.470482&clat=40.000667&zoom=16
参数为

{
"min_lng": "116.444611",
"max_lng": "116.496353",
"min_lat": "39.989225",
"max_lat": "40.012107",
"clng": "116.470482",#与上面图中的一致
"clat": "40.000667",#与上面图中一致
"zoom": "16"
}

小区的最大最小经纬度如何确定的,不知道,再点开一个小区(这是亚运村小营),提交的参数为

{
"min_lng": "116.394021",
"max_lng": "116.445763",
"min_lat": "39.980199",
"max_lat": "40.003084",
"clng": "116.419892",
"clat": "39.991642",
"zoom": "16"
}

不难发现这两组参数中的max_lng-clng和max-clat为一个固定值
这样通过clng和clat就可以确定min_lng,max_lng,min_lat,max_lat的值了

代码实现

下面直接上代码

#-*- coding:utf-8 -*-
import requests,re,pickle,sys,json
from bs4 import BeautifulSoup
from requests.packages import urllib3
import pandas as pd
urllib3.disable_warnings()
from pymongo import MongoClient
#mongodb数据库,用于将爬取的租房信息存下来
mOngo= MongoClient('localhost',27017).zufang.ziru
#全局变量
room_info_list = []
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0',
'Origin':'http://www.ziroom.com'
}
#requests的会话对象
s = requests.Session()
#爬取每个小区的租房信息
def spider(info):
room_info_list = []
#当前页
pg = 1
#总的页数
pages = 1
url = 'http://www.ziroom.com/map/room/list'
#自如将地图划分成一个个矩形的小格子,每个小格式表示一个小区的范围,小格子的区域使用经纬度来表示
#提交的参数
#通过观察可以发现所有提交的参数中,格子边界距离中心的距离为固定值,这样就比较容易构造参数了
lat_diff = 0.011443
lng_diff = 0.025871
#这里所有参数值均为字符串
params = {
"max_lng": "%.6f" % (info['touch_lng'] + lng_diff),#最大经度
"min_lng": "%.6f" % (info['touch_lng'] - lng_diff),#最小经度
"max_lat": "%.6f" % (info['touch_lat'] + lat_diff),#最大纬度
"min_lat": "%.6f" % (info['touch_lat'] - lat_diff),#最小纬度
"clng": "%.6f" % info['touch_lng'],
"clat": "%.6f" % info['touch_lat'],
"zoom":"16",
"p":"1"
}

while pg <= pages:
params['p'] = str(pg)
r = s.get(url=url, params=params,headers=headers)
if r.status_code == 200:
data = r.json()
pages = data['data']['pages']

for item in data['data']['rooms']:
try:
#将结果存入数据库
mongo.update(
{"id":item['id']},
{
'$set':item
},
upsert = True
)
#将结果存储为csv格式
item['location'] = item['location'][0]['name']
for k,v in item.items():
#将list类型转化为str类型
if str(type(v)) == "":
item[k] = str(v)

#将//开关的url转化为http://开头
if str(type(v)) == "" and v.startswith('//'):
item[k] = 'http:' + v
room_info_list.append(item)
print(item['name'])
except:
pass
print(info['name'],pg,pages)
pg += 1
#将结果导入为csv格式,每个小区一个csv文件,方便筛选
if room_info_list:
pickle.dump(room_info_list,open('ziru_result/%s.db' % info['name'],'wb'))
df = pd.DataFrame(room_info_list)[['name','desc','price','location','detail_url']]
df.to_excel('ziru_result/%s.xls' % info['name'])



def main():
#获取北京所有小区的租房信息,
url = 'http://www.ziroom.com/map/room/count?min_lng=116.228373&max_lng=116.486653&min_lat=40.019069&max_lat=40.123091&clng=116.357513&clat=40.0711&zoom=14'
r = s.get(url,headers = headers)
if r.status_code == 200:
data = r.json()['data']
for item in data:
#爬取每个小区的租房信息
print(item)
spider(item)
main()

结果








爬取的结果




推荐阅读
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 本文详细介绍了如何使用Python中的smtplib库来发送带有附件的邮件,并提供了完整的代码示例。作者:多测师_王sir,时间:2020年5月20日 17:24,微信:15367499889,公司:上海多测师信息有限公司。 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 2022年2月 微信小程序 app.json 配置详解:启用调试模式
    本文将详细介绍如何在微信小程序的 app.json 文件中启用调试模式(debug),并通过实际案例展示其配置方法和应用场景。 ... [详细]
  • 本文详细介绍了如何在 Django 项目中使用 Admin 管理后台,包括创建超级用户、启动项目、管理数据模型和修改用户密码等步骤。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 本项目通过Python编程实现了一个简单的汇率转换器v1.02。主要内容包括:1. Python的基本语法元素:(1)缩进:用于表示代码的层次结构,是Python中定义程序框架的唯一方式;(2)注释:提供开发者说明信息,不参与实际运行,通常每个代码块添加一个注释;(3)常量和变量:用于存储和操作数据,是程序执行过程中的重要组成部分。此外,项目还涉及了函数定义、用户输入处理和异常捕获等高级特性,以确保程序的健壮性和易用性。 ... [详细]
  • 本文详细解析了Java类加载系统的父子委托机制。在Java程序中,.java源代码文件编译后会生成对应的.class字节码文件,这些字节码文件需要通过类加载器(ClassLoader)进行加载。ClassLoader采用双亲委派模型,确保类的加载过程既高效又安全,避免了类的重复加载和潜在的安全风险。该机制在Java虚拟机中扮演着至关重要的角色,确保了类加载的一致性和可靠性。 ... [详细]
  • Python错误重试让多少开发者头疼?高效解决方案出炉
    ### 优化后的摘要在处理 Python 开发中的错误重试问题时,许多开发者常常感到困扰。为了应对这一挑战,`tenacity` 库提供了一种高效的解决方案。首先,通过 `pip install tenacity` 安装该库。使用时,可以通过简单的规则配置重试策略。例如,可以设置多个重试条件,使用 `|`(或)和 `&`(与)操作符组合不同的参数,从而实现灵活的错误重试机制。此外,`tenacity` 还支持自定义等待时间、重试次数和异常处理,为开发者提供了强大的工具来提高代码的健壮性和可靠性。 ... [详细]
author-avatar
憐海周_472_151
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有