Python爬虫实战,链家二手房数据轻松抓取!

数据我来大话侃 2024-07-13 06:32:18

随着大数据时代的到来,数据分析已经成为各行各业的重要竞争力。而数据采集作为数据分析的前置步骤,其重要性不言而喻。今天,我们就来聊聊如何使用Python爬虫技术,轻松抓取链家二手房数据。

本文将带你了解爬虫的技术原理,并分四大步骤教你如何实现链虫爬取链家二手房数据,一般来说,要成功爬取一组数据并保存到本地,主要分为以下四步,分别为:发起请求、获取请求内容、解析数据、保存数据。

发起请求

首先定义一个HTTP请求头,其中包含了一个常见的用户代理(User-Agent)字符串,以模拟浏览器访问。然后使用requests.get函数发起了一个GET请求到指定的URL,并将响应存储在response变量中。

# 发起GET请求,并加上请求头headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}response = requests.get(url, headers=headers)

获取请求内容

使用BeautifulSoup库来解析通过GET请求获取到的HTML内容。response.content包含了服务器返回的原始HTML内容,而'html.parser'是BeautifulSoup用来解析HTML的解析器。

# 解析HTML内容soup = BeautifulSoup(response.content, 'html.parser')解析数据

找到所有包含房屋信息的<div>标签,然后遍历这些标签,从中提取出每套房子的详细信息,如标题、小区名称、地区板块、户型、面积、朝向等,并将这些信息存储在一个列表中。

# 查找所有class为'info clear'的<div>标签info_divs = soup.find_all('div',_='info clear')# 存储每套房子的信息的列表houses = []# 遍历每一个<div>标签for div in info_divs: # 省略了具体的解析代码,这部分代码从每个<div>标签中提取了房屋的相关信息,如标题、小区名称、地区板块等,并将它们存储到houses列表中。

保存数据

在process_page函数中返回的houses列表被用来创建一个pandas DataFrame,该DataFrame用于存储所有页面的房屋数据。最后,检查指定的保存目录是否存在,如果不存在则创建它,然后将DataFrame保存为Excel文件。

# 返回houses列表return houses# 创建一个空的DataFrame来存储所有数据all_houses = pd.DataFrame(columns=["标题", "小区名", "地区板块", "户型", "面积", "朝向", "装修", "楼层", "关注信息", "房屋总价", "房屋单价"])# 省略了遍历每一页并调用process_page函数的代码# 检查目录是否存在,如果不存在则创建directory = "C:/Users/shangtianqiang/Desktop/data"if not os.path.exists(directory): os.makedirs(directory)# 将DataFrame保存到Excel文件file_path = os.path.join(directory, "二手房数据.xlsx")all_houses.to_excel(file_path, index=False)

完整版代码如下所示,在实际中可以修改并加以应用。

# 导入必要的库import requestsfrom bs4 import BeautifulSoupimport pandas as pdimport os# 处理每一页数据的函数def process_page(url): # 发起GET请求,并加上请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } response = requests.get(url, headers=headers) # 解析HTML内容 soup = BeautifulSoup(response.content, 'html.parser') # 查找所有class为'info clear'的<div>标签 info_divs = soup.find_all('div',_='info clear') # 存储每套房子的信息的列表 houses = [] # 遍历每一个<div>标签 for div in info_divs: # 获取标题 title = div.find('div',_='title').find('a').get_text() # 获取小区名称和地区板块 position_info = div.find('div',_='positionInfo').get_text() position_info_parts = position_info.split('-') community_name = position_info_parts[0].strip() if len(position_info_parts) > 0 else '' district = position_info_parts[1].strip() if len(position_info_parts) > 1 else '' # 获取户型、面积、朝向等信息 house_info = div.find('div',_='houseInfo').get_text() house_info_parts = house_info.split('|') house_type = house_info_parts[0].strip() if len(house_info_parts) > 0 else '' area = house_info_parts[1].strip() if len(house_info_parts) > 1 else '' orientation = house_info_parts[2].strip() if len(house_info_parts) > 2 else '' decoration = house_info_parts[3].strip() if len(house_info_parts) > 3 else '' floor = house_info_parts[4].strip() if len(house_info_parts) > 4 else '' # 获取关注信息 follow_info = div.find('div',_='followInfo').get_text() # 获取房屋总价和单价 total_price = div.find('div',_='totalPrice totalPrice2').get_text() unit_price = div.find('div',_='unitPrice').get_text() # 将信息添加到houses列表 houses.append([title, community_name, district, house_type, area, orientation, decoration, floor, follow_info, total_price, unit_price]) # 返回houses列表 return houses# 处理所有100页数据的函数def process_all_pages(base_url, total_pages): # 创建一个空的DataFrame来存储所有数据 all_houses = pd.DataFrame(columns=["标题", "小区名", "地区板块", "户型", "面积", "朝向", "装修", "楼层", "关注信息", "房屋总价", "房屋单价"]) # 遍历每一页 for page in range(1, total_pages + 1): url = f"{base_url}ershoufang/pg{page}/" houses = process_page(url) page_df = pd.DataFrame(houses, columns=["标题", "小区名", "地区板块", "户型", "面积", "朝向", "装修", "楼层", "关注信息", "房屋总价", "房屋单价"]) all_houses = pd.concat([all_houses, page_df], ignore_index=True) # 检查目录是否存在,如果不存在则创建 directory = "C:/Users/shangtianqiang/Desktop/data" if not os.path.exists(directory): os.makedirs(directory) # 将DataFrame保存到Excel文件 file_path = os.path.join(directory, "二手房数据.xlsx") all_houses.to_excel(file_path, index=False)# 实际的网站基础URLbase_url = "https://lz.lianjia.com/"total_pages = 100# 运行函数process_all_pages(base_url, total_pages)

爬取后保存到本地的数据如下所示,可以基于此数据做进一步的研究。

通过以上四个步骤,我们已经成功实现了链家二手房数据的爬取。当然,实际操作过程中,可能会遇到一些意想不到的问题,这就需要我们不断积累经验,提高自己的技能。掌握Python爬虫技术,让你在数据分析的道路上如虎添翼,轻松应对各种数据挑战!

0 阅读:1