Python爬虫

2023-11-03

1.概述

最近看到一句话,感觉很扎心,这句话是”任何一个男孩子小时候的梦想,绝对不是买套房“。

其实,刚从象牙塔步入社会的时候,不曾想过房的事情。记得2016年房价猛涨,方才对房有了一些认知而已。直到随着年龄的增长,房子的故事便不得不需要展开了。

北上广深如今的房价又到了什么样惊人的数值呢?从贝壳找房最新的贝壳指数来看:北京是6.13万,上海5.62万,广州2.86万,深圳7.05万

今天,我们从贝壳找房 爬取了 8万+二手房源信息,看看在北京的二手房都是什么样的存在。

通过本篇,大家可以在了解北京二手房多维度信息的同时学习Python的re正则表达式、pandas数据处理以及绘图库(pyecharts、seaborn)柱状图+饼图+直方图+箱线图+map+热力图+堆叠图和高德api的使用等。

数据说明

数据来源:贝壳找房-二手房
数据日期:2020年12月28日
数据量级:82,346(含车位,数据处理阶段清洗)

工具环境

Python 3.8.5

用途
requests 爬虫请求网站数据
re 正则解析网页数据及数据清洗
pandas 数据清洗及统分
pyecharts 绘图
matplotlib 绘图
seaborn 绘图

2.数据采集

贝壳找房的数据爬取比较简单,简单的翻页规律和HTML网页文本解析。我们编写for循环,用requests请求数据,再用re正则表达式进行房源数据解析即可。

鉴于整个爬虫过程并不复杂,这里亦不细说,后续专题介绍如何获取全部数据。

网页源数据

房源数据解析代码如下:

# 请求网页数据函数
def get_html(url, proxies):
    try:
        rep = requests.get(url, headers= header, proxies= proxies, timeout=6)
    except Exception as e :
        print(e)
        proxies = get_proxies()
    rep = requests.get(url, headers= header, proxies= proxies, timeout=6)
    while  rep.status_code != 200:
        proxies = get_proxies()
        rep = requests.get(url, headers= header, proxies= proxies, timeout=6)        
    html = rep.text
    html = re.sub('\s', '', html) # 将html文本中非字符数据去掉        
          
    return html,proxies
# 循环请求每页数据
num = 0
for page in range(1,pages+1):
    items = []
    time.sleep(random.random())
    info_url = f'{url}/pg{page}'
    try:
        info_html, proxies = get_html(info_url, proxies)
    except Exception as e:
        print(e)
        continue

    sellListContent = re.findall(r'<ulclass="sellListContent"log-mod="list">(.*?)</ul>', info_html)[0]
    Lists = re.findall(r'<liclass="clear">(.*?)</li>', sellListContent)

    for List in Lists:
        try:
            # 获取房屋信息
            item = {}
            item['标题'] = re.findall(r'detail"title="(.*?)"data-hreftype=', List)[0]
            item['房子ID'] = re.findall(r'housedel_id=(\d+)&', List)[0]
            item['地址'] = re.findall(r'<ahref="(.*?)">(.*)</a>', List)[0][1]
            item['详情页'] = re.findall(r'<ahref="(.*?)">(.*)</a>', List)[0][0]
            item['详情'] = re.findall(r'<spanclass="houseIcon"></span>(.*?)</div>', List)[0]
            item['总价'] = re.findall(r'<divclass="totalPrice"><span>(\d+\.?\d*)</span>(.*?)</div>', List)[0][0]
            item['总价单位'] = re.findall(r'<divclass="totalPrice"><span>(\d+\.?\d*)</span>(.*?)</div>', List)[0][1]
            item['均价'] = re.findall(r'<divclass="unitPrice".*<span>(.*?)</span></div></div></div>', List)[0]
            item['关注人数'] = re.findall(r'<spanclass="starIcon"></span>(.*?)</div>', List)[0]
            item['地区'] = areaName
            item['价格区间'] = priceRange
            item['户型'] = layout
            items.append(item)
            num = num+1
            print(f'{num}个房子信息已经采集!')

        except Exception as e:
            print(e)
            print(item)
            continue

说明

