基于python爬虫的房价数据可视化分析

本文首先介绍了开发的背景,意义和现在处于的状况,然后介绍了系统设计的相关的技术,然后爬取目标网站的房价数据,这个工作可以通过计算机爬虫技术来完成。对于spider自身来说,本文运用了一款基于python的网络爬虫框架,它的名字叫做scrapy,通过scrapy中的5大组件进行整个项目的构建,主要在spider中写出对应链家网站中url的逻辑及利用xpath及css选择器进行解析,在items中主要构建了提取的内容,在通道中完成了与本机的mysql的连接。最后,通过pymysql连接python环境与mysql环境进行数据分析,利用matplotlib中的pyplot中的方法进行两个数据的可视化,分别是链家对租房在北京地区的分布情况,以及链家对北京各地区的租房价格预测。

关键词网络爬虫;scrapy;链家;数据分析;可视化

Abstract

Recently, with the rise of artificial intelligence and the continuous development of technology and innovation, Internet technology has gradually penetrated all kinds of big data into people's daily lives with its extremely fast speed and suitable human needs. Massive Internet big data can unearth its unparalleled huge value wealth, how to collect the data people need, manual crawling for non-computer personnel is undoubtedly unacceptable, inefficient, not easy to handle. Based on this, the design and implementation of a data acquisition system based on scrapy-based crawler framework was explored to improve the overall efficiency of data collection, reduce the difficulty of implementing the requirements, and facilitate the viewing of the required personnel.

This article first introduces the background of the development, the meaning and the current situation, then introduces the relevant technology of the system design, and then climbs the price data of the target website. This work can be done by computer crawling technology. For the spider itself, I used a python-based web crawler framework, which is called scrapy. This is one of the key research contents of this article. Data crawling mainly uses crawler framework and data access. The main application is the Mysql relational database. Scrapy is a web application framework designed to crawl the data of a website, extract structured or unstructured data, and can be applied to a series of steps such as accessing data, data mining, and information processing.

Finally, through the data processing library for data processing, the final research results are obtained.

Keywords: web crawler; scrapy; chain home; data analysis;visualization

前 言

当今的时代,大数据的技术渗透在我们生活的各个领域,医疗,教育,出行等等。但是数据的获取问题更是一大难题,法律的边缘性,获取的准确性,数据的真实性,获取所耗费的财力,数据之后的处理,以及将数据中的潜在价值应用在实际生活中。而scrapy框架就是来处理爬取网站时遇到的问题,它可以支持日志化,分布式,以及强大的自带的xpath结构化的筛选器,还有可以自定义的中间件系统,可以更高效的爬取,存储数据。本文就是利用scrapy框架来处理链家网站来获取数据及完成数据分析。

1 绪论

1.1 课题研究背景

随着大数据时代的发展以及中国政策主要趋向于人工智能时代,信息革命的逐渐兴起,互联网技术逐渐普及到了人们的日常生活之中,人们从大数据时代中受到的益处有很多,影响着人类社会的不断前进和发展。人类的生活方式每隔几年就会产生出巨大的变化。比如说人们获取信息的方式不是仅限于报纸,书刊,广播,现在大多数人获取都是通过手机中的各种app比如微博,头条新闻,百度传统媒体的流量随着时代的发展,信息的不断进步越来越少了,大多数的流量都被互联网技术绑定了,互联网中的数据类型异常的丰富,需求者通过各种搜索引擎来获取信息是效率极其低下的而且获取的结构划分难度较大。网络爬虫技术就是用来提高效率来获取整理出在互联网中各种数据的有时效性的一种手段,能够完成用户的需求,提高效率并且准确的提供给需求者所需要的数据信息。

数据的挖掘和分析是是数据时代最重要的两个环节,数以亿万级的互联网数据通过上述的两种应用技术可以从数据之中获得巨大的价值财富,为个体进行更好的决策性判断,为事业单位及起来提供更全面更可靠地数据信息的支持,以便商业的决策和用人的单位的管理。总而言之,大数据时代影响了所有的行业,包括服务行业,传统行业等等。大数据时代的到来使散落在互联网上海量的数据迸发出巨大的价值财富。大数据的能量是预测不了真正的上限在教育行业中,通过此前的数据进行数据分析及数据挖掘,对每一个孩子都进行最适合他自己的教育体系和教育方式,可以让一个孩子在教育上获取教育资源效率更高。互联网中的数据信息可以被我们比较成一个巨大的非结构化的数据库,而如何从这个海量的数据库中高效准确地找到我们想要的信息也显得越来越重要了,基于这样的背景,搜索引擎技术横空出世。搜索引擎给网民带来了极大的便利,通过一些关键字就能找到与之相关的信息,换言之,搜索引擎也给更多的网站提供了向大众展示它们自己的机会。

