大家好,我是Python之眼。

最近有朋友们看了《爬取贝壳找房8万+二手房源,看看普通人在北京买房是有多难》之后,想爬取自己所在城市的成交房源数据做做分析之类的。

那么,今天我们就详情介绍下整个数据采集过程吧!

目录:

  • 这是准备阶段
  • 一如既往的页面分析
  • 二话不说的数据请求
  • 三复斯言的数据解析
    • >>寻找数据字段所在节点
    • >>re数据解析
    • >>获取全部页面房源数据
  • 四平八稳的数据清洗
    • >>数据去重
    • >>标题、朝向装修、楼层楼龄及位置信息清洗
    • >>最终数据预览

注:贝壳网目前部分城市是不显示成交房源信息的,这里只对公开信息做采集!

这是准备阶段

本次我们的组合拳是基于python的requests+re+pandas。

引入需要用到的库

import re
import requests
import pandas as pd

了解我们需要采集的数据字段:

待采集数据字段

一如既往的页面分析

以上海为例,我们打开二手房成交房源页面,网址https://sh.ke.com/chengjiao/pg2/。sh是指上海,大家可以根据自己所在的城市调整。

上海二手房

我们进行翻页操作,发现网址只有pg2部分的数字发生变化,而且和页码数是一致的。真好,基于这个简单的规律,我们可以组合出全部100页的url地址。

# 构建全部100个页面url地址
urls = []
for i in range(1,101):urls.append(f'https://sh.ke.com/chengjiao/pg{i}/')

urls

二话不说的数据请求

直接请出requests.get(url)方法,由于我们这次采用re正则表达式来解析数据,所以可以将请求的网页数据中的非字符数据去掉备用。

