pytho爬取南京房源成交价信息并导入到excel

news2025/2/24 6:18:01

在这里插入图片描述
在这里插入图片描述

# encoding: utf-8
# File_name: 
import requests
from bs4 import BeautifulSoup
import xlrd #导入xlrd库
import pandas as pd
import openpyxl

# 定义函数来获取南京最新的二手房房子成交价
def get_nanjing_latest_second_hand_prices():
    cookies = {
        'select_city': '320100',
        'lianjia_ssid': '',
        '02eaefcc-d3ac-468d-a2d5-b1b816bc830f': '',
        'Qs_lvt_200116': '',
        'sajssdk_2015_cross_new_user': '',
        'sensorsdata2015jssdkcross': '',
        'Qs_pv_200116': '',
        # ... 其他cookie
    }

    # 设置请求头,模拟浏览器访问
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        'Cookie': '; '.join(f'{name}={value}' for name, value in cookies.items()),
    }
    price_0_list = list()
    price_100_list = list()
    price_200_list = list()
    price_300_list = list()
    price_400_list = list()

    # 假设这是提供南京最新二手房成交价的网页URL
    for i in range(1,4):
        print(f'运行次数:{i}')
        url = f'https://nj.ke.com/chengjiao/pukouqita11/pg{i}ie2y4ba80ea130l2l3p3p4p5p6/'
        print('url:'+url)
        # 发送HTTP请求
        response = requests.get(url, headers=headers)

        # 检查请求是否成功
        if response.status_code == 200:
            # 使用BeautifulSoup解析HTML内容
            soup = BeautifulSoup(response.text, 'html.parser')

            # 根据实际的网页结构,找到包含二手房成交价的容器
            # 假设成交价的容器是一个带有特定class的元素
            price_container = soup.find('ul', class_='listContent')
            li_tags = price_container.find_all('li')
            print(''+str(i)+'该页多少房源:'+str(len(li_tags)))
            # 遍历li标签并输出内容
            for li in li_tags:
                # 二手房交易初始化
                house_dict = dict()
                houseInfo = li.findAll('div', class_='info')
                for infoDetail in houseInfo:
                    # 小区名称+户型+面积
                    title = infoDetail.find('div', class_='title')
                    a_tag = title.find('a', class_='CLICKDATA maidian-detail')
                    # 提取并输出<a>标签内的文本
                    if a_tag:
                        text_value = a_tag.string
                        tlist=text_value.split(" ")
                        house_dict['小区名称名称'] = tlist[0]
                        house_dict['户型'] = tlist[1]
                        house_dict['面积'] = tlist[2]
                        print('小区名称:'+tlist[0])
                        print('户型:'+tlist[1])
                        print('面积:'+tlist[2])
                    # address
                    # address = infoDetail.findAll('div', class_='address')
                    # for addressDetail in address:
                    #     pass
                    # 朝向,装修风格
                    fangxiang = infoDetail.find('div', class_='houseInfo')
                    house_dict['朝向,装修风格'] = fangxiang.text.strip()
                    print(fangxiang.text.strip())
                    deal_date = infoDetail.find('div', class_='dealDate')
                    house_dict['成交时间'] = deal_date.text.strip()
                    print(deal_date.text.strip())
                    total_price = infoDetail.find('div', class_='totalPrice')
                    if '暂无价格' not in total_price.text:
                        total_number = infoDetail.find('span', class_='number').text
                        print(f'{total_number}万')
                        house_dict['成交价格'] = total_number
                    else:
                        total_number = '0'
                        house_dict['成交价格'] = total_number
                        print(total_number)

                    # 楼层
                    louceng = infoDetail.find('div', class_='positionInfo').text.strip()
                    house_dict['楼层'] = louceng
                    print(louceng)
                    # 单价
                    unit_price = infoDetail.find('div', class_='unitPrice').text.strip()
                    if '暂无单价' not in unit_price:
                        unit_price = infoDetail.findAll('span', class_='number')[1].text.strip()
                    else:
                        unit_price = '0'
                    house_dict['单价'] = unit_price
                    print(unit_price)
                    # 房屋满几年
                    deal_house_year = infoDetail.find('span', class_='dealHouseTxt')
                    if deal_house_year is None:
                        deal_house_year = ''
                    else:
                        deal_house_year = deal_house_year.text.strip()
                    house_dict['房屋满几年'] = deal_house_year
                    print(deal_house_year)
                    # 挂牌时长
                    deal_cycle_txts = infoDetail.find('span', class_='dealCycleTxt')
                    cycle_txts_find_all = deal_cycle_txts.findAll('span')
                    if(len(cycle_txts_find_all)==2):
                        house_dict['挂牌价'] = cycle_txts_find_all[0].text.strip()
                        print(cycle_txts_find_all[0].text.strip())
                        house_dict['成交周期'] = cycle_txts_find_all[1].text.strip()
                        print(cycle_txts_find_all[1].text.strip())

                    else:
                        house_dict['挂牌价'] = ''
                        for cycle_txts_find_all_span in cycle_txts_find_all:
                            house_dict['成交周期'] = cycle_txts_find_all_span.text.strip()
                            print(cycle_txts_find_all_span.text.strip())

                    try:
                        unit_price_int = float(house_dict['成交价格'])
                        if (unit_price_int == 0):
                            price_0_list.append(house_dict)
                        if (0<unit_price_int <=100 ):
                            price_100_list.append(house_dict)
                        if (100<unit_price_int <=200 ):
                            price_200_list.append(house_dict)
                        if (200<unit_price_int <=300 ):
                            price_300_list.append(house_dict)
                        if (300<unit_price_int <=400 ):
                            price_400_list.append(house_dict)
                    except ValueError:
                        print("转换错误:字符串无法转换为整数")


    file = 'D:/house/pukou_pukouqita11.xlsx'  # 文件路径
    # 将列表字典转换为DataFrame
    df = pd.DataFrame(price_0_list)
    # 将数据写入不同的工作表中
    # 将每个DataFrame写入到对应名字的工作表
    with pd.ExcelWriter(file, mode='a', engine='openpyxl') as writer:
        # 将DataFrame写入新的工作表
        df.to_excel(writer, sheet_name='无报价')

    # 将列表字典转换为DataFrame
    df = pd.DataFrame(price_100_list)
    # 将数据写入不同的工作表中
    # 将每个DataFrame写入到对应名字的工作表
    with pd.ExcelWriter(file, mode='a', engine='openpyxl') as writer:
        # 将DataFrame写入新的工作表
        df.to_excel(writer, sheet_name='100w以内')

    # 将列表字典转换为DataFrame
    df = pd.DataFrame(price_200_list)
    # 将数据写入不同的工作表中
    # 将每个DataFrame写入到对应名字的工作表
    with pd.ExcelWriter(file, mode='a', engine='openpyxl') as writer:
        # 将DataFrame写入新的工作表
        df.to_excel(writer, sheet_name='200w以内')

    # 将列表字典转换为DataFrame
    df = pd.DataFrame(price_300_list)
    # 将数据写入不同的工作表中
    # 将每个DataFrame写入到对应名字的工作表
    with pd.ExcelWriter(file, mode='a', engine='openpyxl') as writer:
        # 将DataFrame写入新的工作表
        df.to_excel(writer, sheet_name='300w以内')

    # 将列表字典转换为DataFrame
    df = pd.DataFrame(price_400_list)
    # 将数据写入不同的工作表中
    # 将每个DataFrame写入到对应名字的工作表
    # 使用ExcelWriter追加模式打开文件
    with pd.ExcelWriter(file, mode='a', engine='openpyxl') as writer:
        # 将DataFrame写入新的工作表
        df.to_excel(writer, sheet_name='400w以内')