1.2 国内外爬虫技术概况

数据采集系统负责从目标网站上收集对应数据,首先通过访问网页,然后通过常见的抓包工具来定位数据元素,经过相应技术进行数据抓取,数据去重,数据的存储,最终将所需求的数据保存到对应的容器中。社会中各行各业都可以通过网络爬虫技术来抓取对应行业需求的数据,通过数据挖掘和数据分析,来为原行业提供数据信息支持,用来更加便捷做出对应的商业中的决策以及企业单位的管理工作。互联网上数以亿万级的数据源,同时会出现对应的问题,比如说很多网站中很出现数据数据重复的问题,这样在对应网络爬虫运行的时候会出现浪费大量的时间进行重复内容的操作,大幅度降低项目的效率。基于此,如何能够使得网络爬虫可以高效地、准确的抓取的需求的互联网数据成为了一个热门的研究领域,并且随之产生很多优秀的网络爬虫系统。

目前,国外设计出了很多的网络爬虫系统,主要由 Ubi Crawler、Mercator、Nutch 和GoogleCrawler ,这些网络爬虫系统都具有自己独特的一面,在数据采集方面都有着很高的效率和准确率。下面,将对以上几种网络爬虫系统做简单的介绍[1]。谷歌的搜索引擎网络爬虫使用的是分布式的网络爬虫系统,采用多台服务器并行访问网页,抓取数据,系统由多台并行的爬虫主机和一台中央主机组成[4]。中央主机首先访问请求的 Url,然后将请求得到的网页分发给下面并行的主机,来对网页数据进行定位和抓取。各个爬虫主机在完成网页数据的抓取之后,将抓取到的数据做成定义的规格,发送给索引进程使用。索引进程负责管理存储在数据库的网页 Url 和已经抓取到的网页数据,Url 解释器进程负责解析网页 Url。解释器进程是将刚刚抓取到的网页 Url 保存到本地,并且发送给中央主机,

由中央主机读取。谷歌搜索引擎中的网络爬虫系统采用这种循环的方式,将中央主机和多台爬虫主机配合使用,不断的从互联网抓取需求的数据

软件开发者从事爬虫相关的开发工作可以追随到上世纪 90 年代。除此之外,在各种编程语言中,python是现在时代最流行的语言,可以很容易地基于python语言来编写一个爬虫项目。

1.3 网络爬虫技术发展现状

1.3.1网络通用爬虫

通用网络爬虫(General Purpose Web Crawler)称之为全站爬虫(Scalable Web Crawler),在互联网中利用爬虫进行爬取信息而被用于搜索引擎建立提供对应的技术支持,通用爬虫决定了信息的实时性,这个性能会影响到整个引擎的效果

(1)深度优先策略(Depth first strategy):

这种策略是在互联网初始使用非常多的一种策略。这种策略的最终目的是要达到是一直搜索到由站点分布抽象出来的树的叶子节点。一个网页文件中,爬虫取的网页中的第一个链接后,就对该链接所指向的网页文件执行深度优先搜索策略,也就是说在搜索当前页面的其他的链结结果之前,必须先搜索出一条路径使其形成一条独立的完整的链[5]。形象点说深度优先搜索策略就是沿着该网页解析出的HTML文件的一个链接转接到另一个链接从而由链接组成的链接网络一直走到不能更加深入为止,然后返回到之前所在的某一个网页文件中,再继续选择该网页文件中的下一个不重复的链接,重复上述动作。当初始网页中不再存在其他链接可供选择时,说明此次搜索已经结束。但如果所需爬取网页节点结构比较深时的时候,该策略会引起较大的资源浪费,爬取效率也不太高。

(2)广度优先策略(Breadth first strategy):

简称BFS,又称之为宽度优先搜索策略,或横向优先搜索策略,作为一种图形搜索算法提出来,其思想亦可用于网络爬虫的设计。先爬取浅层次的链接,将处于同一层次的所有网页处理完成之后再向下一个层次继续爬取[6]。广度优先策略可以以并发的方式进行爬取,由于程序并发会提高程序的工作效率,所以这种特性在一定程度上可以提高爬虫的爬取效率。

利用通用爬虫策略比如谷歌公司的爬虫算法会遍历所有的网页进行爬取,利用分布式进行整个爬虫系统的并发度,期间还使用了包括PageRank算法在内的众多提升系统运行效率的算法来优化Google crawl爬虫的爬取性能[7]

1.3.2网络增量爬虫

增量网络爬虫(Incremental Web Crawler)是一种根据不同同一网站上不同页面更新的频率的不同来对应不同的策略的爬取策略,是一种对已经爬取过的页面在数据存储中采取增量式的更新的策略,也就是说这种爬虫策略只会爬取当前新出现页面的数据和页面产生更新的数据[8]。增量更新的策略相对于优先策略来说其不会出现大量重复爬取页面的情况,避免不能充分利用硬件或网络等资源,最终导致整个系统使用效率低下的情况的发生。

