爬取某家网二手房数据(详细教程)

  • 项目描述:
  • 项目实施:
    • 1. 确定目标
      • 1.1 先来说第一个页面
        • 上述设置的目的是:
        • 所以我们可以在代码中这样呈现:
      • 1.2中间的列表部分
        • 下面的翻页部分:
      • 1.3 第二个页面
        • 从价格部分可以获取到:参考总价、单价
        • 从所在区域可以获取到:小区名称、大区域+小区域
        • 基本信息+交易信息数据如下图:
        • 最后是地图部分的数据:
    • 2. 流程设计
    • 3. 主要代码复现
      • 核心代码分析,完整代码看链接:
      • 获取当前条件下的房屋数据个数:
      • 判断是否超过3000,若超过则进行第二级筛选,若未超过则直接获取数据
    • 4. 运行
  • 完整代码:
  • 总结:

今天分享一篇爬虫教程,文章比较细致,适合刚上手的小白,老读者可以酌情加速阅读
文中涉及的代码已经测试过,可以正常跑通,文章案例的所有数据也已经成功爬取。


项目描述:

今天要分享的教程是爬取各大城市的二手房数据,实现这篇爬虫也可融汇贯通到其他相关项目。


项目实施:

1. 确定目标

我们的目标官网链接是:https://www.lianjia.com/
对应的某个城市的二手房页面应该是:https://sz.lianjia.com/ershoufang/
JN 代表城市济南的简写,对应的青岛是 QD。

⚠️⚠️⚠️:有两个页面需要注意,第一个页面是打开某个地区二手房链接之后显示的列表页面,第二个页面是点击某个二手房的链接之后跳转的房屋详细数据页面
列表页面

房屋详细信息页面

1.1 先来说第一个页面

这个页面包括三部分,最上面的搜索部分、中间的列表部分、下面的翻页部分。
上面的搜索部分看似无用,但也暗藏玄机。
举个最直观的例子:在某个搜索条件下,例如济南,对应的清单中有 55809 条记录
而你将页面拉到最下面进行翻页,发现实际只有 100 页可供操作

根据每一页只有 30 条数据的官方设置,如果不设置搜索条件,只能拿到 3000 条数据
所以,要想获取全部数据,第一个搜索功能就派上用场了。
但是,添加搜索必然会提高整个程序的复杂度,特别是现在有如此多的搜索条件

综上,我们可以选择的解决方式是筛选出重要且能完美区分的搜索条件,例如:区域+户型+朝向

上述设置的目的是:

通过条件设置之后,通过筛选 xx区 的数据,发现数据大于 3000条,则利用户型是 x居室 的进行二次筛选,如果发现仍大于 3000条,再次通过朝x向进行第三次筛选,基本上到了第三次筛选之后,我们可以拿到我们想要的数据。

筛选条件除了每个城市的区域没法固定外,居室和朝向都是固定的
通过F12查看源码可以看到居室和朝向对应的定位如下:

所以我们可以在代码中这样呈现:
# 户型:一室、二室、三室、四室、五室、五室+
self.rooms_number = ['l1', 'l2', 'l3', 'l4', 'l5', 'l6']
# 朝向:朝东+朝南+朝西+朝北+南北
self.orientation = ['f1', 'f2', 'f3', 'f4', 'f5']

1.2中间的列表部分

列表部分有 3 个信息需要注意,如下图:

分别是:小区名+区域、价格以及其他标签

如果这些信息已经可以满足数据需求,那对应的爬虫只需要获取这个页面的数据,不需要分析第二个页面了,工作难度就下降了

如果还需要更详细的二手房指标,例如:挂牌时间、抵押情况、产权等数据,那就需要分析第二个页面了

下面的翻页部分:

翻页部分原理比较简单,通过多次点击下一页按钮,观察新页面的 url 链接就能发现规律

例如:https://sz.lianjia.com/ershoufang/luohuqu/pg2l1/ 中的 pg2 对应的是第二页的数据而 l1 在前面我们已经知道是一居室的意思,所以对应的翻页页面的 url 规则应该是:

主网页+区域+pg页码+居室

在翻页遍历的过程中只需要更改 pg页码 即可。

1.3 第二个页面

第二个页面是通过第一个页面点击跳转的:

通过点击图中的标签,会跳转到下面链接对应的新页面

链接中后面的数字编号对应的是该二手房的编码id。例如:https://jn.lianjia.com/ershoufang/103116780960.html 中 103116780960 是对应ID

第二个页面有三个部分,分别是:价格+位置、基本信息+交易信息、地图价格+位置部分数据如下图:

从价格部分可以获取到:参考总价、单价
从所在区域可以获取到:小区名称、大区域+小区域

