下面是正文
近年来,持续高昂的房价将很多想要安身立命的人挡在了买房的门槛之外。在外漂泊的人们,只能暂时转向租赁市场寻求居住场所。购房行为代替给租房市场带来了巨大的规模和效益。
M网站是深受用户欢迎的二手房、新房、租房网站,它为每一个城市提供大量的房源,拥有随时随地任性找房,IM匿名咨询、消息动态推送、服务承诺等服务功能。用户在自己的城市查找和在线查看自己想要的房源,为了更加直观的查看某个城市所有地区的房价信息,本项目基于NoSQL的强大并发性,对M网进行房源数据爬取,解析后存入MongoDB中,最后对这些数据进行城市租房信息的查询和聚合分析。
如何理解网络爬虫技术?他的主要工作就是跟据指定的URL地址去发送请求,获得响应,然后解析响应,一方面从响应中查找出想要查找的数据,另一方面从响应中解析出新的URL路径,然后继续访问,继续解析,继续查找需要的数据和继续解析出新的URL路径。这就是网络爬虫主要干的工作。下面是流程图:
通过上面的流程图能大概了解到网络爬虫干了哪些活,根据这些也就能设计出一个简单的网络爬虫出来。那么它所必需的功能如下:
1)发送请求和获取响应的功能
2)解析响应的功能
3)对过滤出的数据进行存储的功能
4)对解析出来的URL路径处理的功能
MongoDB是文档数据库,采用BSON的结构来存储数据。在文档中可嵌套其他文档类型,使得MongoDB具有很强的数据描述能力。本项目使用的数据为自己模拟的M网的租房信息,源数据来自于链家网站,所以首先要获取网页数据并解析出所需要的房源信息,然后将解析后的数据存储到MongoDB中,最后基于这些数据进行城市租房信息的查询和聚合分析等。
大致的实现步骤如下:
1)对所爬取的网页标签进行分析
2)使用python对网站进行网页数据爬取
3)解析所需要房源信息
4)一边解析所爬取的数据,一边存入MongoDB数据库中
5)使用python读取mongodb数据并进行可视化分析
本项目将会使用Python、pymongodb等编程技术,利用BeutifulSoup, 多进程/多线程multiprocessing, IP代理池, 正则表达式等方法对网站数据进行爬取并解析,最后通过MongoDB聚合管道技术对数据进行可视化处理。
PC、Linux、Web、ubuntu、MongoDB、python3、Dreamweaver CC 2019、Anaconda、Ubuntu18.04、Samba、putty
Urllib 和 Requests 模块是发起 http 请求最常见的模块。
虽然 Python 的标准库中 urllib 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称“http for Humans”,说明使用更简洁方便,Requests是使用Apache2 licensed 许可证的HTTP库。
Requests继承了urllib的所有特性。Requests支持http连接保持和连接池,支持使用cookie 保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作。
Requests 的文档非常完备,中文文档也相当不错。Requests 能完全满足当前网络的需求,Requests会自动实现持久连接keep-alive。
MongoDB是一个面向文档的,开源数据库程序,它平台无关。MongoDB像其他一些NoSQL数据库(但不是全部!)使用JSON结构的文档存储数据。这是使得数据非常灵活,不需要的Schema。
其一些比较重要的特点是:
1)支持多种标准查询类型,比如matching()、comparison ( )或者正则表达式;
2)可以存储几乎任何类型的数据,无论是结构化,部分结构化,甚至是多态;作为基于文档的数据库意味着您可以在单个文档中存储有关您的模型的所有信息;
3)要扩展和处理更多查询,只需添加更多的机器;它是高度灵活和敏捷,让您能够快速开发应用程序;
4)许多关系型数据库的功能也可以在MongoDB使用(如索引)。
5)在运行方面,MongoDB中有相当多的功能在其他数据库中是没有的;无论您需要独立服务器还是完整的独立服务器集群,MongoDB都可以根据需要进行扩展
6)MongoDB还通过在各个分片上自动移动数据来提供负载均衡支持;
7)它具有自动故障转移支持,如果主服务器Down掉,新的主服务器将自动启动并运行;
8)MongoDB的管理服务(MMS)可以用于监控和备份MongoDB的基础设施服务;
9)不像关系数据库,由于内存映射文件,你将节省相当多的RAM。
虽然起初MongoDB似乎是解决我们许多问题的数据库,但它不是没有缺点的。MongoDB的一个常见缺点是缺少对ACID事务的支持,MongoDB在特定场景下支持ACID事务,但不是在所有情况。在单文档级别,支持ACID事务(这是大多数事务发生的地方)。但是,由于MongoDB的分布式性质,不支持处理多个文档的事
BeautifulSoup灵活又方便的网页解析库,处理高效,支持多种解析器。利用它不用编写正则表达式就可以方便实现网页信息的提取。Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐安装。Python版本的标准库中内置了HTML的解析器,但是解析方法不稳定,所以最好使用lxml解析器。
python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。
Python提供了multiprocessing。 multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。
multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,>提供了Process、Queue、Pipe、Lock等组件。
需要再次强调的一点是:与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内。
在spyder上新建python项目,命名为“NoSQL_BigWork”
首先需要对所爬取的网页进行数据格式分析,才能更好的爬取所需要的数据,下图是M网的样式
根据上图所示,我们需要的数据有地区名、房子平米数、每个区域的楼盘个数、房源价格和主题等信息,通过网页检查可以看到相关的网页标签,如下图:
从检查中,可以知道,所有的房源数据都在一个ul标签里面,属性是“class=resblock-list-wrapper”,那么接着往下可以找到要想获取楼盘区域,需要获取ul下li里面的a标签内容。如下:
同理,我们可以找到其他所需要的房源信息所在的标签,这样就可以通过相关代码爬取所需要的信息了。
1)导库
2)定义获取某区域的所有数据
3)获取小区页数
4) 获取详细的房屋信息
网页解析出的源数据需存入MongoDB文档中,可使用单条插入的方式,也可以使用批量插入的方式。使用的函数均为insert()。
使用requests库的get方法获取网页内容,第一个参数为爬取的网页地址,第二个参数为get请求的头header。Get方法返回的是html格式的网页内容,使用lxml库对html网页格式化。
获取网页上具体字段信息时使用xpath函数解析html标签,如获取某城市所有的区域信息:
在获取房源详细信息后,需要设计存入mongodb数据库中的格式,如下:
id由系统自动生成,所在区域area、小区名称title、住房类型type等为字符串形式,价格为浮点数。
Python连接数据库需要使用到pymongdb库,连接数据库和创建集合让所爬取数据存储,使用MongoClient类创建连接数据库对象client,本案例使用本地数据库localhost:27017。get_database方法连接数据库,参数house为数据库名,get_collection方法连接集合,参数house_datas为集合名称,如果不存在此数据库和集合则新建。本例中爬取城市广州的租房信息,集合名称为“house_datas”。
1)对地区分组计算平均房价和最高房价
2)设置match和group分组聚合管道得到城市每个区住房的房价信息
3)设置match和group分组聚合管道得到城市某区各街道住房的房价信息
4)进行聚合计算操作
基于聚合计算统计地区平均房价
部分数据
大致的步骤就不写这么详细了,大致页面如下(哈哈哈哈哈,我的网站还是挺逼真的):
有登录注册、点我联系等功能。
项目完整下载地址:https://download.csdn.net/download/weixin_44857413/33676504
下载后有问题可以联系我,看到会解决~
此项目为自己的课程设计作业,这里很多涉及隐私就不在这里展示了,因为电脑要清理内存,怕一不小心清掉了,就在这里留点痕迹吧!