爬取58二手房并用SVR模型拟合

目录

一、前言

二、爬虫与数据处理

三、模型 


一、前言

  爬取数据仅用于练习和学习。本文运用二手房规格sepc(如3室2厅1卫)和二手房面积area预测二手房价格price,只是练习和学习,不代表如何实际意义。

二、爬虫与数据处理

import requests
import chardet
import pandas as pd
import time
from lxml import etree
from fake_useragent import UserAgent

ua = UserAgent()
user_agent = ua.random
print(user_agent)

url = 'https://gy.58.com/ershoufang/'
headers = {
   'User-Agent':user_agent
}

resp = requests.get(url=url, headers=headers)
encoding = chardet.detect(resp.content)['encoding']
resp.encoding = encoding
page_text = resp.text

tree = etree.HTML(page_text)
page_num_data = tree.xpath('//*[@id="esfMain"]/section/section/section/section/div/ul/li/a/text()')
page_num =  [item.strip() for item in page_num_data if item.strip().isdigit()]
last_page = int(page_num[-1])


total_address_title = []
total_BR_LR_B = []
total_area = []
total_price = []
empty_title = 0
empty_address_data = 0
empty_BR_LR_B_data = 0
empty_area_data = 0
empty_price_data = 0

for i in range(1, last_page+1):
    url = 'https://gy.58.com/ershoufang/p{}/?PGTID=0d100000-007d-f5b6-2cca-9cae0bcabf83&ClickID=1'.format(i)
    headers = {
        'User-Agent':user_agent
    }

    resp = requests.get(url=url, headers=headers)
    encoding = chardet.detect(resp.content)['encoding']
    resp.encoding = encoding
    page_text = resp.text

    tree = etree.HTML(page_text)
    
    title = tree.xpath('//*[@id="esfMain"]/section/section/section/section/div/a/div/div/div/h3[@class="property-content-title-name"]/text()')
    time.sleep(3)

    address_data = tree.xpath('//*[@id="esfMain"]/section/section/section/section/div/a/div/div/section/div/p[@class="property-content-info-comm-address"]/span/text()')
    address = [''.join(address_data[i:i+3]) for i in range(0, len(address_data), 3)]
    time.sleep(3)
    
    title_address = [str(address[i]) + '||' + str(title[i]) for i in range(min(len(address), len(title)))]
    total_address_title.extend(title_address)

    BR_LR_B_data = tree.xpath('//*[@id="esfMain"]/section/section/section/section/div/a/div/div/section/div/p[@class="property-content-info-text property-content-info-attribute"]/span/text()')
    BR_LR_B = [''.join(BR_LR_B_data[i:i+6]) for i in range(0, len(BR_LR_B_data), 6)]
    total_BR_LR_B.extend(BR_LR_B)
    time.sleep(3)

    area_data = tree.xpath('//*[@id="esfMain"]/section/section/section/section/div/a/div/div/section/div/p[@class="property-content-info-text"]/text()')
    area = [item.strip() for item in area_data if '㎡' in item.strip()]
    total_area.extend(area)
    time.sleep(3)

    price_data = tree.xpath('//*[@id="esfMain"]/section/section/section/section/div/a/div/div/p/span[@class="property-price-total-num"]/text()')
    price = [price + '万' for price in price_data]
    total_price.extend(price)
    time.sleep(3)
    
    if len(title) == 0:
        empty_title += 1
    if len(address_data) == 0:
        empty_address_data += 1
    if len(BR_LR_B_data) == 0:
        empty_BR_LR_B_data += 1
    if len(area_data) == 0:
        empty_area_data += 1
    if len(price_data) == 0:
        empty_price_data += 1
    
    print('Page{} 爬取成功'.format(i))

df = pd.DataFrame({
    '地址': total_address_title,
    '规格': total_BR_LR_B,
    '面积': total_area,
    '价格': total_price
})

print(empty_title, empty_address_data, empty_BR_LR_B_data, empty_area_data, empty_price_data)

df.to_excel('58二手房信息表.xlsx', index=False, engine='openpyxl')
print('58二手房信息表保存成功!')


# 处理表格
df = pd.read_excel('C:\\Users\\sjl\\Desktop\\58Second-hand-house\\58二手房信息表.xlsx')

delete_column = '地址'
df = df.drop(delete_column, axis=1) # 删除地址一列

