博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
爬取自如租房信息
阅读量:2061 次
发布时间:2019-04-29

本文共 4200 字,大约阅读时间需要 14 分钟。

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

开发环境

  • Firefox 开发版
  • VSCode 编辑器
  • Anaconda3 (python3环境)
  • Mongodb 用于存储数据

爬虫原理

首先打开浏览器的开发者选项,观察一下自如的地图找房api接口

在浏览器中打开自如地图找房首页 ,将地图大小设置为14,点击减号,在network中查找前后端交互的请求,

image.png
请求如下图所示
image.png
url为
提交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为
参数为

{    "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,jsonfrom bs4 import BeautifulSoup from requests.packages import urllib3import pandas as pdurllib3.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()

结果

爬取的结果

转载地址:http://erqlf.baihongyu.com/

你可能感兴趣的文章
《redis设计与实现》 第二部分(第9-11章):单机数据库的实现
查看>>
算法工程师 面经2019年5月
查看>>
搜索架构师 一面面经2019年6月
查看>>
稻草人手记
查看>>
第一次kaggle比赛 回顾篇
查看>>
leetcode 50. Pow(x, n)
查看>>
leetcode 130. Surrounded Regions
查看>>
【托业】【全真题库】TEST2-语法题
查看>>
博客文格式优化
查看>>
【托业】【新托业全真模拟】疑难语法题知识点总结(01~05)
查看>>
【SQL】group by 和order by 的区别。
查看>>
【F12】谷歌浏览器--前台效果可以在不访问服务器的前提下直接改样式看效果是否是预期值。...
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>
Shell 和Python的区别。
查看>>
Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
查看>>
Loadrunner之https协议录制回放报错如何解决?(九)
查看>>
python中xrange和range的异同
查看>>
列表、元组、集合、字典
查看>>
【Python】easygui小甲鱼
查看>>