由于翻页最多支持100页,每页约30个房源数据,如果我们想获取全部的数据,需要注意两点:

  • 可以通过进行更细颗粒度的筛选后再进行url的组合,一般来说可以通过 区域 和 价格区间 和 户型 进行组合即可,我这边即是采用这种组合策略;
  • 由于网站对同IP的访问频率和次数是有限制的,因此需要用到代理IP,购买付费的代理IP就可满足学习需求了,在requests.get()函数中加上proxies参数即可。

3.数据清洗

这部分我们用到pandasre,主要是过滤非住宅房源的车位数据信息,解析房源更多有用信息。

3.1.读取数据

import pandas as pd
import re

df = pd.read_excel('贝壳在售二手房数据20201228.xlsx')
df.sort_values(by='总价')

原始数据预览

我们可以看到,在原始数据中 详情包含的信息较多,比如楼层、户型、面积、建筑年份和朝向等等,对于地下室和底层的部分大多数都是车位,索性就不考虑这部分数据,这部分我们后续进行清洗。同时,在均价和关注人数中也都包含更多信息需要我们解析出来。

3.2.去掉车位(地下室)数据

# 车位条件,不一定严谨
mask = ((df['详情'].str.contains('地下室')) 
#         & (df['详情'].str.contains('1室'))
#         &(~df['详情'].str.contains(r'地下室\(共[2-9]|[1-9]\d+层\)'))
       )|((df['详情'].str.contains('底层')) & (df['详情'].str.contains('1室'))
           &(~df['详情'].str.contains(r'底层\(共[2-9]|[1-9]\d+层\)'))
         )
# 房子
house = df[~mask]
# 车位
carport = df[mask]
carport.sort_values(by='总价')

车位及部分别墅数据

哈哈,有点尴尬,部分别墅被误处理了。不过没事,别墅咱们就先不考虑,毕竟更买不起!

3.3.房源信息解析

# 详情信息解析
s = '中楼层(共9层)|2007年建|1室1厅|24.78平米|北'
# s = '地下室|2014年建|1室0厅|39.52平米|东'
# s = '底层(共2层)5室3厅|326.56平米|东南西北'
# s = '地下室1室0厅|11.9平米|南'
# re.split(r'(.+?)(\(共(.*)层\))*(\|((.*)年建)*\|)*?(\d+室.*?)\|(.*)平米\|(.*)',s)
re.split(r'(.+?)(?:\(共(.*)层\))?(?:\|(.*)年建\|)*?(\d+室.*?)\|(.*)平米\|(.*)',s)

详情信息解析结果

我在操作的时候用的是注释掉的正则表达式部分,后来在交流群里询问大佬明神后知道了**?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爬虫 的相关文章

