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


Posted in Python onOctober 16, 2021

本文重点

  • 系统分析网页性质
  • 结构化的数据解析
  • csv数据保存

环境介绍

  • python 3.8
  • pycharm 专业版 >>> 激活码

#模块使用

  • requests >>> pip install requests
  • parsel >>> pip install parsel
  • csv

【付费VIP完整版】只要看了就能学会的教程,80集Python基础入门视频教学

点这里即可免费在线观看

爬虫代码实现步骤: 发送请求 >>> 获取数据 >>> 解析数据 >>> 保存数据

导入模块

import requests # 数据请求模块 第三方模块 pip install requests
import parsel # 数据解析模块
import re
import csv

发送请求, 对于房源列表页发送请求

url = 'https://bj.lianjia.com/ershoufang/pg1/'
# 需要携带上 请求头: 把python代码伪装成浏览器 对于服务器发送请求
# User-Agent 浏览器的基本信息
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'
}
response = requests.get(url=url, headers=headers)

获取数据

print(response.text)

解析数据

selector_1 = parsel.Selector(response.text)
# 把获取到response.text 数据内容转成 selector 对象
href = selector_1.css('div.leftContent li div.title a::attr(href)').getall()
for link in href:
    html_data = requests.get(url=link, headers=headers).text
    selector = parsel.Selector(html_data)
    # css选择器 语法
    # try:
    title = selector.css('.title h1::text').get() # 标题
    area = selector.css('.areaName .info a:nth-child(1)::text').get()  # 区域
    community_name = selector.css('.communityName .info::text').get()  # 小区
    room = selector.css('.room .mainInfo::text').get()  # 户型
    room_type = selector.css('.type .mainInfo::text').get()  # 朝向
    height = selector.css('.room .subInfo::text').get().split('/')[-1]  # 楼层
    # 中楼层/共5层 split('/') 进行字符串分割  ['中楼层', '共5层'] [-1]
    # ['中楼层', '共5层'][-1] 列表索引位置取值 取列表中最后一个元素  共5层
    # re.findall('共(\d+)层', 共5层) >>>  [5][0] >>> 5
    height = re.findall('共(\d+)层', height)[0]
    sub_info = selector.css('.type .subInfo::text').get().split('/')[-1]  # 装修
    Elevator = selector.css('.content li:nth-child(12)::text').get()  # 电梯
    # if Elevator == '暂无数据电梯' or Elevator == None:
    #     Elevator = '无电梯'
    house_area = selector.css('.content li:nth-child(3)::text').get().replace('?', '')  # 面积
    price = selector.css('.price .total::text').get()  # 价格(万元)
    date = selector.css('.area .subInfo::text').get().replace('年建', '')  # 年份
    dit = {
        '标题': title,
        '市区': area,
        '小区': community_name,
        '户型': room,
        '朝向': room_type,
        '楼层': height,
        '装修情况': sub_info,
        '电梯': Elevator,
        '面积(?)': house_area,
        '价格(万元)': price,
        '年份': date,
    }
    csv_writer.writerow(dit)
    print(title, area, community_name, room, room_type, height, sub_info, Elevator, house_area, price, date,
          sep='|')

保存数据

f = open('二手房数据.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
    '标题',
    '市区',
    '小区',
    '户型',
    '朝向',
    '楼层',
    '装修情况',
    '电梯',
    '面积(?)',
    '价格(万元)',
    '年份',
])
csv_writer.writeheader()

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

数据可视化

导入所需模块

import pandas as pd
from pyecharts.charts import Map
from pyecharts.charts import Bar
from pyecharts.charts import Line
from pyecharts.charts import Grid
from pyecharts.charts import Pie
from pyecharts.charts import Scatter
from pyecharts import options as opts

读取数据

df = pd.read_csv('链家.csv', encoding = 'utf-8')
df.head()

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

各城区二手房数量北京市地图

new = [x + '区' for x in region]
m = (
        Map()
        .add('', [list(z) for z in zip(new, count)], '北京')
        .set_global_opts(
            title_opts=opts.TitleOpts(title='北京市二手房各区分布'),
            visualmap_opts=opts.VisualMapOpts(max_=3000),
        )
    )