# 调用函数并打印结果
latest_price = get_nanjing_latest_second_hand_prices()

初版:仍有很多需要优化的点,但是可以使用了,要注意,贝壳成交价的房源只展示100页,每页只有20个数据,所以大家在爬数据的数据要进行分区筛选,它里面的url 有很多规律(简直是无脑),如果没有发现可以通过私信或者直接评论。
效果图如下
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL 数据宝典】【索引原理】- 001 索引原理分析 (AVL树、B-Tree、B+Tree)

一、索引定义 MySQL官方对索引定义&#xff1a;是存储引擎用于快速查找记录的一种数据结构。需要额外开辟空间和数据维护工作。 索引是物理数据页存储&#xff0c;在数据文件中&#xff08;InnoDB&#xff0c;ibd文件&#xff09;&#xff0c;利用数据页(page)存储。 索引可以…

Java数据结构堆

堆的概念 所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中。 小根堆&#xff1a;根节点的大小小于孩子节点。整棵树都是小根堆必须满足每颗子树都是小根堆。 堆的存储方式 从堆的概念可知&#xff0c;堆是一棵完全二叉树&#xff0c;因此可以层序的规则采用顺序的…

Java虚拟机(JVM)之字节码文件

让我们先来简单了解一下JVM。 JVM功能&#xff1a; 1、解释和运行&#xff1a;对字节码文件中的指令&#xff0c;实时的解释成机器码让计算机执行。 2、内存管理&#xff1a;自动为对象、方法等分配内存&#xff1b;自动的垃圾回收机制&#xff0c;回收不再使用的对象。 3、即…

树莓派4B安装安卓系统LineageOS 21(Android14)

1&#xff1a;系统下载 2&#xff1a;下载好镜像后&#xff0c;准备写入SD卡&#xff0c;我这边使用的是 balenaetcher 3&#xff1a;插入树莓派&#xff0c;按照指示一步一步进行配置&#xff0c;可以配置时区&#xff0c;语言。 注意点 1》:想返回的时候按F2 2》:进入系统…

解密C语言内存分配奥秘,遨游动态内存管理海洋