随机推荐

  • Linux编码修改

    1 查看当前系统默认采用的字符集 locale 2 查看系统当前编码 echo LANG 如果输出为 en US UTF 8 英文 zh CN UTF 8 中文 3 查看系统是否安装中文字符集 locale a grep zh 如果出现了
  • JS的深拷贝函数

    自定义深拷贝函数 引入的赋值 指向同一个对象 相互之间会影响 对象的浅拷贝 只是浅层的拷贝 内部引入对象时 依然会相互影响 对象的深拷贝 两个对象不再有任何关系 不会相互影响 function isObject value const va
  • flask 开发Restful API :post get

    命令行安装flask pip install flask 新建脚本api py from flask import Flask from flask import request import json app Flask name app
  • 使你的IT职业生涯更上一层楼de14条建议

    摘要 升值为企业IT部门的领导者 是大部分IT技术人员职业生涯的最终追求 但从一般大众中脱颖而出 并非易事 仅仅把本职工作干好远远不够 还需要IT技术人员展示出投身于技术发展的奉献精神及伴随技术发展而发展的能力 升值为企业IT部门的领导者
  • OpenGL坐标变换及其数学原理,两种摄像机交互模型(附源程序)

    OpenGL坐标变换及其数学原理 两种摄像机交互模型 附源程序 实验平台 win7 VS2010 先上结果截图 文章最后下载程序 解压后直接运行BIN文件夹下的EXE程序 a 鼠标拖拽旋转物体 类似于OGRE中的 OgreBites Cam
  • 频繁跳槽是职场走下坡路的开始,Java程序员注意:跳槽前,你该考虑5个问题

    本文转载自 频繁跳槽是职场走下坡路的开始 Java程序员注意 跳槽前 你该考虑5个问题 职场上 跳槽是所有职场人都会遇到的问题 关于职场跳槽的理由 笔者做了以下盘点 和直接领导的矛盾导致离职 逃避问题而离职 工作压力大 挣钱少而离职 总之
  • Harbor安装及简单使用

    在虚拟机初始化的基础上 安装Docker wget O etc yum repos d CentOS Base repo http mirrors aliyun com repo Centos 7 repo wget https mirro
  • 2020-06-11

    你需要继续学习 这样一来如果有机会的话 你应该可以往前进一步
  • 【C语言】让你不再害怕指针——C指针详解(经典,非常详细)

    https blog csdn net qq 41035588 article details 79673674
  • java 读取excel数据

    本文共介绍两种方式 第一种是常规POI读取 第二种是大文件读取 依赖包
  • OpenCV3.3 + Python3.6 开发环境配置

    2018 9 6 更新 Anaconda3 5 2 0版本 Python 3 6 下OpenCV 3 安装 今天重新安装了 Python 的环境 发现在新版本 Anaconda3 下安装配置 OpenCV 3 十分简单 在 Anaconda
  • 【ubuntu虚拟机命令】+ 【mysql数据库】

    ubuntu虚拟机命令 cd 进入家目录 ll 查看文件列表 rm rf 目录名 删除目录 sudo su 从用户切换到 root su ubuntu 从 root 切换到 用户 vi bim 打开文件 i 编辑文件 退出 esc 保存退出
  • 40-400-020-运维-优化-使用MySQLTunner优化MySQL

    文章目录 1 概述 2 安装MySQL 3 下载 4 报告分析 1 概述 MySQLTuner 是一个 Perl 脚本 可以用来分析您的 MySQL 性能 并且基于收集到的信息给出相应的优化建议 这样子 您就可以调整 my cnf 从而优化
  • 关于colmap+nerf对数据集进行预处理的使用总结

    前言 零零碎碎的东西太多 有必要统一记录一下 因为是回忆步骤 所以可能有不准确的地方 Colmap的使用 1 下载 下载链接 colmap 下载之后直接解压就能使用 点击COLMAP bat 2 colmap 这里到处都是很详细的操作步骤
  • Chisel3 - util - LockingArbiter

    https mp weixin qq com s 5oAwH3scumARzPidRBfG2w 带锁多入单出仲裁器 输出会被锁定指定的时钟周期 参考链接 https github com freechipsproject chisel3 b
  • 单片机系统中实用的按键驱动(STM32、51都适用)

    目录 1 自己使用的按键驱动 1 1 驱动源码 1 2 使用方法 2 另一种按键驱动 2 1 驱动源码 2 2 使用方法 在我们嵌入式开发中 产品上往往少不了按键 一个好的按键驱动可以满足不同场合的客户需求 这里我分享几个实用的按键驱动 希
  • Python机器学习笔记 使用sklearn做特征工程和数据挖掘

    特征处理是特征工程的核心部分 特征工程是数据分析中最耗时间和精力的一部分工作 它不像算法和模型那样式确定的步骤 更多的是工程上的经验和权衡 因此没有统一的方法 但是sklearn提供了较为完整的特征处理方法 包括数据预处理 特征选择 降维等
  • 西门子S7-300 PLC 的50个经典问题

    1 使用CPU 315F和ET 200S时应如何避免出现 通讯故障 消息 使用CPU S7 315F ET 200S以及故障安全DI DO模块 那么您将调用OB35 的故障安全程序 而且 您已经接受所有监控时间的默认设置值 并且愿意接收 通
  • Linux 小结

    前言 为了便于理解 本文从常用操作和概念开始讲起 虽然已经尽量做到简化 但是涉及到的内容还是有点多 在面试中 Linux 知识点相对于网络和操作系统等知识点而言不是那么重要 只需要重点掌握一些原理和命令即可 为了方便大家准备面试 在此先将一
  • Python爬虫

    文章目录 1 概述 2 数据采集 3 数据清洗 3 1 读取数据 3 2 去掉车位 地下室 数据 3 3 房源信息解析 4 数据处理及可视化 4 1 各地区二手房源数 4 2 各地区二手房均价 4 3 各地区二手房总价 4 4 各地区二手房