Python爬虫入门案例之爬取二手房源数据

Python爬虫入门案例之爬取二手房源数据

1. 爬虫介绍

在互联网时代,信息非常发达,我们可以从网上获取大量的有价值的信息,比如商品价格、股票走势、人口普查数据等等。这些数据对于学术研究、商业决策等方面都有很多的用处,而爬虫技术可以让我们从网络中提取需要的数据。

简单来说,爬虫技术就是通过程序自动访问网页、获取信息的技术。Python是非常适合爬虫编写的语言,因为Python有很多的爬虫库,而且使用Python编写的爬虫程序很容易理解,代码也很简洁。

2. 爬取二手房源数据步骤

想要爬取二手房源数据,需要先了解一下整个流程,以下是爬取二手房源数据的步骤:

2.1 确定爬取目标

首先需要确定要爬取哪个网站的数据,比如链家二手房网站。在确定网站之后,需要了解一下该网站的网页结构,确定数据的所在位置。

2.2 发送请求并获取HTML

需要使用Python代码向网站发送请求,并获取到该网站的HTML页面。发送请求可以使用requests库,获取HTML可以使用BeautifulSoup库进行网页解析。

import requests
from bs4 import BeautifulSoup

url = 'https://bj.lianjia.com/ershoufang/'       # 网站地址

res = requests.get(url)   # 发送请求
html = res.text   # 获取HTML
soup = BeautifulSoup(html, 'html.parser')   # 网页解析

2.3 解析HTML找到目标数据

在获取到HTML之后,需要使用BeautifulSoup库对HTML进行解析,找到需要的数据所在的位置,通过查看HTML文本中数据的标签和属性,递归查找并选定所需的信息节点。

house_info_list = []   # 存储房源信息的列表

house_list = soup.find_all('li', {'class': 'clear'})   # 定位到所有房源信息所在的标签
for house in house_list:
    title_node = house.find('div', {'class': 'title'})   # 房源标题:名称、户型和面积
    position_node = house.find('div', {'class': 'positionInfo'})   # 位置信息:小区和区域
    price_node = house.find('div', {'class': 'totalPrice'})   # 房屋总价
    unit_node = house.find('div', {'class': 'unitPrice'})   # 单价

    house_info_list.append({
        'title': title_node.text.strip(),
        'community': position_node.a.text.strip(),
        'district': position_node.contents[3].text.strip(),
        'price': float(price_node.span.text.strip()),
        'unit': int(unit_node.contents[0].strip())
    })

2.4 存储数据

爬取到的数据需要进行存储,常用的方式有将数据存储到文件中、存储到数据库中等。这里以将数据存储到CSV文件中为例。

import csv

with open('house_info.csv', 'w', encoding='utf-8-sig', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['标题', '小区', '区域', '总价', '单价'])

    for house in house_info_list:
        row = [house['title'], house['community'], house['district'], house['price'], house['unit']]
        writer.writerow(row)

3. 代码示例1:爬取链家二手房北京市区房源信息

import requests
from bs4 import BeautifulSoup
import csv

url = 'https://bj.lianjia.com/ershoufang/'
res = requests.get(url)
html = res.text
soup = BeautifulSoup(html, 'html.parser')

house_info_list = []

house_list = soup.find_all('li', {'class': 'clear'})
for house in house_list:
    title_node = house.find('div', {'class': 'title'})
    position_node = house.find('div', {'class': 'positionInfo'})
    price_node = house.find('div', {'class': 'totalPrice'})
    unit_node = house.find('div', {'class': 'unitPrice'})

    house_info_list.append({
        'title': title_node.text.strip(),
        'community': position_node.a.text.strip(),
        'district': position_node.contents[3].text.strip(),
        'price': float(price_node.span.text.strip()),
        'unit': int(unit_node.contents[0].strip())
    })

with open('house_info.csv', 'w', encoding='utf-8-sig', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['标题', '小区', '区域', '总价', '单价'])

    for house in house_info_list:
        row = [house['title'], house['community'], house['district'], house['price'], house['unit']]
        writer.writerow(row)

4. 代码示例2:爬取链家二手房城市的所有区县房源信息

import requests
from bs4 import BeautifulSoup
import csv

url = 'https://bj.lianjia.com/ershoufang/'
res = requests.get(url)
html = res.text
soup = BeautifulSoup(html, 'html.parser')

district_info_list = []

district_list = soup.select('div[data-role="ershoufang"] > div:first-of-type > a')
for district in district_list:
    district_name = district.text
    district_url = url + district['href']
    district_res = requests.get(district_url)
    district_html = district_res.text
    district_soup = BeautifulSoup(district_html, 'html.parser')

    house_info_list = []
    house_list = district_soup.find_all('li', {'class': 'clear'})
    for house in house_list:
        title_node = house.find('div', {'class': 'title'})
        position_node = house.find('div', {'class': 'positionInfo'})
        price_node = house.find('div', {'class': 'totalPrice'})
        unit_node = house.find('div', {'class': 'unitPrice'})

        house_info_list.append({
            'title': title_node.text.strip(),
            'community': position_node.a.text.strip(),
            'price': float(price_node.span.text.strip()),
            'unit': int(unit_node.contents[0].strip())
        })

    district_info_list.append({
        'district': district_name,
        'house_info': house_info_list
    })