一.C语言内存分区 C语言内存区从低地址到高地址分为代码区、常量区、全局&#xff08;静态&#xff09;区、堆区、栈区。 1.栈区 栈区介绍 栈区由编译器自动分配释放&#xff0c;由操作系统自动管理&#xff0c;无须手动管理。栈区上的内容只在函数范围内存在&#xff0c;当…

【软件开发规范篇】JAVA后端开发编码命名规范

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

阿里云服务器(Ubuntu22)上的MySQL8更改为大小写不敏感

因为windows上默认的mysql8.0是大小写不敏感的&#xff0c;部署到服务器上之后发现ubuntu默认的是大小写敏感&#xff0c;所以为了不更改代码&#xff0c;需要将mysql数据库设置为大小写不敏感的。 &#xff01;&#xff01;&#xff01;重要一定要做好数据库的备份&#xff0…

docker如何关闭证书认证

目录 前言关闭Docker认证的步骤修改pom 前言 当docker认证证书过期了&#xff0c;项目又要马上上线怎么办&#xff1f;重新生成证书&#xff0c;时间来不及&#xff0c;这时最快的方法就是关闭证书认证。 关闭Docker认证的步骤 停止Docker服务 systemctl stop docker编辑Do…

【C++】对文章分词,并对词频用不同排序方法排序,比较各排序算法效率(功能全面,通俗易懂)

文章分词 1&#xff0e;问题描述2&#xff0e;需求分析3&#xff0e;概要设计3.1 主程序流程3.2 函数调用关系 4&#xff0e;主函数实现4.1 main.h4.2 main.cpp 5. 函数实现5.1 processDic函数5.2 forwardMax函数5.3 countWordFreq函数5.4 quickResult函数5.5 其它排序算法效率…

异地组网、网络部署、无线覆盖,贝锐蒲公英一步到位

面对网络架构复杂的企业总部&#xff0c;分散在各地的分支机构&#xff0c;以及出差的远程办公人员&#xff0c;如何才能高效异地组网&#xff1f; 为了确保总部、分部网络实现远程稳定、高速互访&#xff0c;以及远程人员安全访问总部业务系统&#xff0c;基于自研SD-WAN的贝…

elementui el-date-picker禁止选择今年、今天、之前、时间范围限制18个月

1、禁止选择今年之前的所有年份 <el-date-pickerv-if"tabsActive 0":clearable"false"v-model"yearValue"change"yearTimeChange"type"year"placeholder"选择年"value-format"yyyy":picker-options…

手搓数组栈(C语言)

stack.h #pragma once#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <stdbool.h> // 支持动态增长的栈 typedef int STDataType; typedef struct Stack {STDataType* a;int top; // 栈顶int capacity; // 容量 }Stack; //…

光伏储能系统的主要作用都有什么?

光伏储能系统&#xff0c;结合了光伏技术和储能技术&#xff0c;已经成为当今可再生能源领域的重要一环。它不仅在电力供应中扮演着关键角色&#xff0c;还在许多其他领域展现出其广泛的应用价值。本文将详细探讨光伏储能系统的主要作用。 首先&#xff0c;光伏储能系统在家庭住…

Java苍穹外卖03-Redis-营业状态-HttpClient-微信小程序开发-微信登录以及浏览

一、Redis入门 1.Redis简介 是对MySQL数据库的补充 2.下载安装 启动redis&#xff1a; 再开一个cmd&#xff1a;连接本地redis数据库 如果想连接其他地方的redis数据库&#xff1a;h为ip&#xff0c;p为端口 a为密码 3.数据类型 哈希适合存储对象&#xff0c;列表适合存储…

【问题实操】银河麒麟高级服务器操作系统实例,CPU软锁报错触发宕机

1.服务器环境以及配置 处理器&#xff1a; Kunpeng 920 内存&#xff1a; 256G DDR4 整机类型/架构&#xff1a; TaiShan 200 (Model 2280) 内核版本 4.19.90-23.8.v2101.ky10.aarch64 2.问题现象描述 两台搭载麒麟v10 sp1的机器均在系统CPU软锁报错时&#xff0c;触…

基于遗传优化算法的TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化算法的TSP问题求解&#xff0c;分别对四个不同的城市坐标进行路径搜索。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 ....…

迅睿CMS图集多文件Files调用指南

在构建企业网站、B2B/B2C商城&#xff0c;或任何功能性质以图片展示为主的平台时&#xff0c;使用多图或图集功能变得至关重要。特别是当展示大量产品的详细视图、项目案例图片&#xff0c;或任何需要以图集形式呈现的内容时&#xff0c;多文件Files功能便发挥着无可替代的作用…

Facebook的语言学:社交媒体如何影响我们的沟通方式

1. 引言 社交媒体已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中最具影响力的平台之一&#xff0c;不仅改变了人们之间的社交方式&#xff0c;也对我们的语言学产生了深远的影响。本文将深入探讨Facebook的语言学特点&#xff0c;以及它如何塑造和改变…

AI大模型探索之路-训练篇4:大语言模型训练数据集概览

系列文章目录&#x1f6a9; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 文章目录 系列文章目录&#x1f6a9;前言一、常用的预训练…