1.4 研究中可能遇到的关键问题

(1)链家网站可能会有反爬机制,比如说房价的各种信息进行js加密,css封装加密,json值传输,封锁ip,访问频数过快暂停访问的各种反爬措施是能够持续执行的关键。

(2)根据所需求的房价的类别问题,分析出url中值的不同来判断是什么类型的房价,并根据scrapy的指纹函数来实现去重,提高爬虫效率。

1.5 本章小结

本章介绍了课题研究的网络爬虫的背景,以及具体的研究意义。在现在网络发展中,主要有两种不同的爬虫类型,分别为网络通用爬虫和网络增量爬虫。对于本篇文章来说,为了实现项目主要功能,进行了在编程之前的预测本次实验过程中可能遇到的链家网站具体的反爬措施,比如基于用户行为的反爬措施,根据ip访问频次进行封锁ip地址,具体参数不是直接在静态界面展示,通过js加密参数通过xml进行传输,是否需要登录才能看到具体数据,所有的数据是否通过雪碧图通过js偏移进行读取。

下面的章节将会介绍本次项目的相关技术。

2 相关技术介绍

分析了基于 Scrapy 爬虫框架的数据采集系统设计的背景,意义以及目前研究的一些现状之后,我们认为基于 Scrapy 框架的数据采集系统的设计与实现具有一定研究的意义和价值。在本章中我们将介绍系统实现时主要使用的技术平台和应用技术,包括开发环境的搭建,核心技术的特点介绍及优缺点等。其中主要介绍了浏览器端的 HTTP 协议,及scrapy框架。

2.1开发环境的搭建

本文的爬虫设计以及实现是基于scrapy爬虫框架的数据采集系统,使用的是window7系统,和python3.6开发,以及pycharm编辑器[10]。在本机安装mysql环境,搭建MySQL的环境变量,完成安装的mysql关系型数据库mysql。

编译语言的安装及框架的安装

#python安装:

在官网上(Welcome to Python.org)下载python3.6,然后运行所下好的对应的exe安装包进行安装。

#pycharm安装:

访问 https://www.jetbrains.com/pycharm/download/,下载安装包

#进入安装包的路径,双击进行安装

#mysql安装

访问MySQL :: MySQL Downloads下载安装包,双击进行安装

#安装完成后,进入‘计算机’->‘管理’->‘服务’页面中开启和关闭mysql服务,如下图1:

图1 mysql服务

#Scrapy安装

#安装对应的依赖库

安装lxml

#进入对应的python环境中

pip install lxml

pip3 install lxml-3.8.0-cp36-cp36m-win_amd64.whl

安装pyOpenSSL

#在官方网站下载wheel文件(详见https://pypi.python.org/pypi/pyOpenSSL#downloads)即可

Pip3 install pyOpenSSL-17.2.0-py2.py3-none-any.whl

安装Twisted

#到http://www.lfd.uci.edu/~gohike/pythonlibs/#twisted下载wheel文件,利用pip安装即可。

Pip3 install Twisted-17.5.0-cp36m-win_amd64.whl

#安装scrapy

Pip 3 install scrapy

2.2 浏览器端相关技术

2.2.1 HTTP协议

HTTP是一个位于OSI七层模型中的应用层的一种面向对象的网络协议,由于HTTP其中的便捷性和可操作性更加适合于在分布式的信息系统中。在1990中HTTP被提及出来,在不断地应用中,被具体的进行改善和对其进行拓展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出[12]

HTTP协议的主要特点可概括如下:

1.支持客户/服务器模式。

2.简易性:在客户端与相应服务器在进行请求的过程中,改变对应的传送方法和相对应的路径,就可以进行http请求。常用的请求有GET,POST等等。因为其建议性,可以是对应的服务器程序规模更小,进而传输的速度更快。

3.灵活性:例如在谷歌的抓包工具中,对应的字段是Content-Type就是HTTP中对传输类型进行对应的数据类型。

4.无连接

5.无状态缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大,另一方面,在服务器不需要先前信息时它的应答就较快[13]

常见的爬虫中遇到的状态码(status)

HTTP响应也是由三个部分,分别是:状态行、消息报头、响应正文

状态行格式如下:

http-version status-code reason-phrase crlf

其中,http-version表示服务器HTTP协议的版本;status-code表示服务器返回的响应状态代码;reason-phrase表示状态代码的文本描述

状态代码有三位数字组成,第一个数字定义了响应的类别,并且有五种可能取值

eg:HTTP/1.1 200 OK (CRLF)

2、响应报头后述

3、响应正文就是服务器返回的资源的内容 

