简介

首先打开相关网页(北京链家小区信息)。

注意本博客的代码适用于爬取某个城市的小区二手房房价信息。

如果需要爬取其他信息,可修改代码,链家的数据获取的基本逻辑都差不多。

效果展示

因为只需要60行左右的代码,所以就不写入excel了,直接在终端打印出来。

效果如下,为了展示美观我加了个json.dumps。

分析网页

用谷歌浏览器打开北京链家小区信息,如果需要其他城市的可以直接替换。

首先可以看看我们要爬取的信息。我这次主要获取的有小区名、小区位置、房价。

进入页面后Ctrl+U查看网页源代码,在源代码界面Ctrl+F搜索小区名(也可以搜索其他的)先定位到相关的代码处。

经过简单的观察,我们就可以定位到我们所需要的所有信息(链家还是挺好爬取的……)。

可以看下图,该条目下我们所需的所有信息一下都被找到了。

然后把前后的代码拷贝一下,经过一系列整理,得到我们要用到的正则规则。

# 正则表达式

# 小区名

name_rule = r'lianjia.com/xiaoqu/[0-9]*/" target="_blank">(.*?)' #[0-9]* 表示任意多个数字 .*? 匹配一次

name = re.findall(name_rule, html)

# 房价

price_rule = r'

(.*?)'

price = re.findall(price_rule, html)

# 小区所在区域

district_rule = r'class="district" title=".*?">(.*?)'

district = re.findall(district_rule, html)

# 小区所在商圈

bizcircle_rule = r'class="bizcircle" title=".*?">(.*?)&nbsp'

bizcircle = re.findall(bizcircle_rule, html)

核心问题已经轻松解决了,接下来可以在前面用request加上页面源代码的获取代码,这样才能实现爬虫。

url = str(url)

html = requests.get(url).text # 获取页面原代码

好了,基本的分析已经完成了。

代码思路

前文中网页的分析已经完整了,核心的爬取思路已经有了。

接下来还需要完成的工作是:1. 实现爬虫的自动化,比如说自己翻页啊什么的。2. 把爬取到的n个页面的数据整合并且整理展示出。

先把需要的库导入。这里用到json主要是为了用json.dumps美化数据的展示。

import requests

import re

import time

import json

一、首先我需要能够爬取单页的数据。