基本信息+交易信息数据如下图:

最后是地图部分的数据:

这部分数据比较多,例如:最近的地铁站点、公交站点等以及在地图插件中隐藏的房屋经纬度数据,这里只获取了经纬度数据

2. 流程设计

目标已经明确,总结一下我们需要注意的地方:

首先,判断该城市的总数据是否超过 3000 条,若超过则设置筛选条件。先通过区域进行筛选,其次通过居室进行筛选,最后通过朝向进行筛选

上述筛选过程中任一过程若存在数据小于 3000条,则停止往下筛选。

然后,在确定筛选条件之后,通过解析每一页的二手房链接跳转到详情页。翻页操作只需要根据页码重新构造 url

最后,对二手房详情页进行解析,保存数据到本地文件中。

3. 主要代码复现

核心代码分析,完整代码看链接:

《爬取某家网(济南)二手房数据(代码)》

获取当前条件下的房屋数据个数:

def get_house_count(self):  """  获取当前筛选条件下的房屋数据个数  """  # 爬取区域起始页面的数据  response = requests.get(url=self.current_url, headers=self.headers)  # 通过 BeautifulSoup 进行页面解析  soup = BeautifulSoup(response.text, 'html.parser')  # 获取数据总条数  count = soup.find('h2', class_='total fl').find('span').string.lstrip()  return soup, count

判断是否超过3000,若超过则进行第二级筛选,若未超过则直接获取数据

def get_main_page(self):  # 获取当前筛选条件下数据总条数  soup, count_main = self.get_house_count()  # 如果当前当前筛选条件下的数据个数大于最大可查询个数,则设置第一次查询条件  if int(count_main) > self.page_size*self.max_pages:  # 获取当前地市的所有行政区域,当做第一个查询条件  soup_uls = soup.find('div', attrs={'data-role': 'ershoufang'}).div.find_all('a')  self.area = self.get_area_list(soup_uls)  # 遍历行政区域,重新生成筛选条件  for area in self.area:  self.get_area_page(area)  else:  # 直接获取数据  self.get_pages(int(count_main), '', '', '')  # 保存数据到本地  self.data_to_csv()

对应的在确定区域的条件下,继续判断并筛选居室
在确定区域和居室的条件下,继续判断并筛选朝向
在确定区域、居室和朝向的条件下,直接获取 前3000条数据

在代码执行的过程中,建议每获取到 n条 数据保存一次,避免中途程序出错而前功尽弃

'''超过n条数据,保存到本地'''
if len(self.data_info) >=n:  self.data_to_csv()

在保存到本地 csv 的时候,采用追加的方式进行保存
也就是在 data_to_csv 函数中:

def data_to_csv(self):  """  保存/追加数据到本地  @return:  """  df_data = pd.DataFrame(self.data_info)  if os.path.exists(self.save_file_path) and os.path.getsize(self.save_file_path):  # 追加写入文件  df_data.to_csv(self.save_file_path, mode='a', encoding='utf-8', header=False, index=False)  else:  # 写入文件,带表头  df_data.to_csv(self.save_file_path, mode='a', encoding='utf-8', index=False)  # 清空当前数据集  self.data_info = []

另外,考虑到大多时候需要运行好几次程序才能获取到所有数据

在每次运行程序的时候先统计已经爬到的房屋数据,跳过已经爬到的数据

可以这样写:

# 所有已经保存的房屋 id,用来验证去重
self.house_id = self.get_exists_house_id()  def get_exists_house_id(self):  """  通过已经爬取到的房屋信息,并获取房屋id  @return:  """  if os.path.exists(self.save_file_path):  df_data = pd.read_csv(self.save_file_path, encoding='utf-8', )  df_data['house_id'] = df_data['house_id'].astype(str)  return df_data['house_id'].to_list()  else:  return []

最后,在主函数中只需要设置城市名称和数据保存路径即可

代码如下:

if __name__ == '__main__':  city_number = 'JN'  city_name = '济南'  url = 'https://{0}.lianjia.com/ershoufang/'.format(city_number)  page_size = 30  save_file_path = '二手房数据-JN.csv'  house = House(city_name, url, page_size, save_file_path)  house.get_main_page()

4. 运行

如果是第一次运行程序,设置好相关参数后,运行截图如下:

如果之前有运行过程序,中途退出了。
再次运行时无需设置参数,直接运行即可,截图如下:

最终爬取到的部分数据如下:

完整代码:

《爬取某家网(济南)二手房数据(代码)》

总结:

整体来说,流程的设计比较繁琐,但是是很基础的一篇内容

另外,建议大家在运行的过程中,适当的设置程序休眠,理性爬虫

以上代码仅用于交流学习,不可用于商业用途