2.2.2 HTTPS协议

https是一种基于http加SSl层进行加密的一种协议[2]。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性[3]。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上[23]

简单来说,HTTPS 是 HTTP 的安全版,是使用 SSL/TLS 加密的 HTTP 协议[9]

HTTPS 提供了加密 (Encryption)、认证 (Verification)、鉴定 (Identification) 三种功能[11]。如下的解释中,假设是张三和李四在通讯。

私密性(Confidentiality/Privacy):

http进行加密过后的信息;保证信息只有张三和李四知道,而不会被窃听。

可信性(Authentication):

身份验证,主要是服务器端的,确认网站的真实性,有些银行也会对客户端进行认证;用来证明用户就是用户。

完整性(Message Integrity):

为了确保信息的完整,防止被修改;李四接收到的消息就是张三发送的。

2.2.3 Scrapy

Scrapy是基于twsted框架,利用python编写完成的网络异步爬虫应用框架。。Scrapy内部完成了多线程并发进行请求,免登录,url自动去重,robot协议更改,在爬虫框架上有良好的应用性能。

Scrapy主要是由五部分部件组成:Scrapy Engine(Scrapy引擎)、Scheduler(调度器)、Spiders(蜘蛛)、Item Pipeline(项目管道)、和Downloader(下载器)[22]。Scrapy Engine引擎是用来处理整个架构中所有的数据列。其中的调度器的作用是接收引擎发出的request并压入队列之中,并且在引擎的下一次请求来进行回调。蜘蛛spider是用来抓取所回调出来的url中的response中所需要的信息,可以用xpath,pyquery,正则表达式来处理所有的信息。下载器是下载所有回调的网页内容的,并将结果返回给蜘蛛。项目管道,负责的是处理所有spider中所提取出来的内容来发送至项目管道。当页面被蜘蛛解析后,将其发送给pipeline项目管道来进行存储。下载中间件,位于Scrpay引擎和下载器中建的以一个钩子框架,主要功能是处理蜘蛛的response和request[24]。Scrapy架构的组件如图2所示[15]

图2scrapy组件

Scrapy框架工作流程:

1.最开始spiders会把所有迭代出来的urls交给引擎组件,再把这些urls交给调度器组件。

2.Scheduler(排序,入队)处理后,经ScapyEngine,DownloaderMiddlewares(可选,主要有User_Agent,Proxy代理)交给Downloader.[25]

3.下载器将根据urls对互联网进行爬取

4.spiders将会处理响应,把提取出来的数据经过对应的中间件再交给ItemPipeline进行保存

5.提取出来的url重新经过ScrapyEngine交给Scheduler进行下一个循环。直到无url请求程序停止结束。Scrapy框架架构如图3所示

图3 scrapy架构

2.2.4 Mysql

本次项目主要应用的是mysql关系型数据库,在进入本地的mysql中创建对应的数据库,在数据库中创建即将存储数据的表。根据本文的需求我们只创建了一个表,在表中对应的字段分别为一个自增的房屋对应id,每个房屋对应的标题tiele,房屋标题对应的具体页面的链接detail_link,房屋的具体价格prize,发布这个信息的时间time,房屋的具体位置location,在进入房屋对应具体信息的网页中所描述房屋的具体信息content,定义这个表中的引擎为innodb。

2.3 本章小结

本章的内容依次为,Python的环境搭建,pycharm IDE的安装,http以及基于http进行ssl加密的https协议,scrapy所有的依赖库的安装,比如xml,python环境的搭建,pyOpenSSL的具体安装,scrapy安装,介绍了scrapy的五大组件分别为引擎,调度器,蜘蛛,项目管道,下载器,是利用python编写出来的网络异步爬虫框架,支持scrapy-redis分布式,使用者可以根据需求的不同来编写修改,以及最后的通过mysql的具体特点来说明本次实验选择该关系型数据。

下一章节,将会对基于Scrapy框架的链家爬虫进行数据分析。

3 Scrapy框架应用

3.1 利用Scrapy编写一个爬虫

在cmd中创建自己的Scrapy项目工程

在命令行中切换到自己工作空间下,执行以下的命令,如图4

图4 scrapy的项目创建

再进入所创建的目录之中创建一个spider,如图5:

图5 scrapy中spider的创建

现在我们的工作目录的结构如图6:

图6 scrapy项目结构

3.2 Scrapy的启动流程

3.2.1 命令行启动

输入命令方式:

通过命令行运行其中的一个spider: #$scrapy crawl mysqider[13]

命令中的scrapy是一个可以执行的文件,后面的crawl mysqider是scrapy其中的参数,scrapy的可执行文件存放在python存放目录的bin目录中,可以看成是一个python脚本,有效代码如下:

from scrapy.cmdline import execute

if __name__ == '__main__':

    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])