df['规格'] = df['规格'].str.replace('室', '')
df['规格'] = df['规格'].str.replace('厅', '')
df['规格'] = df['规格'].str.replace('卫', '')
df['面积'] = df['面积'].str.replace('㎡', '')
df['价格'] = df['价格'].str.replace('万', '') # 删除文字和字符,保留数值

df = df.rename(columns={'规格': 'spec', '面积': 'area', '价格': 'price'}) # 重命名列

df = df * 0.001 # 缩小数值, 减少计算量

df.to_excel('58Second-hand-house.xlsx', index=False, engine='openpyxl')
print('数据处理成功!')

1. 运用chardet库自动获取网页编码

import chardet

resp = requests.get(url=url, headers=headers)

encoding = chardet.detect(resp.content)['encoding']

resp.encoding = encoding

2. 运用fake_useragent库,生成随机的用户代理字符串,获取一个随机的用户代理来使用

from fake_useragent import UserAgent

ua = UserAgent()

user_agent = ua.random

print(user_agent)

3. 使用列表推导,去除每个元素的空白字符,并保留那些只包含数字的元素,以获取网站页数

page_num =  [item.strip() for item in page_num_data if item.strip().isdigit()]

   首先使用strip()方法去除其两端的空白字符(包括换行符\n、空格等),接着使用isdigit()方法检查处理后的字符串是否只包含数字。如果条件成立,即字符串只包含数字,那么这个处理后的字符串就会被包含在page_num列表中。

4. 使用列表推导来遍历列表,并将每三个元素组合成一个元素,获取大致地址

address = [''.join(address_data[i:i+3]) for i in range(0, len(address_data), 3)]

首先通过range(0, len(address_data) 3)生成一个从0开始,address_data最后一位长度结束,步长为3的序列。然后,对于序列中的每个i,使用''.join(address_data[i, i+3])连接从i到i+3(不包括i+3)的元素。这样,每三个元素就被拼接成了一个元素,并存储在address中。 

 5. 考虑到大致地址会有重复,在地址后附加上标题,作为每个二手房独一无二的标志

title_address = [str(address[i]) + '||' + str(title[i]) for i in range(min(len(address), len(title)))]

6. 同样合并'3','室','2','厅','1','卫'

BR_LR_B = [''.join(BR_LR_B_data[i:i+6]) for i in range(0, len(BR_LR_B_data), 6)] 

7. 使用列表推导结合字符串处理方法获得只包含面积部分

area = [item.strip() for item in area_data if '㎡' in item.strip()] 

  遍历列表,对于每个元素,使用strip()方法去除前后的空格和换行符。检查处理过的字符串是否包含 "㎡" 字符,如果包含,则认为这个字符串表示面积信息。将这些面积信息添加到一个area列表中。 

8. 在价格后加上 "万" 

price = [price + '万' for price in price_data]

9. 监控得到有9页数据爬取失败

    if len(title) == 0:

        empty_title += 1

    if len(address_data) == 0:

        empty_address_data += 1

    if len(BR_LR_B_data) == 0:

        empty_BR_LR_B_data += 1

    if len(area_data) == 0:

        empty_area_data += 1

    if len(price_data) == 0:

        empty_price_data += 1

 

10. 删除表中的文字

df['规格'] = df['规格'].str.replace('室', '')

df['规格'] = df['规格'].str.replace('厅', '')

df['规格'] = df['规格'].str.replace('卫', '')

df['面积'] = df['面积'].str.replace('㎡', '')

df['价格'] = df['价格'].str.replace('万', '')

 11.部分数据展示(处理前后)

delete_column = '地址'

df = df.drop(delete_column, axis=1) # 删除地址一列

df['规格'] = df['规格'].str.replace('室', '')

df['规格'] = df['规格'].str.replace('厅', '')

df['规格'] = df['规格'].str.replace('卫', '')

df['面积'] = df['面积'].str.replace('㎡', '')

df['价格'] = df['价格'].str.replace('万', '') # 删除文字和字符,保留数值

df = df.rename(columns={'规格': 'spec', '面积': 'area', '价格': 'price'}) # 重命名列

df = df * 0.001 # 缩小数值, 减少计算量

三、模型 

模型官网:Ml regression in PythonOver 13 examples of ML Regression including changing color, size, log axes, and more in Python.icon-default.png?t=N7T8https://plotly.com/python/ml-regression/

import numpy as np
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from sklearn.svm import SVR

mesh_size = .02
margin = 0