Authors
杜小白

爬取某家网二手房数据(详细教程)相关推荐

  1. 爬取链家网二手房数据并保存到mongodb中

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 爬取链家网二手房数据并保存到mongodb中 文章目录 前言 一.爬虫的介绍 二.协程的介绍 三.css选择器 四.基于asyncio ...

  2. python爬取链家新房_Python爬虫实战:爬取链家网二手房数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 买房装修,是每个人都要经历的重要事情之一.相对于新房交易市场来说,如今的二手房交易市场一点也 ...

  3. python爬取链家新房数据_Python爬虫实战:爬取链家网二手房数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 买房装修,是每个人都要经历的重要事情之一.相对于新房交易市场来说,如今的二手房交易市场一点也 ...

  4. Python爬虫攻略(2)Selenium+多线程爬取链家网二手房信息

    申明:本文对爬取的数据仅做学习使用,请勿使用爬取的数据做任何商业活动,侵删 前戏 安装Selenium: pip install selenium 如果下载速度较慢, 推荐使用国内源: pip ins ...

  5. python 爬取链家数据_用python爬取链家网的二手房信息

    题外话:这几天用python做题,算是有头有尾地完成了.这两天会抽空把我的思路和方法,还有代码贴出来,供python的初学者参考.我python的实战经历不多,所以代码也是简单易懂的那种.当然过程中还 ...

  6. Python 小项目 01 爬虫项目 爬取链家网南京地区二手房信息

    SpiderLianjia 介绍 python爬虫小程序,爬取链家网南京地区普通住宅二手房数据. 代码下载: https://gitee.com/lihaogn/SpiderLianjia 1 程序设 ...

  7. Scrapy实战篇(一)之爬取链家网成交房源数据(上)

    今天,我们就以链家网南京地区为例,来学习爬取链家网的成交房源数据. 这里推荐使用火狐浏览器,并且安装firebug和firepath两款插件,你会发现,这两款插件会给我们后续的数据提取带来很大的方便. ...

  8. python爬房源信息_用python爬取链家网的二手房信息

    题外话:这几天用python做题,算是有头有尾地完成了.这两天会抽空把我的思路和方法,还有代码贴出来,供python的初学者参考.我python的实战经历不多,所以代码也是简单易懂的那种.当然过程中还 ...

  9. python爬取链家网的房屋数据

    python爬取链家网的房屋数据 爬取内容 爬取源网站 爬取内容 爬取思路 爬取的数据 代码 获取房屋url 获取房屋具体信息 爬取内容 爬取源网站 北京二手房 https://bj.lianjia. ...

  10. 五十七、爬取链家网北京二手房信息,并进行线性回归建模

    @Author : By Runsen @Date:2020/5/31 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严 ...

最新文章

  1. MATLAB_4-形态学_腐蚀_膨胀_灰度图的腐蚀以及膨胀_开运算_闭运算_文章末尾有几个素材例子
  2. 分类(classification)是认知的基础、分类步骤及主要算法、分类与回归的区别、分类过程
  3. mysql使用命令提示符创建库表
  4. struts2之单个文件上传
  5. 配置apache2目录
  6. 本地项目怎么推送到码云_如何将本地项目放到码云(gitee)上
  7. 为什么使用 Redis及其产品定位
  8. redhat7.2创建本地yum源
  9. (转载)C#提取汉字拼音首字母的方法
  10. 人究竟能抠到什么程度?
  11. hdu3947 给一些已知(需费用)路径去覆盖一些边 //预先加灌法费用流
  12. java之split用法注意
  13. 一个高性能的key/value存储服务器 - Tarantool/Box
  14. SpringBoot整合jsp技术
  15. 用java开发的软件_java开发需要用到的软件有哪些
  16. 粒子群算法 java_粒子群算法解决TSP问题
  17. 能不用事务就尽量别用
  18. 「机密计算-隐私计算」科普
  19. JNI(4) JNI Functions
  20. 2022海康威视秋招内推(最新)

热门文章

  1. html表格(table)的基本结构
  2. 传奇所有客户端大合集
  3. 《鹰猎长空》看世界范围内电影票价上涨的原因
  4. 中西医结合儿科疾病 100249
  5. linux 脚本加密 shc
  6. 微信开发 ━━ 微信商户更名后付款时仍旧为最初的简称,如何修改微信支付的店铺名称
  7. Ubuntu 20.04桌面文件夹图标消失及文件系统无法打开
  8. flask-SQLAlchemy数据库密码加密
  9. 0x800704cf 共享打印机_0x800704cF,详细教您Win7访问共享时提示错误0x800704cf怎么办
  10. 计算机启动硬盘自检,怎样取消电脑开机磁盘自检