sys.exit(execute())

这个文件的作用就是从命令行里读取命令,然后传递给scrapy.cmdline包的execute()方法进行下一步的操作。

  Execute()方法

  从python的第三方库目录中找到scrapy/cmdline.py的文件,发现在代码中有execute()方法:

此方法中的重要操作有:

1.执行get_project_settings()方法,导入全局配置文件scrapy.cfg,进而导入项目的settings .py[16]。这里用到了scrapy/utils/project.py中的get_project_settings()方法,这里先不展开。

2.对命令行中的参数进行解析,并且把所有的配置项放入对应的settings中。

3.cmd.crawler_process = CrawlerProcess(settings)这句代码建立CrawlerProcess对象,并把所有的设置settings传递给此对象。

4._run_print_help(parser, _run_command, cmd, args, opts)调用_run_command执行命令。

执行crawl命令

从python的第三方库目录中找到scrapy/commands/crawl.py#Comment的文件,其具体代码如下:

    def run(self, args, opts):

        if len(args) < 1:

            raise UsageError()

        elif len(args) > 1:

            raise UsageError("running 'scrapy crawl' with more than one spider is no longer supported")

        spname = args[0]

        self.crawler_process.crawl(spname, **opts.spargs)

        self.crawler_process.start()

get_project_settings会首先判断是否设置了SCRAPY_SETTINGS_MODULE环境变量,这个环境变量会指定对应的模块

init_env首先调用get_config()获取cfg配置文件,这个配置文件获取的优先级是:

1./etc/scrapy.cfg,c:\scrapy\scrapy.cfg

2.XDG_CONFIG_HOME环境变量指定的目录下的scrapy.cfg

3.~/.scrapy.cfg

4.当前执行目录下的scrapy.cfg或者父目录中的scrapy.cfg

由于1,2,3默认都不设置,所以就使用当前执行命令下的scrapy.cfg,也就是工程目录下的scrapy.cfg。这个文件的内容很简单:

[settings]

default = myspider.settings

[deploy]

#url = http://localhost:6800/

project = myspider

根据default=myspider.settings找到对应的配置模块,后面回执行一系列导入settings.py配置项操作,这就是scrapy命令行模式的完成的操作流程。

3.3 数据的存储

由于mysql的体积小、执行速度快、总体拥有成本低,更关键的开源这一特点,成为了各种中小网站为了降低网站总体消耗成本而选择mysql作为网站的数据库。Mysql是一个支持多用户、多线程的关系型数据库管理系统[14]。工作系统是基于客户机/服务器结构,所以选择该关系型数据库。

3.4 数据的解析

3.4.1 xpath解析

(1)基本概述

Xpath的全称是XML路径语言,它是一种为了确定XML(标准通用标记语言的子集)文档中某部分位置的语言。Xpath是基于XML

的树状结构,拥有多种类型不同的节点,其中包括了元素节点,属性节点和文本节点,它提供了了在有数据结构树种找到节点的能力,最初Xpath的从初衷是为了将它作为一个通用的,在Xpointer与XSLT间的语法模型。

(2)具体原理

Xpath就像一种sql的查询语句,其能使对dom树进行快速的位置查询并且获取对应的结果。

(3)xpath举例

举例,需要提取下图7中的24000元/月中的价格

图7 链家房屋信息示例图

这个网页中的部分html内容为(部分截取),如下图8:

图8 链家房屋信息示例图

提取其中的24000元的xpath就为:

//div[@class=’content_list--tiem--main’/span/em/text()].extract()

3.4.1 css解析

(1)基本概述

层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化[19]。无论是什么样式的字体字号都可以被css进行控制[21]

(2)css选择器举例

举例,需要提取下图9中的朝阳东大桥的信息

图9 链家房屋信息示例图

提取的css选择器的语句:’[div[class=’content_list--item--main’]p[class=’content__list-item--des’]a::text’].extract()

这个网页中的部分html内容为(部分截取)如下图10:

图10 链家房屋信息示例图

3.5 本章小结

本章节详细的介绍了本文章用到的scrapy网络爬虫框架,scrapy网络爬虫框架是一个高性能,实用性强,支持分布式的一个爬虫框架,非常适合于本项目的需求。同时讲述了scrapy的相关知识点,基于命令行启动scrapy的工作原理,scrapy其实是一个可执行的文件,以及后面的具体参数,其放在python存放目录的bin目录下面,其中主要调度了execute方法还有get_project_settings方法并且讲述了两种静态网页的元素提取技术,分别为xpath和css选择器,正则表达式在本文没有具体应用所以并没有进行介绍,并对两种技术进行了链家数据的举例,分别提取了链家某租借房屋的价格和位置。

下面的章节会讲述如何基于框架来实现本次爬虫程序。

4 基于scrapy框架的爬虫具体实现