def get_html(url):headers = {"Accept-Encoding": "Gzip",  # 使用gzip压缩传输数据让访问更快"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36",}    resp = requests.get(url, headers= headers)html = resp.texthtml = re.sub('\s', '', html) # 将html文本中非字符数据去掉        return html

片段数据预览

三复斯言的数据解析

我们使用的是re正则表达式进行数据解析,关于re正在表达式更详细的用法大家可以参考此前推文《对着爬虫网页HTML学习Python正则表达式re》。

>>寻找数据字段所在节点

  • 由于每页有多个房源信息,我们先找到房源列表所在的节点区域

每页房源列表所在节点

  • 接着再看每个房源所在的节点区域,并确定每个数据字段所在的节点(比如标题信息、价格信息等)

标题信息

总价信息

>>re数据解析

为了更好的进行数据解析,可以先匹配到每页全部房源节点数据,然后再解析出每页全部房源信息列表。

解析获取房源列表数据:

ListContent = re.findall(r'<ulclass="listContent"data-query-id="\d+">(.*?)</ul>', html)[0]
Lists = re.findall(r'<divclass="info">(.*?)</li>', ListContent)

房源列表数据预览

解析获取单个房源数据:

根据单个房源信息数据字段,利用正则表达式一一解析,由于并非全部房源均有各个字段信息,所以这里采用findall后并没有直接切片获取字符串,我们放在后续数据清洗阶段处理。

List = Lists[3]
def get_house_info(List):house_info = {'房源ID' : re.findall(r'fb_item_id=(\d+)',List),'标题' : re.findall(r'<divclass="title"><ahref=".*?">(.*?)</a>',List),'朝向装修' : re.findall(r'<divclass="houseInfo"><spanclass="houseIcon"></span>(.*?)</div>',List),'日期' : re.findall(r'<divclass="dealDate">(.*?)</div>',List),'总价' : re.findall(r'<divclass="totalPrice"><spanclass=\'number\'>(.*?)</span>',List),'楼层楼龄' : re.findall(r'<divclass="positionInfo"><spanclass="positionIcon"></span>(.*?)</div>',List),'单价' : re.findall(r'<divclass="unitPrice"><spanclass="number">(.*?)</span>',List),'位置' : re.findall(r'<spanclass="dealHouseTxt"><span>(.*?)</span>',List),'挂牌价' : re.findall(r'<spanclass="dealCycleTxt"><span>挂牌(.*?)万</span>',List),'成交周期' : re.findall(r'<span>成交周期(.*?)天</span>',List),}return house_info

房源数据信息

>>获取全部页面房源数据

直接遍历全部url并解析每一个url下全部房源数据即可,有兴趣的可以采用多进程等加速处理。(需要注意的是,贝壳这边存在ip反爬,如果爬取数据量过大或者频率过高会请求不到想要的数据,可以设置请求间隔或者代理ip的方式处理,本文这里不做详细展开)

house_infos = []
num = 0
for url in urls:html = get_html(url)ListContent = re.findall(r'<ulclass="listContent"data-query-id="\d+">(.*?)</ul>', html)[0]Lists = re.findall(r'<divclass="info">(.*?)</li>', ListContent)for List in Lists:num = num+1house_info = get_house_info(List)house_infos.append(house_info)print(f'\r{num}个成交房源数据已采集...', end='')
df = pd.DataFrame(house_infos)

数据预览

四平八稳的数据清洗

由于我们在数据解析的时候得到的每个字段的元素都是元素为1或0个的列表,这里需要解析为字符串,直接用explode()即可。

df = df.apply(lambda x : x.explode())

初步解析

>>数据去重

按照房源ID进行去重即可。

df.drop_duplicates(subset='房源ID',inplace=True)

>>标题、朝向装修、楼层楼龄及位置信息清洗

标题可以清洗出 小区、户型和面积三个字段,我们直接用extract()方法进行处理。

df.标题.str.extract(r'(?P<小区>.+?)(?P<户型>\d+室.*?[厅]*)(?P<面积>\d+\.*\d*?)平米')

标题清洗

朝向装修 就是朝向和装修

df.朝向装修.str.extract(r'(?P<朝向>.*)\|(?P<装修>.*)')

朝向装修

楼层楼龄 就是楼层(高中低)和建筑年龄

df.楼层楼龄.str.extract(r'(?P<楼层>.*)\(.*?\)(?P<楼龄>\d+)年')

楼层楼龄

位置信息 就是 地铁线路、地铁及距离地铁距离

df.位置.str.extract(r'(?P<地铁线路>.*线)(?P<地铁>.*?)(?P<距离>\d+)米')

位置信息

>> 最终数据预览

df[['房源ID',  '日期', '小区','户型','面积','总价', '单价',  '挂牌价', '成交周期','朝向', '装修', '楼层', '楼龄', '地铁线路', '地铁', '距离']]

最终数据预览

到这一步,我们就完成了全部数据采集与清洗,接着就可以对这些数据进行数据分析处理和可视化展示了。

关于本文全部代码,申请QQ群:705933274  免费领取

Python爬虫 | 手把手教你扒一扒贝壳网成交房源数据相关推荐

  1. Python爬虫——手把手教你爬取王者荣耀英雄皮肤

    大家好!我是霖hero 大家知道目前最火的手游是哪个嘛,没错,就是王者荣耀,这款手游想必大家都听过或者玩过吧,里面有106个英雄,几百个英雄皮肤,今天我来手把手教你们把几百个皮肤都爬取下来. 目录 P ...

  2. python爬取二手房信息_刚刚接触PythonR?教你爬取分析赶集网北京二手房数据(附详细代码)...

    原标题:刚刚接触Python&R?教你爬取分析赶集网北京二手房数据(附详细代码) 源 /数据森麟文 /徐涛 前言: 本文主要分为两部分:Python爬取赶集网北京二手房数据&R对爬取的 ...

  3. python跑得慢_代码跑得慢甩锅Python?手把手教你如何给代码提速30%

    原标题:代码跑得慢甩锅Python?手把手教你如何给代码提速30% 来源丨Medium 编译丨王转转 大数据文摘出品 https://mp.weixin.qq.com/s/bY3REj6qVw0M1N ...

  4. python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...

    原标题:Python大牛手把手教你做一个小游戏,萌新福利! 引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规 ...

  5. “攻城狮”手把手教你物联网智能生活-内网穿透技术

    "攻城狮"手把手教你物联网智能生活-内网穿透技术 内网穿透技术,即实现外网IP访问内网IP而发展起来的一种计算机技术.在了解内网穿透技术之前,我们需要先了解IP和内网外网的概念. ...

  6. Python爬虫系列之爬取某奢侈品小程序店铺商品数据

    Python爬虫系列之爬取某奢侈品小程序店铺商品数据 小程序爬虫接单.app爬虫接单.网页爬虫接单.接口定制.网站开发.小程序开发> 点击这里联系我们 < 微信请扫描下方二维码 代码仅供学 ...

  7. Python爬虫之XPath基础教程:用代码抓取网页数据

    Python爬虫之XPath基础教程:用代码抓取网页数据 在网络时代,网页数据是获取信息和进行分析的最重要的来源之一.Python的爬虫技术让我们可以轻松抓取网页数据,并进行数据处理.XPath是一种 ...

  8. Python之手把手教你用JS逆向爬取网易云40万+评论并用stylecloud炫酷词云进行情感分析

    本文借鉴了@平胸小仙女的知乎回复 https://www.zhihu.com/question/36081767 写在前面: 文章有点长,操作有点复杂,需要代码的直接去文末即可.想要学习的需要有点耐心 ...

  9. 零基础学习python爬虫_教你零基础如何入门Python爬虫!

    Python爬虫好学吗?看你怎么学了.如果是自学,会难一些,毕竟有难题很难找到人帮你解答,很容易半途而废.要是你找到了一家靠谱的学校,就会容易很多.不过,这里我想教你入门Python爬虫. 一:爬虫准 ...

  10. Python学习教程:0基础学Python?手把手教你从变量和赋值语句学

    这篇Python学习教程将手把手教你入门学Python,从变量和赋值语句学起,前面也有专门给大家出过相关的详细教程,有需要的伙伴,可以找一下前面的教程! 导读:在本文中,你会学到如何处理数字.定义与使 ...

最新文章

  1. SAP PP MD04结果里没考虑受限使用库存?
  2. 1、tomcat目录及端口规划实践
  3. 落纱机器人_「聚焦」青岛艾菲特智能落纱机器人—智能制造,为您省工
  4. Python正则表达式如何进行字符串替换实例
  5. 【Leetcode | 1】3. 无重复字符的最长子串
  6. E-triples II_2019牛客暑期多校训练营(第四场)
  7. 蓝桥杯 ADV-221 算法提高 7-1用宏求球的体积
  8. 趣学Python之弹球游戏第三阶段--上下反弹
  9. 如何更方便地调试javascript代码
  10. 网管学习日记-MPLS-LDP协议配置
  11. TCP-UDP混合使用模式
  12. csdn泄漏密码分析
  13. 【RBF预测】基于RBF神经网络预测模型matlab源码
  14. dsolve解微分方程
  15. matlab中e如何输入,Matlab中表达e的操作方法介绍
  16. 刘寅:TiDB 工具链和生态
  17. 【NOIP模拟题】【DP】【LIS】【中缀表达式】2016.11.15 第一题 小L的二叉树 题解
  18. 仿soul交友盲盒1.0全开源源码
  19. android图片识别代码,android orc 图片文档识别源代码 - 下载 - 搜珍网
  20. oracle如何修改单个用户密码永不过期

热门文章

  1. cuda必须装在c盘吗_怎样把C盘的所有文件移到D盘或E盘里去?
  2. ESXI7.0下载地址
  3. 列举在100到200以内的质数
  4. carry on till tomorrow
  5. python最优投资组合_4计算投资组合最优比例
  6. 学海无涯!java全栈工程师面试题
  7. Cell:植物根系如何允许有益微生物定植的
  8. 中国石油大学(北京)-《 修井工程》第二阶段在线作业
  9. j和jk是有区别的_科普向,大家都说jk,jk是什么意思呢?
  10. 软考中级网络工程师证书如何查询?