【python】爬取链家二手房数据做数据分析【附源码】

一、前言、

        在数据分析和挖掘领域中,网络爬虫是一种常见的工具,用于从网页上收集数据。本文将介绍如何使用 Python 编写简单的网络爬虫程序,从链家网上海二手房页面获取房屋信息,并将数据保存到 Excel 文件中。

二、效果图:

  • 导入需要的库:

    • requests:用于发送 HTTP 请求和获取网页内容。
    • BeautifulSoup:用于解析 HTML 内容,提取所需信息。
    • pandas:用于数据处理和保存数据到 Excel 文件。
import requestsfrom bs4 import BeautifulSoupimport pandas as pd

     如果出现模块报错

c124a1693bfc457ba1f2909ee9d299fc.png

        进入控制台输入:建议使用国内镜像源

pip install 模块名称 -i https://mirrors.aliyun.com/pypi/simple

         我大致罗列了以下几种国内镜像源:

清华大学
https://pypi.tuna.tsinghua.edu.cn/simple阿里云
https://mirrors.aliyun.com/pypi/simple/豆瓣
https://pypi.douban.com/simple/ 百度云
https://mirror.baidu.com/pypi/simple/中科大
https://pypi.mirrors.ustc.edu.cn/simple/华为云
https://mirrors.huaweicloud.com/repository/pypi/simple/腾讯云
https://mirrors.cloud.tencent.com/pypi/simple/

三、代码分析

        首先,我们定义了一个函数 fetch_data(page_number),用于获取指定页面的房屋信息数据。这个函数会构建对应页数的 URL,并发送 GET 请求获取页面内容。然后,使用 BeautifulSoup 解析页面内容,并提取每个房屋信息的相关数据,如区域、房型、关注人数、单价和总价。最终将提取的数据以字典形式存储在列表中,并返回该列表。

        接下来,我们定义了主函数 main(),该函数控制整个爬取和保存数据的流程。在主函数中,我们循环爬取前 10 页的数据,调用 fetch_data(page_number) 函数获取每一页的数据,并将数据追加到列表中。然后,将所有爬取的数据存储在 DataFrame 中,并使用 df.to_excel('lianjia_data.xlsx', index=False) 将数据保存到 Excel 文件中。

最后,在程序的入口处,通过 if __name__ == "__main__": 来执行主函数 main()

四、详解代码

  • 定义 fetch_data(page_number) 函数:

    • 这个函数接收一个参数 page_number,表示要爬取的页面页数。
    • 构建相应页数的 URL,并发送 GET 请求获取页面内容。
    • 使用 BeautifulSoup 解析页面内容,并提取每个房屋信息的相关数据,如区域、房型、关注人数、单价和总价。
    • 将提取的数据以字典形式存储在 rows 列表中,并返回该列表。
# 收集单页数据 xpanx.comdef fetch_data(page_number):url = f"https://sh.lianjia.com/ershoufang/pg{page_number}/"response = requests.get(url)if response.status_code != 200:print("请求失败")return []soup = BeautifulSoup(response.text, 'html.parser')rows = []for house_info in soup.find_all("li", {"class": "clear LOGVIEWDATA LOGCLICKDATA"}):row = {}# 使用您提供的类名来获取数据 xpanx.comrow['区域'] = house_info.find("div", {"class": "positionInfo"}).get_text() if house_info.find("div", {"class": "positionInfo"}) else Nonerow['房型'] = house_info.find("div", {"class": "houseInfo"}).get_text() if house_info.find("div", {"class": "houseInfo"}) else Nonerow['关注'] = house_info.find("div", {"class": "followInfo"}).get_text() if house_info.find("div", {"class": "followInfo"}) else Nonerow['单价'] = house_info.find("div", {"class": "unitPrice"}).get_text() if house_info.find("div", {"class": "unitPrice"}) else Nonerow['总价'] = house_info.find("div", {"class": "priceInfo"}).get_text() if house_info.find("div", {"class": "priceInfo"}) else Nonerows.append(row)return rows# 主函数def main():all_data = []for i in range(1, 11):  # 爬取前10页数据作为示例print(f"正在爬取第{i}页...")all_data += fetch_data(i)# 保存数据到Excel xpanx.comdf = pd.DataFrame(all_data)df.to_excel('lianjia_data.xlsx', index=False)print("数据已保存到 'lianjia_data.xlsx'")
  • 定义 main() 函数:

    • 在主函数中循环爬取前 10 页的数据,调用 fetch_data(page_number) 函数获取每一页的数据,并将数据追加到 all_data 列表中。
    • 将所有爬取的数据存储在 DataFrame 中。
    • 最后使用 df.to_excel('lianjia_data.xlsx', index=False) 将数据保存到名为 lianjia_data.xlsx 的 Excel 文件中。

       