4.1 房价爬虫总体设计

4.1.1爬取对象的介绍

本文爬取的目标网站是‘链家’,链家,成立于2001年,是以数据驱动的全价值链房产服务平台[20]。基本信息包括了房屋的标题、房屋的具体链接、房屋得到具体价格发布信息的具体时间、房屋的位置信息、房屋的入住情况、房屋的租期、房屋的楼层、房屋的电梯情况、房屋的车位数据、房屋的用水情况、房屋的用电情况、房屋是否有燃气、房屋是否配置采暖、房屋的房源描述信息。

通过选取‘链家’作为爬取对象,主要所涉及的方面有:网页结构元素的具体解析,使用ip代理隐藏掉自己的所属ip信息,这会帮助我们更加细致的了解爬虫的工作原理和流程,此外,我们爬取的房地产信息的价值,可以帮助我们进一步的进行数据分析挖掘,得出有用的信息。

上段的放假的描述信息在链家的租房网站上展示如下图11:

图11 链家房屋信息示例图

4.2爬虫实现具体细节

4.2.1数据库的具体搭建

根据需求以及网站的信息排列,在mysql中创建了对应链家房屋信息的表格,对应字段见表1:

表1   链家数据表

名称

参数描述

数据类型

约束条件

Id

房屋自增id

Int(11)

Primary-key

Title

房屋信息对应标题

Varchar(255)

Null

Detail_link

具体信息的链接

Varchar(255)

Null

Prize

房屋的具体价格

Varchar(255)

Null

Time

房屋发布时间

Varchar(255)

Null

Location

房屋的位置

Varchar(255)

Null

Content

房屋的基本信息以及配置

Text

null

 

关于lianjia表的E-R图如下图12所示

图12 lianjia表的E-R图

链家表中的content可以延续出另一个数据表数据结构,对应字段如表2:

2   content对应信息

名称

参数描述

入住情况

随时入住

租期

年限为单位

楼层

是否为高楼层

电梯

是否有电梯

用水

是否为民水

燃气

是否有燃气

采暖

是否为自采暖

4.2.2scrapy的具体配置

在scrapy项目中的setting.py中,需要配置关于本次项目的具体配置,先把其中的ROBOTSTXT_OBEY设置成False,其目的是为了拒绝目标网站中的robot协议,让爬虫的权限更高,执行稳定性更强。

定义一个名为USER_AGENT的列表,其中充填多种的USER_AGENT的请求头,目的是为了切换各种请求头来规避掉目标网站的反爬行为。设置ITEM_PIPELINE中的两个参数分别为300,为了能进行mysql的连接存储。

4.2.2spider的具体逻辑

在start_urls的基础上遍历出所有所需要进行爬取的urls,进行一个for循环以及yield把所有的url请求一遍,先进行链家的url分析,例如:https://bj.lianjia.com/zufang/pg3/#contentList,根据url可以分析出这是一个https的静态页面的连接,bj代表了地区的编码值,liajia.com是固定的的目标网站的网址,接下来的/zufang对应的是租房的url,pg3代表了这是第三页的目标信息,根据页面所显示的信息,一共有100页,并且为了保险起见对于大于100的网页也进行了请求,例如200,400,所显示的页面都是第100页现实的内容,所以上面提到的for循环我们就可以进行100次的循环,变量为pg后面的值,在这个过程中我们要主要变量的type,否则将会报错。

遍历并且yield所有的网址后我们进行分析,所有网址上的信息有标题,地址,价格,但是具体信息不再这个链接之中,所以在遍历这些urls的时候我们要把所有的title对应的链接进行请求,把请求过得值赋予给item中的content。

除了location的信息是通过css选择器进行筛选,其他的都是应用的xpath来进行定位,所有的信息提取如下表3

3   提取对应公式

字段名称

对应提取式

title