df = pd.read_excel('C:\\Users\\sjl\\Desktop\\58Second-hand-house\\58Second-hand-house.xlsx')

X = df[['spec', 'area']]
y = df['price']

# Condition the model on sepal width and length, predict the petal width
model = SVR(C=1.)
model.fit(X, y)

# Create a mesh grid on which we will run our model
x_min, x_max = X.spec.min() - margin, X.spec.max() + margin
y_min, y_max = X.area.min() - margin, X.area.max() + margin
xrange = np.arange(x_min, x_max, mesh_size)
yrange = np.arange(y_min, y_max, mesh_size)
xx, yy = np.meshgrid(xrange, yrange)

# Run model
pred = model.predict(np.c_[xx.ravel(), yy.ravel()])
pred = pred.reshape(xx.shape)

# Generate the plot
fig = px.scatter_3d(df, x='spec', y='area', z='price')
fig.update_traces(marker=dict(size=5))
fig.add_traces(go.Surface(x=xrange, y=yrange, z=pred, name='pred_surface'))
fig.show()

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EasyX图形库学习(二、文字输出)

目录 一、文字绘制函数 字体属性结构体:logfont 文字输出 outtextxy 在指定位置输出字符串。 ​编辑 但如果直接使用,可能有以下报错: 三种解决方案: 将一个int类型的分数,输出到图形界面上 如果直接使用: 会把score输入进去根据A…

【Vue.js设计与实现】第二篇:响应系统-阅读笔记(持续更新)

从高层设计的角度去探讨框架需要关注的问题。 系列目录: 标题博客第一篇:框架设计概览【Vue.js设计与实现】第一篇:框架设计概览-阅读笔记第二篇:响应系统【Vue.js设计与实现】第二篇:响应系统-阅读笔记第三篇&#x…

洗地机哪个品牌质量好?盘点当下最值得买的4款洗地机型号推荐

随着生活节奏的加快,人们对于家庭清洁的需求也越来越迫切。而洗地机作为家庭清洁利器备受青睐,但洗地机也分为很多款式,每一个款式都具备不同的清洁效果,可以节省不少时间。接下来,就由笔者为大家详细介绍一下洗地机哪…

如何去除图片水印?三个简单实用方法

随着数字时代的来临,我们每天都会接触到大量的图片,然而,许多图片却因为水印而影响了美观。为了解决这个问题,我们需要图片去水印的方法。今天,我们就来为大家介绍几个简单实用的方法,可以轻松去除水印&…

备战蓝桥杯---搜索(优化1)

显然&#xff0c;我们可以用BFS解决&#xff0c;具体实现与八数码类似&#xff1a; 下面是代码&#xff1a; #include<bits/stdc.h> using namespace std; #define N 3000000 string a,b; int hh,dis[N],cnt; struct node{string u,v; }bian[7]; map<string,int>…

Flutter 和 Android原生(Activity、Fragment)相互跳转、传参

前言 本文主要讲解 Flutter 和 Android原生之间&#xff0c;页面相互跳转、传参&#xff0c; 但其中用到了两端相互通信的知识&#xff0c;非常建议先看完这篇 讲解通信的文章&#xff1a; Flutter 与 Android原生 相互通信&#xff1a;BasicMessageChannel、MethodChannel、…

MongoDB复制集实战及原理分析

文章目录 MongoDB复制集复制集架构三节点复制集模式PSS模式&#xff08;官方推荐模式&#xff09;PSA模式 典型三节点复制集环境搭建复制集注意事项环境准备配置复制集复制集状态查询使用mtools创建复制集安全认证复制集连接方式 复制集成员角色属性一&#xff1a;Priority 0属…

match-case与if/elif/else(python)

if/elif/else语句应对一般场景&#xff0c;match-case主打复杂条件分支语句。 (笔记模板由python脚本于2024年01月28日 18:27:37创建&#xff0c;本篇笔记适合有一定编程基础&#xff0c;对python基础已比较扎实的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1…

uniapp使用u-popup组件弹窗出现页面还可滑动

*1、问题所在&#xff1a; 弹窗遮罩层出现了页面依旧可以上下滑动 2、要求: 为了用户更好交互体验&#xff0c;弹窗出现后应禁止页面往下滑动 3、实现思路&#xff1a; 在弹窗盒子外层添加个阻止触摸冒泡事件&#xff0c;使用touchmove.stop.prevent 4、代码如下&#xff…

eosio.token 智能合约介绍

