相信大家买房都不想高位接盘,都想买到笋盘吧,所以买房之前,了解市场房价信息就很重要了,而二手房房价信息又是反映房价行情的重要信息,透过二手房房价信息,可以得知地区房价水平,供需关系,甚至未来一段时间的房价走势,但搜集二手房房价信息往往让人心力交瘁,而python可以轻松爬取某地区的房价信息,现在就来看下python如何爬取上海某地区的二手房房价信息吧,绝对比你想象的简单哦
import requests
import re
import bs4
from bs4 import BeautifulSoup
import pandas as pd
/opt/conda/lib/python3.6/site-packages/requests/__init__.py:80: RequestsDependencyWarning: urllib3 (1.25.7) or chardet (3.0.4) doesn't match a supported version!
RequestsDependencyWarning)
In [27]:
url='https://sh.lianjia.com/ershoufang/pudong/pgl/'
header={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'}
response=requests.get(url=url,headers=header)
response.text
Out[27]:
'<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta http-equiv="Cache-Control" content="no-transform" /><meta http-equiv="Cache-Control" content="no-siteapp" /><meta http-equiv="Content-language" content="zh-CN" /><meta name="format-detection" content="telephone=no" /><meta name="applicable-device" content="pc"><meta name="location" content="province=上海;city=上海;coord=31.2368,121.4804" /><link rel="alternate" media="only screen and (max-width: 640px)" href="https://m.lianjia.com/sh/ershoufang/pudong/pgl/" >\n<meta name="mobile-agent" content="format=
In [40]:
soup=bs4.BeautifulSoup(response.text)
#提取地区信息
house_area=[i.text.strip() for i in soup.findAll(name='a',attrs={'data-el':'region'})]
In [ ]:
#提取房子信息
[i.text for i in soup.findAll(name='div',attrs={'class':'houseInfo'})]
In [30]:['2室1厅 | 57.18平米 | 南 | 精装 | 低楼层(共6层) | 1988年建 | 板楼', '3室2厅 | 125.35平米 | 南 北 | 精装 | 高楼层(共10层) | 2002年建 | 板楼', '2室1厅 | 72.26平米 | 南 | 精装 | 中楼层(共11层) | 2009年建 | 板楼', '1室1厅 | 51.3平米 | 南 | 精装 | 低楼层(共6层) | 2009年建 | 板楼', '2室2厅 | 83.53平米 | 南 北 | 简装 | 低楼层(共6层) | 2014年建 | 板楼', '2室2厅 | 87.16平米 | 南 | 简装 | 高楼层(共20层) | 2011年建 | 板楼', '2室1厅 | 58.81平米 | 南 北 | 精装 | 中楼层(共6层) | 1994年建 | 板楼', '4室2厅 | 89.5平米 | 南 | 精装 | 低楼层(共16层) | 2009年建 | 塔楼', '2室0厅 | 59.31平米 | 南 | 简装 | 高楼层(共7层) | 1992年建 | 板楼', '1室1厅 | 61.39平米 | 南 | 精装 | 高楼层(共6层) | 1996年建 | 板楼', '2室2厅 | 80.34平米 | 南 | 精装 | 低楼层(共18层) | 2003年建 | 板楼', '2室2厅 | 89.79平米 | 南 | 精装 | 中楼层(共22层) | 2002年建 | 塔楼', '1室1厅 | 57.78平米 | 南 | 简装 | 中楼层(共6层) | 2002年建 | 板楼', '3室2厅 | 86.66平米 | 南 | 简装 | 高楼层(共6层) | 2006年建 | 板楼', '2室1厅 | 64.48平米 | 南 | 精装 | 高楼层(共6层) | 1995年建 | 板楼', '3室2厅 | 121.81平米 | 南 | 精装 | 低楼层(共6层) | 2003年建 | 板楼', '2室2厅 | 115.17平米 | 南 | 精装 | 中楼层(共18层) | 2007年建 | 板楼', '2室1厅 | 89.5平米 | 南 北 | 精装 | 中楼层(共6层) | 1996年建 | 板楼', '2室2厅 | 92.15平米 | 南 北 | 简装 | 高楼层(共6层) | 2004年建 | 板楼', '2室1厅 | 59.5平米 | 南 | 精装 | 高楼层(共6层) | 1994年建 | 板楼', '2室1厅 | 61.06平米 | 南 | 精装 | 中楼层(共22层) | 1995年建 | 塔楼', '1室0厅 | 30.27平米 | 南 | 简装 | 高楼层(共6层) | 1983年建 | 板楼', '3室2厅 | 124.95平米 | 南 北 | 精装 | 中楼层(共18层) | 2002年建 | 板楼', '1室1厅 | 43.18平米 | 南 | 精装 | 高楼层(共6层) | 1989年建 | 板楼', '1室1厅 | 65.05平米 | 南 | 精装 | 中楼层(共21层) | 2006年建 | 板塔结合', '2室1厅 | 78.03平米 | 南 | 精装 | 低楼层(共18层) | 2013年建 | 板楼', '2室2厅 | 65.99平米 | 南 | 精装 | 中楼层(共6层) | 1997年建 | 板楼', '2室2厅 | 54.64平米 | 南 | 精装 | 高楼层(共6层) | 1995年建 | 板楼', '2室1厅 | 71.55平米 | 南 | 精装 | 高楼层(共6层) | 2006年建 | 板楼', '3室2厅 | 132.51平米 | 南 | 精装 | 低楼层(共6层) | 2000年建 | 板楼']
#用‘|’符号分隔
[i.text.split('|') for i in soup.findAll(name='div',attrs={'class':'houseInfo'})]
Out[30]:
[['2室1厅 ', ' 57.18平米 ', ' 南 ', ' 精装 ', ' 低楼层(共6层) ', ' 1988年建 ', ' 板楼'],
['3室2厅 ', ' 125.35平米 ', ' 南 北 ', ' 精装 ', ' 高楼层(共10层) ', ' 2002年建 ', ' 板楼'],
['2室1厅 ', ' 72.26平米 ', ' 南 ', ' 精装 ', ' 中楼层(共11层) ', ' 2009年建 ', ' 板楼'],
['1室1厅 ', ' 51.3平米 ', ' 南 ', ' 精装 ', ' 低楼层(共6层) ', ' 2009年建 ', ' 板楼'],
['2室2厅 ', ' 83.53平米 ', ' 南 北 ', ' 简装 ', ' 低楼层(共6层) ', ' 2014年建 ', ' 板楼'],
['2室2厅 ', ' 87.16平米 ', ' 南 ', ' 简装 ', ' 高楼层(共20层) ', ' 2011年建 ', ' 板楼'],
['2室1厅 ', ' 58.81平米 ', ' 南 北 ', ' 精装 ', ' 中楼层(共6层) ', ' 1994年建 ', ' 板楼'],
['4室2厅 ', ' 89.5平米 ', ' 南 ', ' 精装 ', ' 低楼层(共16层) ', ' 2009年建 ', ' 塔楼'],
['2室0厅 ', ' 59.31平米 ', ' 南 ', ' 简装 ', ' 高楼层(共7层) ', ' 1992年建 ', ' 板楼'],
['1室1厅 ', ' 61.39平米 ', ' 南 ', ' 精装 ', ' 高楼层(共6层) ', ' 1996年建 ', ' 板楼'],
['2室2厅 ', ' 80.34平米 ', ' 南 ', ' 精装 ', ' 低楼层(共18层) ', ' 2003年建 ', ' 板楼'],
['2室2厅 ', ' 89.79平米 ', ' 南 ', ' 精装 ', ' 中楼层(共22层) ', ' 2002年建 ', ' 塔楼'],
['1室1厅 ', ' 57.78平米 ', ' 南 ', ' 简装 ', ' 中楼层(共6层) ', ' 2002年建 ', ' 板楼'],
['3室2厅 ', ' 86.66平米 ', ' 南 ', ' 简装 ', ' 高楼层(共6层) ', ' 2006年建 ', ' 板楼'],
['2室1厅 ', ' 64.48平米 ', ' 南 ', ' 精装 ', ' 高楼层(共6层) ', ' 1995年建 ', ' 板楼'],
['3室2厅 ', ' 121.81平米 ', ' 南 ', ' 精装 ', ' 低楼层(共6层) ', ' 2003年建 ', ' 板楼'],
['2室2厅 ', ' 115.17平米 ', ' 南 ', ' 精装 ', ' 中楼层(共18层) ', ' 2007年建 ', ' 板楼'],
['2室1厅 ', ' 89.5平米 ', ' 南 北 ', ' 精装 ', ' 中楼层(共6层) ', ' 1996年建 ', ' 板楼'],
['2室2厅 ', ' 92.15平米 ', ' 南 北 ', ' 简装 ', ' 高楼层(共6层) ', ' 2004年建 ', ' 板楼'],
['2室1厅 ', ' 59.5平米 ', ' 南 ', ' 精装 ', ' 高楼层(共6层) ', ' 1994年建 ', ' 板楼'],
['2室1厅 ', ' 61.06平米 ', ' 南 ', ' 精装 ', ' 中楼层(共22层) ', ' 1995年建 ', ' 塔楼'],
['1室0厅 ', ' 30.27平米 ', ' 南 ', ' 简装 ', ' 高楼层(共6层) ', ' 1983年建 ', ' 板楼'],
['3室2厅 ', ' 124.95平米 ', ' 南 北 ', ' 精装 ', ' 中楼层(共18层) ', ' 2002年建 ', ' 板楼'],
['1室1厅 ', ' 43.18平米 ', ' 南 ', ' 精装 ', ' 高楼层(共6层) ', ' 1989年建 ', ' 板楼'],
['1室1厅 ', ' 65.05平米 ', ' 南 ', ' 精装 ', ' 中楼层(共21层) ', ' 2006年建 ', ' 板塔结合'],
['2室1厅 ', ' 78.03平米 ', ' 南 ', ' 精装 ', ' 低楼层(共18层) ', ' 2013年建 ', ' 板楼'],
['2室2厅 ', ' 65.99平米 ', ' 南 ', ' 精装 ', ' 中楼层(共6层) ', ' 1997年建 ', ' 板楼'],
['2室2厅 ', ' 54.64平米 ', ' 南 ', ' 精装 ', ' 高楼层(共6层) ', ' 1995年建 ', ' 板楼'],
['2室1厅 ', ' 71.55平米 ', ' 南 ', ' 精装 ', ' 高楼层(共6层) ', ' 2006年建 ', ' 板楼'],
['3室2厅 ', ' 132.51平米 ', ' 南 ', ' 精装 ', ' 低楼层(共6层) ', ' 2000年建 ', ' 板楼']]
In [48]:
#房间类型
house_type=[i.text.split('|')[0].strip() for i in soup.findAll(name='div',attrs={'class':'houseInfo'})]
#面积
huose_size=[i.text.split('|')[1].strip() for i in soup.findAll(name='div',attrs={'class':'houseInfo'})]
#朝向
house_direction=[i.text.split('|')[2].strip() for i in soup.findAll(name='div',attrs={'class':'houseInfo'})]
#装修
house_decoration=[i.text.split('|')[3].strip() for i in soup.findAll(name='div',attrs={'class':'houseInfo'})]
#楼层
house_floor=[i.text.split('|')[4].strip() for i in soup.findAll(name='div',attrs={'class':'houseInfo'})]
#建造年份
house_year=[i.text.split('|')[5].strip() for i in soup.findAll(name='div',attrs={'class':'houseInfo'})]
#单价
house_price=[i.text.strip() for i in soup.findAll(name='div',attrs={'class':'unitPrice'})]
#总价
total_price=[i.text.strip() for i in soup.findAll(name='div',attrs={'class':'totalPrice'})]
In [49]:
pd.DataFrame({'house_area':house_area,'house_type':house_type,'huose_size':huose_size,'house_direction':house_direction,'house_decoration':house_decoration,'house_floor':house_floor,'house_year':house_year,'house_price':house_price,'total_price':total_price})
Out[49]:

上海某地区的二手房房价信息就这样爬取到了,是不是很简单呢?