Python数据采集和分析告诉你为何上海的二手房你都买不起!(一)

浏览: 6743

1.前言

本人是个学生党,在过两年就要研究生毕业了,面临着找工作,相信很多人也面临或者经历过工作,定居租房买房之类的

在此,我们来采集一下上海在售的二手房信息,有人想问,为啥不采集新房?快醒醒吧,新房可远观而不可亵玩焉,一般人都买不起,看的只会心情不好,hhhh

Clipboard Image.png

当然,二手房估计你也买不起!咱们拿数据说话!


2.观察网站结构

以本人所在的城市上海为例,走在上海的大街小巷,你会看到很多做房产中介的,最常见的就是链家了~

我们进一下链家的上海二手房页面:http://sh.lianjia.com/ershoufang/?utm_source=360&utm_medium=cpp&utm_term=链家二手房交易&utm_content=链家二手房&utm_campaign=品牌词

Clipboard Image.png


有81508套二手房源在出售,这么多!

Clipboard Image.png


3.寻找需要爬取信息

Clipboard Image.png

感觉这些红色框的我都想要,但是感觉还是不够全面,我们点击进去看看详细信息。

Clipboard Image.pngClipboard Image.png


这里面的信息挺全的,当然,我根据需要的数据(可能之后分析需要用到)来选择爬取的数据


分析网页结构在我之前的文章里有写到,就不赘述了

传送门:

Python网络爬虫爬取智联招聘职位:https://ask.hellobi.com/blog/wangdawei/6710

爬取起点中文网月票榜前500名网络小说介绍:https://ask.hellobi.com/blog/wangdawei/7285

4.撰写爬虫

#主要程序
import requests
import re
from bs4 import BeautifulSoup
from fake_useragent import UserAgent

ua=UserAgent()#使用随机header,模拟人类
headers1={'User-Agent': 'ua.random'}#使用随机header,模拟人类
houseary=[]#建立空列表放房屋信息
domain='http://sh.lianjia.com'#为了之后拼接子域名爬取详细信息
for i in range(1,400):#爬取399页,想爬多少页直接修改替换掉400,不要超过总页数就好
res=requests.get('http://sh.lianjia.com/ershoufang/d'+str(i),headers=headers1)#爬取拼接域名
soup = BeautifulSoup(res.text,'html.parser')#使用html筛选器
#print(soup)
for j in range(0,29):#网站每页呈现30条数据,循环爬取
url1=soup.select('.prop-title a')[j]['href']#选中class=prop-title下的a标签里的第j个元素的href子域名内容
url=domain+url1#构造子域名
houseary.append(gethousedetail1(url,soup,j))#传入自编函数需要的参数
def gethousedetail1(url,soup,j):#定义函数,目标获得子域名里的房屋详细信息
info={}#构造字典,作为之后的返回内容
s=soup.select('.info-col a')[1+3*j]#通过传入的j获取所在区的内容
pat='<a.*?>(.*?)</a>'#构造提取正则
info['所在区']=''.join(list(re.compile(pat).findall(str(s))))#使用join将提取的列表转为字符串
s1=soup.select('.info-col a')[0+3*j]#[0].text.strip()
pat1='<span.*?>(.*?)</span>'
info['具体地点']=''.join(list(re.compile(pat1).findall(str(s1))))
s2=soup.select('.info-col a')[2+3*j]#[0].text.strip()
pat2='<a.*?>(.*?)</a>'
info['位置']=''.join(list(re.compile(pat2).findall(str(s2))))
q=requests.get(url)#使用子域名
soup=BeautifulSoup(q.text,'html.parser')#提取子域名内容,即页面详细信息
for dd in soup.select('.content li'):#提取class=content标签下的li标签房屋信息
a=dd.get_text(strip=True)#推荐的去空格方法,比strip()好用
if ':' in a:#要有冒号的,用中文的冒号,因为网页中是中文
key,value=a.split(':')#根据冒号切分出键和值
info[key]=value
info['总价']=soup.select('.bold')[0].text.strip()#提取总价信息
return info#传回这一个页面的详细信息

写了详细注释,相信萌萌的你可以看懂~

Clipboard Image.png

我们来看一下爬的结果:

houseary#看一下列表信息

Clipboard Image.png

就是将每次爬取的信息做成dict依次添加在list中

接下来使用pandas神器~

import pandas#pandas大法好
df=pandas.DataFrame(houseary)
df

Clipboard Image.png


Clipboard Image.png


考虑到主程序写了双重for循环,函数里写了循环,所以时间复杂度是O(n^3),对于一个算法,一般是不可以接受的,好吧,萌萌的我只能接受,如果你问我为什么,我只能说,我写不出低复杂度的了。。。爬了这1w+条数据用了我1小时时间。。。各位dalao如果有方法可以指点一下,之后我想学习多线程提高爬取速度~

Clipboard Image.png


最后存到本地excel文件中

df.to_excel('house_lianjia.xlsx')

Clipboard Image.png


5.结语

看到这价格是不是有句mmp想说

Clipboard Image.png


之后会写一篇《Python数据采集和分析告诉你为何上海的二手房你都买不起!(二)》的数据分析和可视化的文章深入分析一下这次抓到的数据~敬请期待,么么哒

Clipboard Image.png


对爬虫有兴趣的小伙伴可以加我微信号:lezi10121643,记得加好友备注来自天善智能~

下次见~喜欢你就点个赞呗

Clipboard Image.png

推荐 15
本文由 ID王大伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

12 个评论

哈哈哈,其实200万是很轻松买的起的啊,200万首付3成60万,组合贷140万一个月才换8110,假设夫妻都是1万月薪,8%公积金,可支配收入18200,换了贷还有10000收入,住三年以后想生宝宝了把房子卖掉,首付就有了。借的钱也换了。然而现在不能这么操作因为限购了,哈哈哈。所以你会发现所谓的限购政策绝对是在保护房价不是在降房价。哈哈哈
陈老师的分析很棒,涨姿势了 0.0
期待下一篇文章
这周会更新的~谢谢支持
我用jupyer notebook运行你的代码 发现少了UserAgent module 请问如何增加module python萌新求教
pip install 一下
博主,有完整的代码没? 用例子里的代码 爬下来少好多信息呢,例如 建筑面积,户型,等等字段都没有 ,而且 价格也获取不到了

位置 具体地点 总价 所在区
0 西郊 虹延小区 确认我的手机号: 长宁
1 新华路 淮海世纪花苑 确认我的手机号: 长宁
2 黄兴公园 双花公寓 确认我的手机号: 杨浦
3 中山公园 金谷苑 确认我的手机号: 长宁
4 大宁 新梅共和城 确认我的手机号: 闸北
5 老西门 南文大厦 确认我的手机号: 黄浦
6 曲阳 大二小区 确认我的手机号: 虹口
因为网页结构改变了 你需要重新定位
url1 = soup.select('.prop-title a')[j]['href']
这段执行时报错,IndexError: list index out of range
这是怎么回事呢?
网页现在结构可能变了 你这个是没取到内容 建议分析网页结构 多用print看看是否定位到要的内容
url1 = soup.select('.prop-title a')[j]['href']
这段执行时报错,IndexError: list index out of range
这是怎么回事呢?
这说明列表是空的 所以取东西抛出异常(越界) 一般是网页结构改变 一步步print一下 看看提取到的内容

要回复文章请先登录注册