基于Scrapy的太原二手房爬虫的设计与实现*
2023-08-28李红
李 红
(山西职业技术学院,山西 太原030006)
0 引言
近年来,随着国家政府对房地产政策的宏观调控,人们对于买房的热情依旧很高涨,相较于新房,很多家庭倾向于购买二手房,二手房有即买即住,小区配套成熟,地理位置优越等优点。但随着大数据的发展,网络数据鱼龙混杂且越来越多,网络爬虫技术就可以帮助用户挖掘数据,快速爬取出所需数据并完成处理,降低用户人工查找成本。
1 Scrapy框架
Scrapy框架是使用Python语言开发的一个开源的爬虫框架。它也提供了多种类型爬虫的基类,具有快速、高效的抓取网站数据等功能,可用于爬虫开发、自动化测试等应用领域。Scrapy框架由调度器、引擎、爬虫、管道、下载器、Spider中间件和下载中间件几大组件组成。Scrapy框架架构图如图1。
图1 Scrapy框架架构图
Scrapy框架主要工作流程是:1)引擎向Spiders请求第一个要爬取的url;2)引擎把url构造成Request对象传递给调度器;3)调度器接着把要爬取的下一个url链接返回给引擎; 4)引擎通过下载中间件将从调度器接收到的url传递给下载器;5)下载器将获取到的网站页面响应对象Response通过下载中间件返回给引擎;6)引擎通过爬虫中间件将从下载器中接收到的响应对象传递给Spiders;7)Spiders将Response进行解析并进行爬取,将爬取到的Items和需要下一步跟进的请求通过爬虫中间件发送给引擎;8)引擎将接收的Items发送给ItemPipeline,将新的请求发送给调度器;9)重复第二步,直到调度器队列中没有Request后,引擎关闭网站。
2 爬虫的设计与实现
2.1 爬虫总体设计
本文对太原二手房数据进行爬取,主要对小区名称、商圈名称、户型、面积、朝向、装修情况、楼层、建筑类型、关注度、发布时间、总价、单价以及房屋详情链接等信息进行爬取。本文设计的Scrapy爬虫分为数据爬取模块和数据存储模块。其中数据爬取模块也就是整体的爬虫模块,主要功能是通过创建Scrapy工程项目、确定网页爬取目标、创建爬虫、执行爬虫这几步操作,完成对太原二手房数据的抓取;数据存储模块,主要功能是对抓取到的太原二手房数据进行存储,将数据存储为json格式文件在本地保存。
2.2 爬虫的实现
2.2.1 新建Scrapy工程项目
使用Scrapy框架创建爬虫第一步是新建一个Scrapy工程项目。打开终端,通过命令:cd project进入到存放项目的project文件夹中,接着输入命令:scrapy start projectty tySecondHandHouse,其中tySecondHandHouse是项目名称。命令运行成功后,项目名称文件夹下会自动创建若干初始目录和文件,其中scrapy.cfg文件是项目配置文件,存储的是项目配置相关信息;spiders文件夹存储的是spider爬虫文件,下面的tyhouse.py文件就是自定义的爬虫文件;items.py文件是实体文件,定义了Item数据结构;middlewares.py文件是中间件文件,用来定义中间件;pipelines.py文件是管道文件,用来保存数据;settings.py文件是设置文件,用于存储项目的全局设置信息。
2.2.2 确定网页爬取目标
本项目要爬取的太原二手房网址为https://ty.lianjia.com/ershoufang/,要爬取的数据有小区名称、户型、总价等。通过谷歌浏览器打开该网址,进入到浏览器开发模式中,分析网页结构确定每一个爬取数据的XPath路径。通过分析发现,所有的二手房数据都在//*[@id="content"]/div[@class="leftContent"]/ul/li[@class="clear LOGVIEWDA-TA LOGCLICKDATA"]路径下。接下来对要获取的每一个二手房的属性进行位置确定,总名称、房屋详情链接属性的XPath路径分别是./div[1]/div[1]/a/text()和./div[1]/div[1]/a/@href。小区名称、商圈名称的XPath路径分别是./div[1]/div[2]/div/a[1]/text()和./div[1]/div[2]/div/a[2]/text()。房屋户型等6个详情属性均在第3个div下的span中,后期需要在爬虫代码中对其进行数据处理和分割,XPath路径是./div[1]/div[3]/div[@class="houseInfo"]/text()。房屋关注度、发布时间两个属性都在第4个div下的span中,后期同样需要进行数据处理和分割,XPath路径是./div[1]/div[4]/text()。房屋总价和单价的XPath路径分别是./div[1]/div[6]/div[1]/span/text()和./div[1]/div[6]/div[2]/span/text()。
2.2.3 制作爬虫
制作爬虫主要由创建一个爬虫、修改settings文件设置配置信息、数据建模、编写爬虫代码这四步组成。第一步在终端命令行中输入命令:scrapy genspider tyHouse“ty.lianjia.com”。第二步打开settings.py文件,对所需设置进行修改:1)设置User_Agnet。USER_AGENT=’Mozilla/5.0...’,User_Agnet是用户代理,用来伪装请求载体身份,设置后可以模拟人为访问网站的行为,防止网站启用反爬虫。2)关闭Robot协议。ROBOTSTXT_OBEY=False,关闭后Scrapy启动不会访问该协议文件。3)启用管道。ITEM_PIPELINES={’tySecondHandHouse.pipelines.TysecondhandhousePipeline’:300,},包含使用的项目管道和优先级数值。优先级数值在0~1000以内,数值越小优先级越高。第三步打开items.py文件,在TysecondhandhouseItem()类中,对所有获取的属性编写代码同title=scrapy.Field(),这样可以为后期抓取提供保护机制。第四步打开tyHouse.py文件编写爬虫代码,代码分为3部分:1)定义爬虫名称、爬虫域和初始url。2)提取爬取数据,在parse()函数中撰写爬虫逻辑代码,首先根据response对象对数据列表进行XPath,关键代码是node_list=reponse.xpath(‘总路径’),然后通过for循环遍历页面中的二手房数据列表node_list,获取每一个二手房数据中的所有属性,通过item=TysecondhandhouseItem()实例化出item对象,根据之前确定XPath路径依次将数据放入item对象中,关键代码为item[变量名]=node.xpath(’属性路径’).extract_first(),extract_first()是返回列表中的第一个字符串,房屋详情的6个属性值在一个span/text()中,需要通过调用replace(",")方法去除空格,调用split’|’方法将其以’|’为界限分割成6个字符串存储在列表中,房屋关注度、发布时间两个属性处理方法同上,最后通过yield返回数据。3)通过for循环遍历下一页数据,分析发现下一页url在初始url后拼接pg页数即可,生成下一页url代码为nextUrl=self.start_urls[0]+'pg{}/'.format(str(pg)),太原二手房共有100页数据,将循环条件设置为range(2,101)。最后通过yieldscrapy.Request(url=nextUrl,callback=self.parse)代码构建请求对象,将新构建请求返回给引擎开始循环爬取下一页数据。
2.2.4 执行爬虫
打开终端,进入到项目文件夹下,通过执行scrapy crawl tyHouse命令,完成对爬虫的执行操作。
2.2.5 存储爬取数据
本文将数据永久性存储在json文件中,可以在利用管道pipeline保存数据,导入json包后,定义一个管道类,接着在构造函数中通过open内置函数以只写的方式创建/打开文件,重写管道类中的process_item方法,将item数据类型转换为字典,然后对数据序列化,调用write函数将数据写入文件中,写入完成后return item,最后在析构函数中关闭文件。再次执行爬虫,在Scrapy就会生成一个json文件,数据永久化存储部分结果如图2。
图2 json文件
3 结束语
在大数据时代,人工摘取有用信息效率越来越低下,网络爬虫技术提供了很好的解决方案。本文运用Scrapy爬虫框架完成了对太原二手房数据的爬取和处理,最终将数据永久化存储在json文件中,为用户提供了明确的二手房数据信息,减少了用户摘取有用目标数据的时间。在今后的研究中可以继续改进爬虫设计,更好的为用户提供房屋数据参考。