Python实现爬取房源信息的示例详解
1. 准备工作
在开始实现爬取房源信息的示例之前,你需要进行以下准备工作:
- 安装Python环境
如果你尚未安装Python环境,可以前往Python官网下载你所需要的版本。
- 安装第三方包
我们使用requests
、Beautiful Soup
和pandas
这三个第三方包来进行数据抓取和数据处理。你可以使用以下命令分别安装:
pip install requests
pip install beautifulsoup4
pip install pandas
2. 示例1:抓取链家网房源信息
2.1 网站分析
我们以链家网为例进行数据抓取。首先,我们需要了解链家网的网页结构。
我们以北京市丰台区的房源信息页面为例:https://bj.lianjia.com/ershoufang/fengtai/pg1/
该页面列举了丰台区所有在售二手房的信息。我们可以看到,该页面的URL结构如下:
https://bj.lianjia.com/ershoufang/fengtai/pg1/
其中,fengtai
表示查询的区域,pg1
表示当前查询的页数。我们可以通过修改pg
后的数字来访问不同的页面。
同时,我们可以观察到该页面中包含多个房源信息的块,每个块内包含了房源的基本信息和价格信息。
2.2 抓取数据
接下来,我们将编写Python代码来抓取链家网的房源信息。代码如下:
import requests
from bs4 import BeautifulSoup
import pandas as pd
# 设置请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36"
}
# 构造URL
url_template = "https://bj.lianjia.com/ershoufang/{region}/pg{page}/"
region = "fengtai"
# 创建一个空DataFrame,用于存储数据
house_df = pd.DataFrame(columns=["title", "house_type", "area", "orientation", "decoration", "elevator", "unit_price", "total_price"])
# 循环抓取不同页码的数据
for page in range(1, 6):
url = url_template.format(region=region, page=page)
response = requests.get(url, headers=headers)
html = response.text
soup = BeautifulSoup(html, "html.parser")
house_list = soup.find_all("div", class_="info clear")
# 解析房源信息
for house in house_list:
# 解析基本信息
title = house.find("div", class_="title").text.strip()
house_type = house.find("div", class_="houseInfo").text.strip()
area = house.find("div", class_="area").text.strip()
area = float(area.split("㎡")[0])
orientation = house.find("div", class_="houseInfo").find_all("a")[0].text.strip()
decoration = house.find("div", class_="houseInfo").find_all("a")[1].text.strip()
# 解析价格信息
elevator = house.find("div", class_="positionInfo").text.strip().split("-")[0]
unit_price = house.find("div", class_="unitPrice").text.strip()
unit_price = float(unit_price.split("单价")[1].split("元")[0])
total_price = house.find("div", class_="totalPrice").text.strip().split("万")[0]
total_price = float(total_price)
# 将数据存入DataFrame
house_df.loc[len(house_df)] = [title, house_type, area, orientation, decoration, elevator, unit_price, total_price]
# 输出数据到CSV
house_df.to_csv("house.csv", index=False, encoding="utf_8_sig")
上面的代码中,我们使用了requests
和Beautiful Soup
来抓取链家网上丰台区的房源信息。我们首先定义了一个请求头,然后通过循环构造不同页码的URL来抓取多个页面上的房源信息。
在解析房源信息时,我们使用了find
和find_all
方法来定位元素,并进行解析。通过这些方法,我们可以轻松地获取房源信息,并将其存储在一个DataFrame对象中。
最后,我们将DataFrame对象输出到CSV文件中。
2.3 数据处理
我们可以使用pandas
库对数据进行进一步的处理和分析。下面是一个简单的数据处理代码示例:
import pandas as pd
# 读取CSV文件
df = pd.read_csv("house.csv")
# 计算平均单价和总价
avg_unit_price = df["unit_price"].mean()
total_price = df["total_price"].sum()
# 分析房型数据
house_type_counts = df["house_type"].value_counts()
# 输出统计结果
print("平均单价:{:.2f}元/㎡".format(avg_unit_price))
print("总价:{:.2f}万".format(total_price))
print("房型分布:")
print(house_type_counts)
上面的代码读取了保存在CSV文件中的房源信息,并对其进行了进一步的处理和分析。我们可以计算出平均单价和总价,以及分析出不同房型的分布情况。
3. 示例2:抓取安居客网房源信息
3.1 网站分析
安居客网是另一个提供房源信息的网站。我们以安居客网北京市丰台区的房源信息页面为例:https://bj.fang.anjuke.com/loupan/fengtai/
该页面列举了丰台区的新房楼盘信息。我们可以看到,该页面的URL结构如下:
https://bj.fang.anjuke.com/loupan/fengtai/p1/
其中,fengtai
表示查询的区域,p1
表示当前查询的页数。我们可以通过修改p
后的数字来访问不同的页面。
同时,我们可以观察到该页面中包含多个房源信息的块,每个块内包含了楼盘的基本信息和价格信息。
3.2 抓取数据
与示例1类似,我们可以使用Python代码来抓取安居客网的房源信息。代码如下:
import requests
from bs4 import BeautifulSoup
import pandas as pd
# 设置请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36"
}
# 构造URL
url_template = "https://bj.fang.anjuke.com/loupan/{region}/p{page}/"
region = "fengtai"
# 创建一个空DataFrame,用于存储数据
house_df = pd.DataFrame(columns=["title", "house_type", "area", "decoration", "price"])
# 循环抓取不同页码的数据
for page in range(1, 6):
url = url_template.format(region=region, page=page)
response = requests.get(url, headers=headers)
html = response.text
soup = BeautifulSoup(html, "html.parser")
house_list = soup.find_all("div", class_="item-mod")
# 解析房源信息
for house in house_list:
# 解析基本信息
title = house.find("div", class_="items-name").text.strip()
house_type = house.find_all("p")[0].text.strip()
area = house.find_all("p")[1].text.strip()
decoration = house.find_all("p")[2].text.strip()
# 解析价格信息
price_tag = house.find("span", class_="price-det")
price = price_tag.text.strip() if price_tag else "未知"
# 将数据存入DataFrame
house_df.loc[len(house_df)] = [title, house_type, area, decoration, price]
# 输出数据到CSV
house_df.to_csv("house.csv", index=False, encoding="utf_8_sig")
上面的代码中,我们使用了requests
和Beautiful Soup
来抓取安居客网上丰台区的房源信息。通过循环构造不同页码的URL来抓取多个页面上的房源信息。
在解析房源信息时,我们使用了find
和find_all
方法来定位元素,并进行解析。通过这些方法,我们可以轻松地获取房源信息,并将其存储在一个DataFrame对象中。
最后,我们将DataFrame对象输出到CSV文件中。
3.3 数据处理
类似地,我们可以使用pandas
库对数据进行进一步的处理和分析。下面是一个简单的数据处理代码示例:
import pandas as pd
# 读取CSV文件
df = pd.read_csv("house.csv")
# 计算平均价格
avg_price = df["price"].map(lambda x: float(x.split("元/㎡")[0])).mean()
# 分析楼盘类型数据
house_type_counts = df["house_type"].value_counts()
# 输出统计结果
print("平均价格:{:.2f}元/㎡".format(avg_price))
print("楼盘类型分布:")
print(house_type_counts)
上面的代码读取了保存在CSV文件中的房源信息,并对其进行了进一步的处理和分析。我们可以计算出平均价格,以及分析出不同楼盘类型的分布情况。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现爬取房源信息的示例详解 - Python技术站