五、完整代码

 这段代码的主要流程是通过循环遍历页面页数,调用 fetch_data(page_number) 函数爬取每一页的数据,并将数据保存到 Excel 文件中。整体上,这个程序完成了以下几个主要功能:

  1. 发送 HTTP 请求并获取网页内容。
  2. 使用 BeautifulSoup 解析 HTML 内容,提取所需信息。
  3. 将提取的数据存储在列表中。
  4. 将列表数据转换为 DataFrame。
  5. 将 DataFrame 数据保存到 Excel 文件中。
import requestsfrom bs4 import BeautifulSoupimport pandas as pd# 收集单页数据 xpanx.comdef fetch_data(page_number):url = f"https://sh.lianjia.com/ershoufang/pg{page_number}/"response = requests.get(url)if response.status_code != 200:print("请求失败")return []soup = BeautifulSoup(response.text, 'html.parser')rows = []for house_info in soup.find_all("li", {"class": "clear LOGVIEWDATA LOGCLICKDATA"}):row = {}# 使用您提供的类名来获取数据 xpanx.comrow['区域'] = house_info.find("div", {"class": "positionInfo"}).get_text() if house_info.find("div", {"class": "positionInfo"}) else Nonerow['房型'] = house_info.find("div", {"class": "houseInfo"}).get_text() if house_info.find("div", {"class": "houseInfo"}) else Nonerow['关注'] = house_info.find("div", {"class": "followInfo"}).get_text() if house_info.find("div", {"class": "followInfo"}) else Nonerow['单价'] = house_info.find("div", {"class": "unitPrice"}).get_text() if house_info.find("div", {"class": "unitPrice"}) else Nonerow['总价'] = house_info.find("div", {"class": "priceInfo"}).get_text() if house_info.find("div", {"class": "priceInfo"}) else Nonerows.append(row)return rows# 主函数def main():all_data = []for i in range(1, 11):  # 爬取前10页数据作为示例print(f"正在爬取第{i}页...")all_data += fetch_data(i)# 保存数据到Excel xpanx.comdf = pd.DataFrame(all_data)df.to_excel('lianjia_data.xlsx', index=False)print("数据已保存到 'lianjia_data.xlsx'")if __name__ == "__main__":main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/506180.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java项目layui分页中文乱码

【问题描述】这部分没改之前中文乱码。 【解决办法】在layui.js或者layui.all.js文件中替换共、页、条转换成Unicode码格式。 字符Unicode共&#x5171页&#x9875条&#x6761【完美解决】改完之后重新运行项目,浏览器F12缓存清除就好了,右键

06 OpenCV增加图像的对比度

文章目录 理论API代码 理论 图像变换可以看作如下&#xff1a; 像素变换 – 点操作邻域操作 – 区域 调整图像亮度和对比度属于像素变换-点操作 API saturate_cast(value)确保值大小范围为0~255之间Mat.at(y,x)[index]value 给每个像素点每个通道赋值 代码 #include <…

C++真题列表

