爬取贝壳上北京房屋的租赁信息

python小白一枚~~
互联网从事数据分析行业,最近在努力学习python的爬虫和数据分析模块,在此记录下自己的学习过程和知识笔记,望大家多多提点~

言归正传,今天忽然兴致勃发的想看看北京现在房屋租售的行情,就把贝壳找房中北京的房屋租赁信息爬去下来做了个简单的分析。话不多说,放码过来!

首先先分析需要爬取的URL地址:https://bj.zu.ke.com/zufang/
在这里插入图片描述可以看到,根据不同的浏览页,URL会有页数的变化,并没有其他的动态加载过程,所以这个页面的数据爬取属于比较简单的类型。

在这里插入图片描述

第一步:发起http request,并得到response响应

import requests
import re
import json
import csv

def get_one_page(url):
    url = 'https://bj.zu.ke.com/zufang/pg'+str(i)   #这里url拼接就直接用每一页固定的URL+变动的page页
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0'}  
    Response = requests.get(url,headers=headers)
    if Response.status_code == 200: #成功连接  
        return Response.text
    else :
        print('爬取失败')
        return None   #这里比较简单,因为估计也不会被拒绝,所以对于3,4,5开头的status我都没写,非200就直接爬取失败~

第二步:分析html的信息,用正则表达式获取需要的数据

个人感觉正则表达式属于一个难点(我写了一个上午。。。),因为暂时还没有掌握xpath和BS4,所以这次的数据提取就用正则做的。
在这里插入图片描述红框中的信息,需要依次用正则提取出来,在这里就先不赘述提取过程了

分享给大家一个很好用的正则方法,就是 [\s\S]*? 这个非贪婪表达式,定位好每一段的开头和结尾字符,对于需要的信息,就用括号把这个非贪婪表达式括起来,作为列表或者字典索引的值,对于不需要的信息,直接写表达式即可。

def parse_one_page(html):
    pattern = re.compile('<a target="_blank" href="[\S\s]*?">([\S\s]*?)\s+ </a>\s+ </p>\s+<p class="content__list--item--des">[\S\s]*?>([\S\s]*?)</a>-<a[\s\S]*?target="_blank">([\S\s]*?)</a>-<a[\s\S]*?<i>/</i>([\s\S]*?)<i>/</i>([\s\S]*?)<i>/</i>([\S\s]*?)<span[\s\S]*?item-price"><em>([\s\S]*?)</em> ')
    #括号中的正则表达式就是用上边方法做的,大牛们可以自行定义,正则表达式写法应该还是挺多的~
    items = re.findall(pattern,html)
    for it in items:
        yield{
              "名称":it[0].strip( ),
              "城区":it[1].strip( ),
              "地区":it[2].strip( ),
              "面积":it[3].strip( ),
              "朝向":it[4].strip( ),
              "规格":it[5].strip( ),
              "价格":it[6].strip( )
              } #将正则表达式的结果,根据索引位置,用键值对写入字典

第三步:爬取1页信息:
现在我们已经通过正则找到html中的需要的元素了,下面就是爬取页面信息

def craw_one_page(i):
    url = 'https://bj.zu.ke.com/zufang/pg'+str(i)
    html = get_one_page(url)
    for item in parse_one_page(html):
        write_to_file(item)

这里的i代表需要爬取的页面数量,前文说过,贝壳的url会根据页码有规律的跳转,所以之后我们只要遍历页码就可以把全部信息抓下来。

第四步:保存到本地文件中

def write_to_file(item):
    with open("贝壳租房.csv","a",encoding="utf=8") as f:
        f.write(json.dumps(item,ensure_ascii=False)+'\n')
    f.close()

这一步就是建立csv文件,将爬取内容写入文件操作
但是有个很奇怪的问题,因为是with open ,所以理论上来说,应该不用写f.close(),但是我在执行的时候如果不写,就无法抓取全部的信息,只有一小部分,而且执行后还会报错,所以我就加上了。

第五步:主函数调用

if __name__ == '__main__':
    for i in range(1,101):
        craw_one_page(i)

贝壳上就显示了100页的租赁信息,我就都扒下来了。

剩下就是慢慢等待的时间了,本次没有用进程池处理,所以时间相对来说会慢很多。。。

在这里插入图片描述
这些就是导出结果啦~~
数据清洗后可以发现以下情况:
(图画的很一般,多多见谅。。。)
在这里插入图片描述
根据不同城区房屋租赁的平均面积和价格来看,昌平是平均租赁面积最小的,但是平均租赁价格确是数一数二的高,后边就知道了,都是大回龙观做的贡献。。。

在这里插入图片描述
可以看到,北京市房屋租赁热点地区,前四名分别是:朝阳(遍地开花)、昌平(回龙观一马当先)、通州(新华大街,北关,通州北苑三足鼎立),三个城区的房屋租赁数量占到了75%以上。。。

在这里插入图片描述
这是不同城区租赁房屋的户型占比图,数字是房屋中卧室的数量。可以看到昌平这边,租赁的房屋大多数都是4居室,属于大房子。
但是为啥在之前的图表中昌平的平均房屋面积是最小的呢?因为我发现大回龙观中房屋都是拆开租赁的,写的是4居室,但是价格和面积,却是那其中一个小屋子的描述。。。。

分析做的比较简单,基本就这些内容了,奉上几张不同城区的热点租赁地区的文字云~~

朝阳区:
在这里插入图片描述
昌平区:
在这里插入图片描述
通州区:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值