(//div[@class='content__list--item--main']/p[1]/a/text).extract()[0]

Detail_link

(//div[@class='content__list--item--main']/p[1]/a/@href).extract()[0]

Prize

(//div[@class='content__list--item--main']/span/em/text()).extract()[0]

location

div[class='content__list--item--main']".strip()

Content

//li[@class=f1 onelint].text()

因为在第一次请求之中我们获取到了所有的title对应的具体房屋信息的链接,在赋值给item时,content的信息并没有直接获取到,所以再定义一个回调函数具体代码如下:

def parse_body(self,response):

    item = response.meta["item"]  

    # 同理 使用xpath定位房屋信息和房源描述

    fangwuxinxi = response.xpath("//li[@class='fl oneline']/text()").extract()

    fangyuanmiaoshu = response.xpath("//p[@data-el='houseComment']/text()").extract()

    fangwuxinxi = "\n".join(fangwuxinxi)

    fangyuanmiaoshu = "\n".join(fangyuanmiaoshu)

    item["content"] = "房屋信息:\n" + fangwuxinxi + "\n房源描述:\n" + fangyuanmiaoshu

yield item

这样item中的content也被赋予了我们通过标题链接进行二次请求后获取的值。

4.2.3 mysql的数据存储

在scrapy项目中新创建了一个名字为db.py的数据文件,其目的是进行连接本地的mysql来进行数据插入,首先判断是否创建了变,如果没被创建则进行创建,之后创建数据库的游标,把所有经过scrapy popelines的item进行插入到mysql对应的表中,具体代码如下:sql = "select * from %s where (title like '%%%s%%' or content like '%%%s%%')andlocationlike'%%%s%%'limit %s,%s"%(self.tableName,keyword,keyword,city,begin,total)

4.2.4 爬虫中遇到的关键问题

爬虫的分页处理:通过chrome的抓包请求发现是否为静态网页,对url进行解析,发现是通过url中的某一个参数来控制分页的。请求时,只要调整该参数,就能遍历所有的页面信息,来实现分页。

同一ip如果请求过快,在服务器的后台会被检测出来是机器恶意行为,将会封锁ip,解决办法通常有两种:

在进行循环的过程中通过添加一个time.sleep(1)强制的睡眠时间,这样放慢对目标网站的请求速率,后台就不会检测出其的恶性行为,但是代价就是会降低效率[18]

Ip的对应代理来说通常有付费代理和免费的代理分别对应各种IP代理商,通常比较常见的网站如果使用免费代理是请求不会通过的,所以基本都是会选择付费的高匿https代理,本次的爬取也是使用的付费代理。

4.3 爬取结果展示

整个爬取过程耗时了15分钟,一共爬取了2010条数据,查询如下图13:

图13mysql的数据查询

具体数据如下图14:

图14 mysql的数据查询

4.4链家爬虫的数据分析

4.4.1 matplotlib介绍

Matplotlib是一个基于python的一个2d绘图库,它可以在任意操作系统下的Python环境中通过各种方式的硬拷贝格式和通过交互式环境来生成的具有出版高品质的图形[17]。对应不同的python脚本过着其他的程序工具包中。

Matplotlib为应用者提供了pyplot模块的界面,对于应用者可以通过控制指定的函数来改变线条的样式等等。

4.4.2 数据提取

通过利用scrapy的框架提取的所有信息存放在了mysql数据库之中,如果要利用这些数据,就想要把数据提取出来,在项目中创建了一个data_analysis.py的文件其目的是为了数据的提取与可视化以及数据分析。

导入pymysql的python库,为了与本机的mysql数据库进行相关联,首先建立连接,连接的属性都有host,port,user,password,database,charset,分别为主机位置,端口号,使用者,对应的密码,用的数据库,以及对应编码,基于连接创建一个游标,创建三个sql查询语句,具体代码如下:

 "select distinct location from lianjiainfo10"

 "select count(*) from lianjiainfo10 where location='%s'"

 "select location,avg(prize) from lianjiainfo10 group by location"

分别为查询在表中的所有不重复的地理位置,以及为了遍历所有位置而查询到的消息数,最后是以地理位置作为组查询平均价格。

利用游标cursor的execute的方法进行执行相应的sql语句,分别执行完sql语句之后储存到对应的容器中,比如list,字典。

最后,进行连接的提交过程,conn.commit()以及连接和游标的关闭。整个系统的流程图如下图15:

图15项目的流程图

4.4.3 数据分析及可视化

像之前介绍过的matplotlib的2d画图库来说,本文少量数据很适合利用其功能完成可视化的需求。提取出来的数据分别存放在对应的容器中,在可视化的脚 本中首先为了让中文能够完全的显示会进行一个plt的参数设置:plt.rcParams[‘font.sans-serif’]=’SimHei’,然后设置整个的画图大小以及传入对应的数据,最后进行饼状图的具体现实,如图16所示

图16 北京租房各地区的数量

相同的方式进行通过matplotlib对租房价格的平均房价进行饼状图的绘画,通过plt的bar方法来绘画相应的柱形图,函数中的参数都有x,y轴的对应值,柱的间距以及颜色,包裹颜色,由于对应x轴的地区名称长度过长在显示的过程中会出现交叉,所以为了正常的显示,对plt的x轴标签中进行了x轴旋转添加了plt.xticks(rotation=50),

最后进行柱状图的显示,如下图17所示

图17北京各地区的房价预测

4.5本章小结

在本次章节中,主要介绍了整个scrapy项目的具体实现,通过pymysql进行python与关系型数据库mysql的连接,进行数据的提取,通过sql语句进行分组划分进行所有所需数据的提取操作,提取操作后进行在容器进行下一步的操作。通过matplotlib中的pyplot方法进行北京所有租房信息的划分,进行pie图形的制作,所有地区的租房价进行预测。

结  论

本论文对于链家爬虫的实现,设计了一套基于scrapy的链家爬虫项目,目的是爬取所有北京市的房屋信息,能够使所有的房屋信息进行实时化,透明化。

进行本次实验,可以分析出北京整租的各地区的租金价格的区别和差异,可以更加直观判断出根据自己条件租房的位置,在提取信息的content中,我们可以根据想要的条件进行提取满足自己需求的发房屋信息,通过matplotlib中的pyplot进行所有数据的画图,可以更加直观的发现数据中所包含的价值,以及区别。

通过这次的毕业论文设计,使我增强了自己的编程能力,对编程语言以及应用框架有了更深的认识,对基于python的画图库有了更加深刻的认识,遇到相应的问题可以通过搜索引擎进行查取所需要的答案,解决对应的问题。同时也认识到了自己的缺点和不足,以后我会尽自己最大的努力来弥补自己的不足。

参考文献

[1]丁忠祥,杨彦红,杜彦明.基于Scrapy框架影视信息爬取的设计与实现[J].北京印刷学院学报, 2018, 26(09):95-100.

[2]朱新文. 二手房的垂直搜索引擎的设计与实现[D].

[3]程增辉, 夏林旭, 刘茂福. 基于Python的健康数据爬虫设计与实现[J]. 软件导刊, 2019(2):60-63.

[4]郑苗. 基于网络爬虫的北京市房价研究[D].

[5]姜玉丽. 混合式教学在《基于python的网络数据分析》中的应用[D].

[6]黎爽. 基于Python科学计算包的金融应用实现[D]. 2017.

[7]李保源. Matplotlib在计算结果可视化中的应用[J]. 现代计算机, 2007(1):81-84.

[8]于志强, 王齐兴. 依托大数据挖掘的餐饮业油水分离器监测系统设计[J]. 软件工程, 2015(12):31-34.

[9]刘畅. Python代码风格对软件维护的影响研究[D]. 2017.

[10]周一丁. 基于面向服务并行计算的Python计算网格[D]. 上海交通大学.

[11]熊畅. 基于Python爬虫技术的网页数据抓取与分析研究[J]. 数字技术与应用, 2017(9):35-36.

[12]基于MapReduce的社会网络分析系统研究与实现[D]. 北京邮电大学, 2010.

[13]邓春燕, 薛林福, 王满,等. 基于AJAX的网络地质图库标记系统的设计与实现[J]. 东北师大学报(自然科学), 2009, 41(1):53-56.

[14]吴黎兵, 柯亚林, 何炎祥,等. 分布式网络爬虫的设计与实现[J]. 计算机应用与软件, 2011, 28(11):176-179.

[15]李代祎, 谢丽艳, 钱慎一,等. 基于Scrapy的分布式爬虫系统的设计与实现[J]. 湖北民族学院学报(自然科学版), 2017, 35(3):317-322.

[16]卞伟玮, 王永超, 崔立真,等. 基于网络爬虫技术的健康医疗大数据采集整理系统[J]. 山东大学学报(医学版), 2017, 55(6):47-55.

[17]佚名. 基于Scrapy框架的分布式网络爬虫的研究与实现[J]. 智能计算机与应用, 2018, 8(5):52-56.

[18]陈琳, 任芳. 基于Python的新浪微博数据爬虫程序设计[J]. 信息系统工程, 2016(9):97-99.

[19]P. Mittal,A. Dixit,A. K. Sharma:A scalable, extensible Web crawler based on P2P overlay networks[C].Proceedings of the International Conference and Workshop on Emerging Trends in Technology.2010:159-162

[20]Boldi P,Codenotti B,Santini M,et al.Ubicrawler:A scalable fully distributed Web crawler[J].

[21]Sofeware:practice and Experience,2004,34(8):711-726.

[22]马联帅. 基于Scrapy的分布式网络新闻抓取系统设计与实现[D]. 2015.

[23]唐华承,闫明慧,刘幺和.基于移动终端的 ERP 财务管理模块数据分析及处理[J].湖北工业大学学报,2016,31(04):41-44

[24]Ginsberg,Jeremy, Mohebbi, Matthew H, Patel, RajanS.Detecting Influenza Epidemi csUsing Search Engine Query Data[J]. Nature,2009

[25]Wu, Lynn,Brynjolfsson, Erik. The Future of Prediction:How Google Searches Foreshadow Housing Prices and Sales[C].NBER Conference Technological Progress and Productivity Measurement,2009.

[26]Kulkarni, Rajendra, Haynes, Kingsley E, Stough, R, R.Forecasting Housing Priceswith Google Econometrics[Z]. America: George Mason University, 2012.

  • 23
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源码空间站11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值