m.render_notebook()

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

各城区二手房数量-平均价格柱状图

df_price.values.tolist()
price = [round(x,2) for x in df_price.values.tolist()]
bar = (
    Bar()
    .add_xaxis(region)
    .add_yaxis('数量', count,
              label_opts=opts.LabelOpts(is_show=True))
    .extend_axis(
        yaxis=opts.AxisOpts(
            name="价格(万元)",
            type_="value",
            min_=200,
            max_=900,
            interval=100,
            axislabel_opts=opts.LabelOpts(formatter="{value}"),
        )
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title='各城区二手房数量-平均价格柱状图'),
        tooltip_opts=opts.TooltipOpts(
            is_show=True, trigger="axis", axis_pointer_type="cross"
        ),
        xaxis_opts=opts.AxisOpts(
            type_="category",
            axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
        ),
        yaxis_opts=opts.AxisOpts(name='数量',
            axistick_opts=opts.AxisTickOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=False),)
    )
)

line2 = (
    Line()
    .add_xaxis(xaxis_data=region)
    .add_yaxis(
        
        series_name="价格",
        yaxis_index=1,
        y_axis=price,
        label_opts=opts.LabelOpts(is_show=True),
        z=10
        )
)

bar.overlap(line2)
grid = Grid()
grid.add(bar, opts.GridOpts(pos_left="5%", pos_right="20%"), is_control_axis_index=True)
grid.render_notebook()

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

area0 = top_price['小区'].values.tolist()
count = top_price['价格(万元)'].values.tolist()

bar = (
    Bar()
    .add_xaxis(area0)
    .add_yaxis('数量', count,category_gap = '50%')
    .set_global_opts(
        yaxis_opts=opts.AxisOpts(name='价格(万元)'),
        xaxis_opts=opts.AxisOpts(name='数量'),
    )
)
bar.render_notebook()

 

散点图

s = (
    Scatter()
    .add_xaxis(df['面积(?)'].values.tolist())
    .add_yaxis('',df['价格(万元)'].values.tolist())
    .set_global_opts(xaxis_opts=opts.AxisOpts(type_='value'))
)
s.render_notebook()

 

房屋朝向占比

directions = df_direction.index.tolist()
count = df_direction.values.tolist()

c1 = (
    Pie(init_opts=opts.InitOpts(
            width='800px', height='600px',
            )
       )
        .add(
        '',
        [list(z) for z in zip(directions, count)],
        radius=['20%', '60%'],
        center=['40%', '50%'],
#         rosetype="radius",
        label_opts=opts.LabelOpts(is_show=True),
        )    
        .set_global_opts(title_opts=opts.TitleOpts(title='房屋朝向占比',pos_left='33%',pos_top="5%"),
                        legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%",pos_top="25%",orient="vertical")
                        )
        .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{c} ({d}%)'),position="outside")
    )
c1.render_notebook()

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

装修情况/有无电梯玫瑰图(组合图)

fitment = df_fitment.index.tolist()
count1 = df_fitment.values.tolist()

directions = df_direction.index.tolist()
count2 = df_direction.values.tolist()

bar = (
    Bar()
    .add_xaxis(fitment)
    .add_yaxis('', count1, category_gap = '50%')
    .reversal_axis()
    .set_series_opts(label_opts=opts.LabelOpts(position='right'))    
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(name='数量'),
        title_opts=opts.TitleOpts(title='装修情况/有无电梯玫瑰图(组合图)',pos_left='33%',pos_top="5%"),
        legend_opts=opts.LegendOpts(type_="scroll", pos_left="90%",pos_top="58%",orient="vertical")
    )
)

c2 = (
    Pie(init_opts=opts.InitOpts(
            width='800px', height='600px',
            )
       )
        .add(
        '',
        [list(z) for z in zip(directions, count2)],
        radius=['10%', '30%'],
        center=['75%', '65%'],
        rosetype="radius",
        label_opts=opts.LabelOpts(is_show=True),
        )    
        .set_global_opts(title_opts=opts.TitleOpts(title='有/无电梯',pos_left='33%',pos_top="5%"),
                        legend_opts=opts.LegendOpts(type_="scroll", pos_left="90%",pos_top="15%",orient="vertical")
                        )
        .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{c} \n ({d}%)'),position="outside")
    )