一、目的 eosio.token系统合约定义了允许用户为基于EOSIO的区块链创建、发行和管理代币的结构和操作&#xff0c;它演示了一种实现允许创建和管理代币的智能合约的方法。本文详细介绍了eosio.token系统合约并在本地测试链上实际发行了代币进行演示&#xff0c;适用于EOS智能合…

OJ刷题:《剑指offer》之单身狗1、2 !(巧用位操作符,超详细讲解!)

目录 1.单身狗1 1.1 题目描述 1.2排序寻找 1.3巧用位操作符 2.单身狗2 1.1 题目描述 1.2排序寻找 1.3巧用位操作符 不是每个人都能做自己想做的事&#xff0c;成为自己想成为的人。 克心守己&#xff0c;律己则安&#xff01; 创作不易&#xff0c;宝子们&#xff01;如…

homework day3

第三章 类与构造函数 一&#xff0e;选择题 1、下列不能作为类的成员的是&#xff08;B&#xff09; A. 自身类对象的指针 B. 自身类对象 C. 自身类对象的引用 D. 另一个类的对象 2、假定AA为一个类&#xff0c;a()为该类公有的函数成员&#xff0c;x为该类的一个对象&am…

如何在一台MacBook上构建大模型知识库?

▼最近直播超级多&#xff0c;预约保你有收获 今晚直播&#xff1a;《构建大模型知识库案例实战》 —1— 如何在一台 MacBook 上构建企业知识库&#xff1f; 最核心最重要的是我们手上的文档资料出于安全要求&#xff0c;不能随便上传到云服务&#xff0c;也就无法实际验证知识…

单链表的经典题目练习

哈喽&#xff0c;小伙伴们&#xff0c;上一次我们学习了单链表的知识&#xff0c;这次我们就要运用学到的知识来做一些相关的题目。我们都知道&#xff0c;要学好数据结构与算法&#xff0c;一定要多刷相关的题目才能有所提高。所以我们一起来学习一些单链表的经典题目算法题。…

操作系统透视:从历史沿革到现代应用,剖析Linux与网站服务架构

目录 操作系统 windows macos Linux 服务器搭建网站 关于解释器的流程 curl -I命令 名词解释 dos bash/terminal&#xff0c;(终端) nginx/apache&#xff08;Linux平台下的&#xff09; iis&#xff08;Windows平台下的&#xff09; GUI(图形化管理接口&#xff…

Multisim14.0仿真(四十九)共阴极/阳极7段数码管驱动设计

一、74LS47/48简介: 74LS47/48芯片是一种常用的七段数码管译码器驱动器,常用在各种数字电路和单片机系统的显示系统中. 二、74LS47/48引脚说明及定义: 7段显示译码器74LS47/48是输出低/高电平有效的译码器,74LS47/48除了有实现7段显示译码器基本功能的输入(DCBA)和输出(Ya…

小程序<swiper/>组件详解及使用指南

目录 引言微信小程序的重要性Swiper组件的角色与功能简介Swiper组件基础Swiper组件的定义与使用场景如何在微信小程序中引入Swiper组件Swiper组件的基本结构与属性Swiper组件的高级应用自定义Swiper指示点样式实现Swiper的动态效果(如自动播放、循环播放)说明引言 微信小程序…

时序预测 | MATLAB实现基于CNN-BiLSTM-AdaBoost卷积双向长短期记忆网络结合AdaBoost时间序列预测

时序预测 | MATLAB实现基于CNN-BiLSTM-AdaBoost卷积双向长短期记忆网络结合AdaBoost时间序列预测 目录 时序预测 | MATLAB实现基于CNN-BiLSTM-AdaBoost卷积双向长短期记忆网络结合AdaBoost时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab实现…

【C++】类和对象之运算符重载(三)

前言&#xff1a;在前面我们知道在类和对象中有六个默认成员函数&#xff0c;并学习了其中三个构造函数、析构函数、拷贝构造函数&#xff0c;今天我们将进一步的学习.赋值运算符重载。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质…

[SWPUCTF 2021 新生赛]ez_unserialize

根据下面的user_agent和Disallow可以判断这个是在robots.txt 我们看的出来这是一个反序列化需要我们adminadmin passwdctf construct 构造方法&#xff0c;当一个对象被创建时调用此方法&#xff0c;不过unserialize()时却不会被调用 destruct 析构方法&#xff0c;PHP将在对象…