题目解析&#xff1a;RAM是闪存&#xff0c;只要一关机一拔电&#xff0c;就会丢失数据 题目解答&#xff1a;A 题目解析&#xff1a;TXT格式是文本文档 题目解答&#xff1a;B 题目解析&#xff1a;IP地址中每一个字节的取值范围是[0~255]&#xff0c;是不可能有256的 题目…

《秦时明月》IP新高度:与陕西历史博物馆共同书写文化传承新篇章!

在IP产业风起云涌的今天&#xff0c;如何以创意和匠心为传统文化注入新的活力&#xff0c;成为了摆在每一位文化工作者面前的重要课题。近日&#xff0c;《秦时明月》作为一部深受观众喜爱的国产动画IP&#xff0c;在迎来其十七周年之际&#xff0c;联手陕西历史博物馆&#xf…

Vue+SpringBoot打造知识图谱构建系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 知识图谱模块2.2 知识点模块2.3 学生测评模块2.4 学生成绩模块 三、系统展示四、核心代码4.1 查询知识点4.2 新增知识点4.3 查询知识图谱4.4 查询学生成绩4.5 查询学生成绩 五、免责说明 一、摘要 1.1 项目介绍 基于J…

家政按摩上门服务小程序搭建

家政按摩上门服务小程序支持技师入驻申请&#xff0c;用户可以通过在线下单预约家政服务&#xff0c;并根据距离、价格、销量好评度等条件进行筛选和选择。用户可以选择技师进行预约&#xff0c;并填写自己的服务地点和时间&#xff0c;享受上门服务。同时&#xff0c;技师也可…

20240302-2-dubbo面试题(一)

1、为什么要用 Dubbo&#xff1f; 随着服务化的进一步发展&#xff0c;服务越来越多&#xff0c;服务之间的调用和依赖关系也越来越复杂&#xff0c;诞生了面向服务的架构体系(SOA)&#xff0c;也因此衍生出了一系列相应的技术&#xff0c;如对服务提供、服务调用、连接处理、…

Java ZooKeeper-RocketMQ 面试题

Java ZooKeeper-RocketMQ 面试题 前言1、谈谈你对ZooKeeper的理解 &#xff1f;2、Zookeeper的工作原理&#xff08;Zab协议&#xff09;3、谈谈你对分布式锁的理解&#xff0c;以及分布式锁的实现&#xff1f;4、 zookeeper 是如何保证事务的顺序一致性的&#xff1f;5、 zook…

[vscode] 1. 在编辑器的标签页下显示文件目录(标签页显示面包屑) 2. 在标题栏上显示当前文件的完整路径

1. 标签页显示面包屑 view->Appearance->Breadcrumbs 2. 在标题栏上显示当前文件的完整路径 搜索 window.title将原来的值activeEditorShort 修改为 activeEditorMedium 参考&#xff1a; vscode在编辑器的标签页下显示文件目录&#xff08;标签页显示面包屑&#xf…

【Java数据结构】——二叉搜索树

目录 &#x1f388;概念 &#x1f388;操作-查找 &#x1f388;操作-插入 &#x1f388;操作-删除&#xff08;难点&#xff09; &#x1f388;概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树 : 若它的左子树不为空&a…

编码器原理图

操作 旋转编码器提供两种交互方式&#xff1a; 每次用户旋转旋钮时&#xff0c;都会在 DT 和 CLK 引脚上产生低电平信号&#xff1a; 顺时针旋转会先使CLK引脚变为低电平&#xff0c;然后DT引脚也变为低电平。 逆时针旋转会使 DT 引脚首先变为低电平&#xff0c;然后 CLK 引脚…

力扣● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

● 1049. 最后一块石头的重量 II 题目要把石头分成两堆&#xff0c;这两堆的重量差值最小。相撞之后剩下的石头重量就最小。其实就是要尽量把石头分为差不多重量的两堆&#xff0c;和昨天的● 416. 分割等和子集相似&#xff0c;这样就转换成了01背包问题。 和416题一样&…