bar.overlap(c2)
bar.render_notebook()

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

二手房楼层分布柱状缩放图

floor = df_floor.index.tolist()
count = df_floor.values.tolist()
bar = (
    Bar()
    .add_xaxis(floor)
    .add_yaxis('数量', count)
    .set_global_opts(
        title_opts=opts.TitleOpts(title='二手房楼层分布柱状缩放图'),
        yaxis_opts=opts.AxisOpts(name='数量'),
        xaxis_opts=opts.AxisOpts(name='楼层'),
        datazoom_opts=opts.DataZoomOpts(type_='slider')
    )
)
bar.render_notebook()

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

房屋面积分布纵向柱状图

area = df_area.index.tolist()
count = df_area.values.tolist()

bar = (
    Bar()
    .add_xaxis(area)
    .add_yaxis('数量', count)
    .reversal_axis()
    .set_series_opts(label_opts=opts.LabelOpts(position="right"))
    .set_global_opts(
        title_opts=opts.TitleOpts(title='房屋面积分布纵向柱状图'),
        yaxis_opts=opts.AxisOpts(name='面积(?)'),
        xaxis_opts=opts.AxisOpts(name='数量'),
    )
)
bar.render_notebook()

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

到此这篇关于Python爬虫入门案例之爬取二手房源数据的文章就介绍到这了,更多相关Python 爬取二手房数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Linux下使用python调用top命令获得CPU利用率
Mar 10 Python
Pthon批量处理将pdb文件生成dssp文件
Jun 21 Python
python中hashlib模块用法示例
Oct 30 Python
Python WSGI的深入理解
Aug 01 Python
python遍历文件目录、批量处理同类文件
Aug 31 Python
用python拟合等角螺线的实现示例
Dec 27 Python
Python实现银行账户资金交易管理系统
Jan 03 Python
PyQt5+python3+pycharm开发环境配置教程
Mar 24 Python
浅谈Python中re.match()和re.search()的使用及区别
Apr 14 Python
Django框架获取form表单数据方式总结
Apr 22 Python
使用Pytorch搭建模型的步骤
Nov 16 Python
pytorch中的numel函数用法说明
May 13 Python
Python爬虫入门案例之回车桌面壁纸网美女图片采集
Python Django模型详解
Python 阶乘详解
Oct 05 #Python
Python 实现Mac 屏幕截图详解
基于Python和openCV实现图像的全景拼接详细步骤
C3 线性化算法与 MRO之Python中的多继承
Python编程super应用场景及示例解析
You might like
php 将excel导入mysql
2009/11/09 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
php 魔术常量详解及实例代码
2016/12/04 PHP
一键生成各种尺寸Icon的php脚本(实例)
2017/02/08 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
D3.js实现散点图和气泡图的方法详解
2016/09/21 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
微信小程序实现tab和swiper切换结合效果
2020/07/17 Javascript
4个顶级开源JavaScript图表库
2018/09/29 Javascript
浅谈redux, koa, express 中间件实现对比解析
2019/05/23 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
2019/10/21 Javascript
python私有属性和方法实例分析
2015/01/15 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
Python OpenCV调用摄像头检测人脸并截图
2020/08/20 Python
pytorch 修改预训练model实例
2020/01/18 Python
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
网上蛋糕店创业计划书
2014/01/24 职场文书
企业出纳岗位职责
2014/03/12 职场文书
学习十八大的心得体会
2014/09/12 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
2015年卫生院健康教育工作总结
2015/07/24 职场文书
同学聚会祝酒词
2015/08/10 职场文书
Python超简单容易上手的画图工具库推荐
2021/05/10 Python
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL
5道关于python基础 while循环练习题
2021/11/27 Python
Vue全局事件总线你了解吗
2022/02/24 Vue.js
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers