最近在学习用Python进行数据分析、机器学习,基本都是用现成数据集进行模型训练及验证,想用一些实际数据看一下效果,于是想到用Python尝试抓取一些实际数据。
目标:爬取链家网北京二手房房价、位置、面积等数据
环境:Python3.5.2,Anaconda4.2.0

1.准备工作

首先,导入所需要的库,主要有urllib.request、BeautifulSoup、Pandas、Numpy、re。

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import re
  • urllib.request:打开和浏览url中内容。具体用法参见:https://docs.python.org/3/library/urllib.request.html#module-urllib.request
  • BeautifulSoup:将html解析为对象进行处理,全部页面转变为字典或者数组,相对于正则表达式的方式,可以大大简化处理过程。具体用法参见:https://www.crummy.com/software/BeautifulSoup/bs4/doc/
  • Pandas: Pandas 是python的一个数据分析包,提供了大量能使我们快速便捷地处理数据的函数和方法。 具体用法参见:https://pandas.pydata.org/
  • Numpy:Numpy支持高级大量的维度数组与矩阵运算,针对数组运算提供大量的数学函数库。 具体用法参见:https://www.numpy.org/
  • re:re是pyhton中实现正则表达式匹配操作的模块。具体用法参见:https://docs.python.org/3.5/library/re.html

2.抓取数据

首先,了解一下目标网站的URL结构,例如 https://bj.lianjia.com/ershoufang/dongcheng/pg2/

  • bj表示城市,北京
  • ershoufang是频道名称,二手房
  • dongcheng是城区名称,东城区
  • pg2是页面码,第二页

例如,我们要抓取北京各个区二手房频道,所以前面城市、频道名称不会变,属于固定部分;后面的城区要遍历北京各个区(东城、西城、朝阳…),页码需要在1-所选城区总页数间变化,属于可变部分。将URL分为两部分,前面的固定部分赋值给url,后面的可变部分用双层for循环遍历,外层循环遍历城区,内层循环遍历所选城区的页面。其中,需要获取所选城区包含的总页数,提取div标签中class=page-box fr的第一个子标签属性page-data的值。

chengqu={'dongcheng':'东城区','xicheng':'西城区','chaoyang':'朝阳区','haidian':'海淀区','fengtai':'丰台区','shijingshan':'石景山区', 'tongzhou':'通州区','changping':'昌平区','daxing':'大兴区','shunyi':'顺义区','fangshan':'房山区'}
for cq in chengqu.keys():url='https://bj.lianjia.com/ershoufang/'+cq+'/'   #组成所选城区的URLhtml=urlopen(url)bsObj=BeautifulSoup(html)  #解析抓取的页面内容total_page=re.sub('\D','',bsObj.find('div','page-box fr').contents[0].attrs['page-data'])[:-1]  #获取所选城区总页数print ('total_page',total_page)for j in np.arange(1,int(total_page)+1):page_url=url+'pg'+str(j)  #组成所选城区页面的URL

然后,使用BeautifulSoup对页面进行解析。

 page_html=urlopen(page_url)page_bsObj=BeautifulSoup(page_html)

接着,提取页面中的关键信息进行提取,主要对房屋信息、房屋位置、总价和单价进行提取。

依次把页面div标签中class为houseInfo、positionInfo、totalPrice、unitPrice的部分提取出来,用get_text()获取对应标签中的信息,其中houseInfo、positionInfo包含房屋的多种属性,用split()对其进行分列,只选取了houseInfo包含6个属性且positionInfo包含3个属性的数据。另外,对于单价用get_text()后得到“单价100748元/平米”,包含了文本和数字,用re.sub()正则匹配出数字部分。最后,依次把提取到的信息添加到对应列表中。

info=bsObj.findAll("div",{"class":"houseInfo"})
position_info=bsObj.findAll("div",{"class":"positionInfo"})
totalprice=bsObj.findAll("div",{"class":"totalPrice"})
unitprice=bsObj.findAll("div",{"class":"unitPrice"})house_loc=[]  #房屋所在小区house_type=[] #房屋户型house_area=[] #房屋面积house_direction=[] #房屋朝向house_decorating=[] #房屋装修house_lift=[] #有无电梯house_floor=[] #房屋楼层house_year=[] #建造年份house_position=[] #房屋位置t_price=[] #房屋总价u_price=[] #房屋单价for i_info,i_pinfo,i_tp,i_up in zip(info,position_info,totalprice,unitprice):if len(i_info.get_text().split('/'))==6 and len(i_pinfo.get_text().split('/'))==3:#分列houseinfo并依次获取房屋所在小区、户型、面积、朝向、装修、有无电梯各字段house_loc.append(i_info.get_text().split('/')[0])house_type.append(i_info.get_text().split('/')[1])house_area.append(i_info.get_text().split('/')[2][:-2])house_direction.append(i_info.get_text().split('/')[3].replace(' ',''))house_decorating.append(i_info.get_text().split('/')[4])house_lift.append(i_info.get_text().split('/')[5])#分列positioninfo并依次获房屋楼层、建造年份、位置各字段house_floor.append(i_pinfo.get_text().split('/')[0])house_year.append(i_pinfo.get_text().split('/')[1][:5])house_position.append(i_pinfo.get_text().split('/')[2])#获取房屋总价和单价t_price.append(i_tp.span.string)u_price.append(re.sub('\D','',i_up.get_text()))