with open('district_info.csv', 'w', encoding='utf-8-sig', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['区县', '标题', '小区', '总价', '单价'])

    for district_info in district_info_list:
        district = district_info['district']
        house_info_list = district_info['house_info']
        for house in house_info_list:
            row = [district, house['title'], house['community'], house['price'], house['unit']]
            writer.writerow(row)

以上两个示例代码分别实现了爬取链家二手房北京市区房源信息和爬取链家二手房城市的所有区县房源信息。通过以上两个示例可以看出,爬虫程序通过定位HTML标签、解析HTML文本,不仅可以获取单个网页的数据,而且可以自动化地获取多个网页的数据,大大提高了数据爬取的效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫入门案例之爬取二手房源数据 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python tkinter中label控件动态改变值问题

    讲解一下“Python tkinter中label控件动态改变值问题”的完整攻略。 1.问题描述 当我们使用Python tkinter库创建GUI窗口应用程序时,有时需要在应用程序中使用label控件来显示一些文本信息。需要动态更新label控件中的值时,有时可能会遇到困难。 2.解决方法 为了动态改变label控件的值,我们可以使用tkinter.Str…

    python 2023年6月3日
    00
  • python儿童入门教程分享 python儿童学习简单教学

    Python儿童入门教程攻略 简介 Python是一门简单易学的编程语言,特别适合儿童入门学习。本教程旨在通过分享Python的基础知识,帮助儿童了解和掌握编程,并提供一些简单有趣的项目作为实践。 学习前准备 在开始学习Python之前,需要安装Python解释器。选择Python 3.x版本进行安装。 安装完成后,可以使用Python IDLE进行Pyth…

    python 2023年5月30日
    00
  • python实现人脸签到系统

    下面就是“python实现人脸签到系统”的完整攻略。 1. 准备工作 在开始实现人脸签到系统前,需要先准备以下工作: 安装基于Python的人脸识别库dlib和face_recognition,这两个库是人脸签到系统的核心库。 下载一个人脸图片集,用于作为签到系统的人脸库。可以从这个链接下载dlib人脸识别器及样例图片Test Images。 建立一个sql…

    python 2023年5月19日
    00
  • 创建一个连续的扁平化的NumPy数组

    创建连续的扁平化的NumPy数组可以通过NumPy库中的reshape函数和arange函数来实现,步骤如下: 1.导入NumPy库。 import numpy as np 2.使用arange函数创建一个具有连续数字的一维数组。 nums = np.arange(12) 3.使用reshape函数将一维数组转换成二维数组(N行M列)。 arr = nums…

    python-answer 2023年3月25日
    00
  • Python中scrapy下载保存图片的示例

    下面是Python中scrapy下载保存图片的示例的完整攻略。 创建项目 首先需要在终端中使用以下命令创建一个新的scrapy项目: scrapy startproject scrapy_image_downloader 这将在当前目录下创建一个名为scrapy_image_downloader的文件夹,其中包含项目的初始目录结构。 编写爬虫 在项目目录中,…

    python 2023年5月19日
    00
  • python三种数据结构及13种创建方法总结

    “Python三种数据结构及13种创建方法总结”,主要介绍Python中的三种基本数据结构以及在Python中创建这三种数据结构的13种方法。 一、Python中三种基本数据结构 在Python中,有三种基本数据结构: 列表(List) 字典(Dict) 元组(Tuple) 下面分述这三种数据结构以及如何在Python中创建它们。 二、Python中创建列表…

    python 2023年5月14日
    00
  • 浅谈python 调用open()打开文件时路径出错的原因

    请看以下完整攻略: 浅谈python调用open()打开文件时路径出错的原因 引言 在使用Python语言操作文件时,常用的函数之一就是open()函数。但是,有时候我们调用open()函数打开文件时会出现路径出错的问题。这也是初学者经常遇到的一个问题。本篇攻略旨在帮助初学者快速定位和解决该问题。 原因分析 出现路径出错的原因有多种,总结如下: 绝对路径和相…

    python 2023年5月13日
    00
  • 在树莓派2或树莓派B+上安装Python和OpenCV的教程

    以下是在树莓派2或树莓派B+上安装Python和OpenCV的完整攻略: 安装Python 首先,连接树莓派到电源并进入终端。 执行以下命令更新树莓派上的软件: sudo apt update sudo apt upgrade 运行以下命令安装Python 3: sudo apt install python3 确定Python是否成功安装,可使用以下命令检…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部