主要流程如下:输入相关的url,读取源代码,用正则表达式筛选我们需要的数据(小区名、房价、区域、商圈)、让数据一一对应(如果不一一对应会打印“参数匹配失败”。

整个def最后返回一个字典,字典的key是小区名,字典的value是一个数组(包含了区域、商圈、房价信息)。

def get_housing_price(url):

url = str(url)

html = requests.get(url).text # 获取页面原代码

# 正则表达式

# 小区名

name_rule = r'lianjia.com/xiaoqu/[0-9]*/" target="_blank">(.*?)' #[0-9]* 表示任意多个数字 .*? 匹配一次

name = re.findall(name_rule, html)

# 房价

price_rule = r'

(.*?)'

price = re.findall(price_rule, html)

# 小区所在区域

district_rule = r'class="district" title=".*?">(.*?)'

district = re.findall(district_rule, html)

# 小区所在商圈

bizcircle_rule = r'class="bizcircle" title=".*?">(.*?)&nbsp'

bizcircle = re.findall(bizcircle_rule, html)

# 建立小区名和房价对应的字典

housing_price_dict = {}

if len(name) == len(price) == len(district) == len(bizcircle):

for i in range(len(name)):

infor = [] # 存放信息的列表

if price[i] != '暂无': #因为存在暂无,把除了暂无房价数据以外的房价变成浮点型

floated = float(price[i])

else:

floated = '暂无'

infor.append(district[i])

infor.append(bizcircle[i])

infor.append(floated)

housing_price_dict[name[i]] = infor # 遍历生成键值

else:

print('参数匹配失败')

return housing_price_dict

二、遍历输入的n个页面,并且把n个页面获取的数据字典整合为一个。

上面已经写了爬取一个页面的def,现在要在上面def的基础上自动生成url并且爬取n个页面并且整合n个页面的数据。

首先先写一个合并两个字典的def放在这,等下用得着。

# 合并字典

def merge_dict(dict1, dict2):

merged = {**dict1, **dict2}

return merged

然后写一个遍历页面的def,经过简单的观察切换页面只需要在原来的url后面+pg+数字就行。

下面这个def的思路是输入起始和中止页,用for遍历起始和中止页之间的所有页面,然后用一里面的def爬取每个单页的数据,最后把每个单页得到的字典整合起来。

# 整合房价字典

def merge_price_dict(start, end):

initial = {}

for pg in range(start, end+1): # 设置起始和中止界面

url = f'https://bj.lianjia.com/xiaoqu/pg{pg}/'

prices = get_housing_price(url)

time.sleep(1)

initial = merge_dict(initial, prices)

return initial

三、举个栗子。

拥有了以上的三个def就可以完成数据的爬取和打印工作了。下面举个简单的栗子谈谈如何串联三个def。

只需要三行(如果大家需要自己该代码写入excel之类的话,可以直接放弃第二行第三行):

第一行:获取3-5页里的房价数据并且整合为一个字典。

第二行:美化一下第一行的字典(主要为了打印出来比较好看)。

第三行:打印。

price_dict = merge_price_dict(3, 5)

formation_dict = json.dumps(price_dict, indent=4, ensure_ascii=False) # 输出美化

print(formation_dict)

打印出来结果长这样。

完整代码

import requests

import re

import time

import json

# 爬取房价并且返回一个页面的字典

def get_housing_price(url):

url = str(url)

html = requests.get(url).text # 获取页面原代码

# 正则表达式

# 小区名

name_rule = r'lianjia.com/xiaoqu/[0-9]*/" target="_blank">(.*?)' #[0-9]* 表示任意多个数字 .*? 匹配一次

name = re.findall(name_rule, html)

# 房价

price_rule = r'

(.*?)'

price = re.findall(price_rule, html)

# 小区所在区域

district_rule = r'class="district" title=".*?">(.*?)'

district = re.findall(district_rule, html)

# 小区所在商圈

bizcircle_rule = r'class="bizcircle" title=".*?">(.*?)&nbsp'

bizcircle = re.findall(bizcircle_rule, html)

# 建立小区名和房价对应的字典

housing_price_dict = {}

if len(name) == len(price) == len(district) == len(bizcircle):

for i in range(len(name)):

infor = [] # 存放信息的列表

if price[i] != '暂无': #因为存在暂无,把除了暂无房价数据以外的房价变成浮点型

floated = float(price[i])

else:

floated = '暂无'

infor.append(district[i])

infor.append(bizcircle[i])

infor.append(floated)

housing_price_dict[name[i]] = infor # 遍历生成键值

else:

print('参数匹配失败')

return housing_price_dict

# 合并字典

def merge_dict(dict1, dict2):

merged = {**dict1, **dict2}

return merged

# 整合房价字典

def merge_price_dict(start, end):

initial = {}

for pg in range(start, end+1): # 设置起始和中止界面

url = f'https://bj.lianjia.com/xiaoqu/pg{pg}/'

prices = get_housing_price(url)

time.sleep(1)

initial = merge_dict(initial, prices)

return initial

price_dict = merge_price_dict(3, 5)

formation_dict = json.dumps(price_dict, indent=4, ensure_ascii=False) # 输出美化

print(formation_dict)

如果需要爬取不同城市的房价数据,可以修改第52行的url。

展望

因为我是人文地理学的学生,所以所做的工作主要还是为了人文地理学相关研究服务的。首先比较重要的后续工作是使数据能够被写入excel表格,这个还是挺简单的,参考我之前的博客已经能很好地实现相关的任务;其次是利用小区地址和相关地图的api查询poi经纬度并且一同写入excel表,着一部分的工作在去年还没写博客的时候也已经能够实现了,但是因为搜索的关键词和地图本身的问题导致搜索到的poi数据过多或者无法匹配,每条数据具体实现的效果也良莠不齐。

所以之后可能还是侧重于把房价数据和poi数据结合起来,并且输入ArcGIS等相关软件中实现可视化。实现后可能会再水一篇博客。

-----------------------分割线(以下是乞讨内容)-----------------------

python爬取南京市房价_基于python的链家小区房价爬取——仅需60行代码相关推荐

  1. python房子代码_基于python的链家小区房价爬取——仅需60行代码!

    简介 首先打开相关网页(北京链家小区信息). 注意本博客的代码适用于爬取某个城市的小区二手房房价信息. 如果需要爬取其他信息,可修改代码,链家的数据获取的基本逻辑都差不多. 效果展示 因为只需要60行 ...

  2. 【Python】基于Python获取链家小区房价信息及其POI数据

    文章目录 1 简介 2 效果展示 3 分析网页 4 代码思路 5 完整代码 6 相关文章 1 简介 本来要先发在csdn上的,但是之前学弟催我给他公众号写点东西,我就把这篇博客首发在他的公众号上,现在 ...

  3. python加密敏感信息_仅需10行代码,使用python加密用户敏感数据

    原标题:仅需10行代码,使用python加密用户敏感数据 数据分析师必须要遵守的一个规则就是数据保密,但在跨部门沟通的时候,难免会有数据泄露的情况,所以,对于用户的姓名.手机号.地址等敏感信息,一般需 ...

  4. python爬虫代码1000行-最精简的爬虫 --仅需4行代码(python)

    最精简的爬虫 --仅需4行代码(python) 刚刚整理了下爬虫系列,于是乎就开始了第一次的技术分享 今天,我们主要讲述的是思路,思路,思路. 相比起,直接贴代码,思路显的更为重要 当初,自己的坑,希 ...

  5. 最简单的爬虫代码 python_最精简的爬虫 --仅需4行代码(python)

    最精简的爬虫 --仅需4行代码(python) 刚刚整理了下爬虫系列,于是乎就开始了第一次的技术分享 今天,我们主要讲述的是思路,思路,思路. 相比起,直接贴代码,思路显的更为重要 当初,自己的坑,希 ...

  6. python简单爬虫代码-最精简的爬虫 --仅需4行代码(python)

    最精简的爬虫 --仅需4行代码(python) 刚刚整理了下爬虫系列,于是乎就开始了第一次的技术分享 今天,我们主要讲述的是思路,思路,思路. 相比起,直接贴代码,思路显的更为重要 当初,自己的坑,希 ...

  7. 基于python爬虫技术的应用_基于Python爬虫技术的应用

    办公自动化杂志 一.引言 本文主要是对 Python 爬虫技术进行阐述,基于 python 的爬虫与其他语言相比的有很多优势.通过爬去某个网站的所有新闻这个案例,来进一步阐释 Python 爬虫技术的 ...

  8. python居然能语音控制电脑壁纸切换,只需60行代码

    前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 家在日常的电脑使用中,都会有自己喜爱类型的桌面 单纯的桌面有时候会让人觉得单调 今天,就由我带领大家只用60行代码打造一款语音壁纸切换器程序, 让大家能够 ...

  9. 基于python的数据爬取与分析_基于Python的网站数据爬取与分析的技术实现策略

    欧阳元东 摘要:Python为网页数据爬取和数据分析提供了很多工具包.基于Python的BeautifulSoup可以快速高效地爬取网站数据,Pandas工具能方便灵活地清洗分析数据,调用Python ...

最新文章

  1. 30 个 php 操作 redis 常用方法代码例子
  2. 信号与系统-2021年春季学期-考试信息
  3. HTML5 Canvas 绘制旋转45度佛教万字
  4. poj 3614(最大流)
  5. Yii的gii-modules
  6. Hystrix之Dashboard的常见问题
  7. mysql为什么选错索引?怎么解决?
  8. 使用RDLC报表(三)--向RDLC报表传入参数
  9. ImportError: cannot import name '_ellipsoid'
  10. 集合框架(去除ArrayList集合中的重复字符串元素案例2)
  11. 【附详细材料清单】一种不需要额外加工零件的板球结构(可修改后用于电赛板球结构)
  12. 探索ESP8285(3)通过EMQX服务器点亮一个LED灯
  13. 要打仗,你手里先得有张地图:数据治理之元数据管理
  14. 电子标签有哪些封装方式
  15. 正确安装Senta的姿势
  16. 单例模式singleton
  17. MFC ListCtrl的cheek框的全选和反选
  18. 菜鸟进阶黑客知识整合大全(1)
  19. 英语专业,不想做老师,还能做什么工作?
  20. spring事务管理tx:Advice详解

热门文章

  1. [002] ROS+罗技F710游戏手柄,实现小车遥控控制
  2. 如何让图标文件(ico)的背景变透明?
  3. 分子偶极矩大小如何判断_分子极性大小如何判断
  4. Vulkan 预旋转处理设备方向
  5. Javascript异步编程方法有哪些
  6. 基于安卓平台的校园社交app设计
  7. AutoJs4.4.1免费版快速接通vscode进行调试脚本
  8. 十位时间戳转化成时间
  9. 云服务器饥荒_阿里云搭建饥荒专用服务器
  10. 再谈SQL注入入侵动网SQL版