将提取的数据导入pandas之中生成数据表。

#将数据导入pandas之中生成数据表house_data=pd.DataFrame()house_data[u'城区']=[chengqu[cq]]*len(house_loc)house_data[u'小区名称']=house_lochouse_data[u'房型']=house_typehouse_data[u'面积']=house_areahouse_data[u'朝向']=house_directionhouse_data[u'装修']=house_decoratinghouse_data[u'有无电梯']=house_lifthouse_data[u'楼层']=house_floorhouse_data[u'建造年份']=house_yearhouse_data[u'位置']=house_positionhouse_data[u'总价']=t_pricehouse_data[u'单价']=u_priceprint (house_data)

将数据存入到csv中,便于后续分析。

house_data.to_csv('house_bj.csv', mode='a', header=False,encoding='gb2312',index=None)

总共提取到北京11个区28560条二手房信息。

最后,附上完整代码~~

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import rechengqu={'dongcheng':'东城区','xicheng':'西城区','chaoyang':'朝阳区','haidian':'海淀区','fengtai':'丰台区','shijingshan':'石景山区','tongzhou':'通州区','changping':'昌平区','daxing':'大兴区','shunyi':'顺义区','fangshan':'房山区'}
for cq in chengqu.keys():url='https://bj.lianjia.com/ershoufang/'+cq+'/'   #组成所选城区的URLhtml=urlopen(url)bsObj=BeautifulSoup(html)total_page=re.sub('\D','',bsObj.find('div','page-box fr').contents[0].attrs['page-data'])[:-1]  #获取所选城区总页数print ('total_page',total_page)for j in np.arange(1,int(total_page)+1):page_url=url+'pg'+str(j)  #组成所选城区页面的URL#print (page_url)page_html=urlopen(page_url)page_bsObj=BeautifulSoup(page_html)info=bsObj.findAll("div",{"class":"houseInfo"})position_info=bsObj.findAll("div",{"class":"positionInfo"})totalprice=bsObj.findAll("div",{"class":"totalPrice"})unitprice=bsObj.findAll("div",{"class":"unitPrice"})house_loc=[]  #房屋所在小区house_type=[] #房屋户型house_area=[] #房屋面积house_direction=[] #房屋朝向house_decorating=[] #房屋装修house_lift=[] #有无电梯house_floor=[] #房屋楼层house_year=[] #建造年份house_position=[] #房屋位置t_price=[] #房屋总价u_price=[] #房屋单价for i_info,i_pinfo,i_tp,i_up in zip(info,position_info,totalprice,unitprice):if len(i_info.get_text().split('/'))==6 and len(i_pinfo.get_text().split('/'))==3:#分列houseinfo并依次获取房屋所在小区、户型、面积、朝向、装修、有无电梯各字段house_loc.append(i_info.get_text().split('/')[0])house_type.append(i_info.get_text().split('/')[1])house_area.append(i_info.get_text().split('/')[2][:-2])house_direction.append(i_info.get_text().split('/')[3].replace(' ',''))house_decorating.append(i_info.get_text().split('/')[4])house_lift.append(i_info.get_text().split('/')[5])#分列positioninfo并依次获房屋楼层、建造年份、位置各字段house_floor.append(i_pinfo.get_text().split('/')[0])house_year.append(i_pinfo.get_text().split('/')[1][:5])house_position.append(i_pinfo.get_text().split('/')[2])#获取房屋总价和单价t_price.append(i_tp.span.string)u_price.append(re.sub('\D','',i_up.get_text()))#将数据导入pandas之中生成数据表house_data=pd.DataFrame()house_data[u'城区']=[chengqu[cq]]*len(house_loc)house_data[u'小区名称']=house_lochouse_data[u'房型']=house_typehouse_data[u'面积']=house_areahouse_data[u'朝向']=house_directionhouse_data[u'装修']=house_decoratinghouse_data[u'有无电梯']=house_lifthouse_data[u'楼层']=house_floorhouse_data[u'建造年份']=house_yearhouse_data[u'位置']=house_positionhouse_data[u'总价']=t_pricehouse_data[u'单价']=u_price#print (house_data)#将数据存入到csv中,便于后续分析house_data.to_csv('house_bj.csv', mode='a', header=False,encoding='gb2312',index=None)

学习python抓取数据——链家北京二手房数据相关推荐

  1. 用Python爬取2020链家杭州二手房数据

    起源于数据挖掘课程设计的需求,参考着17年这位老兄写的代码:https://blog.csdn.net/sinat_36772813/article/details/73497956?utm_medi ...

  2. python数据分析项目实战—————链家北京租房数据统计分析

    链家北京租房数据分析 1.读取数据 import pandas as pd import matplotlib.pyplot as plt import numpy as npdata_dframe ...

  3. python爬取二手房信息_刚刚接触PythonR?教你爬取分析赶集网北京二手房数据(附详细代码)...

    原标题:刚刚接触Python&R?教你爬取分析赶集网北京二手房数据(附详细代码) 源 /数据森麟文 /徐涛 前言: 本文主要分为两部分:Python爬取赶集网北京二手房数据&R对爬取的 ...

  4. PythonR爬取分析赶集网北京二手房数据(附详细代码)

    本文转载自数据森麟(ID:shujusenlin) 作者介绍:徐涛,19年应届毕业生,专注于珊瑚礁研究,喜欢用R各种清洗数据. 知乎:parkson 如何挑战百万年薪的人工智能! https://ed ...

  5. Python中使用Scrapy爬虫抓取上海链家房价信息

    文章目录 前言 准备工作 创建一个新的Scrapy项目 定义一个爬虫Spider 导出抓取数据 保存数据到数据库(MongoDB) 前言 之前用python写了一个简单的爬虫项目用来抓取上海链家上的一 ...

  6. 爬虫实战-链家北京房租数据

    爬虫实战-链家北京房租数据 本篇是对 恋习Python 发布的原创文章<北京房租大涨?6个维度,数万条数据帮你揭穿>中涉及的代码部分的解读. < 在复现原文代码时,出现了一些报错,在 ...

  7. Python抓取网页中的动态序列化数据

    Python抓取网页中的动态序列化数据 动态序列化数据经常应用于前后端分离的页面.或者通过VUE.JS等HTML页面环境,常规的爬虫抓取方法并不能满足数据采集的要求,因此需要其他的方式进行数据的采集. ...

  8. python爬取饿了么数据_阿里95亿美元拿下饿了么,我用python抓取了饿了么外卖数据信息...

    今天收到一个消息,阿里95亿美元拿下饿了么.阿里巴巴已经签订收购协议,联合蚂蚁金服用95亿美元兑饿了么全资收购.现在我用Python抓取饿了么的外卖数据. ■1.环境介绍: win10 64bit p ...

  9. 爬取链家网二手房数据并保存到mongodb中

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 爬取链家网二手房数据并保存到mongodb中 文章目录 前言 一.爬虫的介绍 二.协程的介绍 三.css选择器 四.基于asyncio ...

最新文章

  1. 【正一专栏】警察叔叔,我还是只是一个婴儿
  2. 在已安装win10环境中利用EasyBCD引导安装Ubuntu18.04(亲自测试,都是血和泪)
  3. Randomized Cuts for 3D Mesh Analysis (SIGGRAPH Asia 08)
  4. 【比赛经验】ALL in BERT:一套操作冲进排行榜首页
  5. 用户名_网络安全与防御-OpenSSH用户名枚举及其检测方法
  6. 例3.4 二叉树遍历 - 九度教程第32题(二叉树)
  7. 网络工具之PacketTracer8安装
  8. mysql 闰年,[MySQL]--gt;查询5天之内过生日的同事中的闰年2月
  9. 链表-链表中环的入口结点
  10. [Linux] WIN7下Virtualbox虚拟Ubuntu共享文件夹设置
  11. bufg和bufgp_Xilinx FPGA全局时钟和第二全局时钟资源的使用方法(转)
  12. SpringBoot+MyBatis(动态数据源/分布式事务XA(Atomikos))
  13. 浅谈鸽巢原理的证明和简单应用
  14. 酷!一个仿漫画手绘风格的 Python 图表库
  15. 2,理解Verilog的四值逻辑
  16. OC6700B内置60V功率MOS升压型LED恒流驱动器
  17. 140斤减脂到90斤需要多久?
  18. 等保备案预约平台使用指南
  19. npm run serve 报“npm ERR! enoent ENOENT: no such file or directory, open ‘C:\Users\XXX\web_page“ 错误
  20. C++软件开发面试题总结

热门文章

  1. python 模拟浏览器selenium 要求快速_Selenium模拟浏览器初识
  2. 《知识就是力量》第三期——“怎样做一个不冲动的人”笔记
  3. 购物网站首页(类淘宝)
  4. 康奈尔大学做笔记的方法 学习工作效率提高100%
  5. 合作升级|Kyligence 跬智智能分析平台入选华为云联营商品
  6. 图算法之节点分类Node Classification
  7. 全国三级联动----省市县 原生js前端
  8. Handler源码翻译
  9. 制作美观的学术型 Beamer 幻灯片
  10. 【Python】前置:基础知识速览