最近在关注北京房价变化,关注策略为先筛选小区,然后筛选小区内房价。就实现思路而言,首先想到的是使用爬虫爬取链家网中的数据并保存至数据库中,然后进行简单分析,得出小区及房价变化趋势。经过简单技术选型,决定采用scrapy框架完成上述数据爬取,使用mysql记录数据,记录数据样例如图所示。本系列文章包含爬取小区信息、爬取房价信息具体实现及实现过程中问题处理方法。
本次实现选取的Python版本为3.12.1,默认pip等工具已经具备。IDE为Pycharm社区版本。为了屏蔽shell工具差异,本次实现中所有命令均是在IDE内的终端中执行。
Scrapy 是一个快速的高级网络抓取框架,用于抓取网站并从其页面中提取结构化数据。它可从广泛用于数据挖掘到监控和自动化测试等场景。通过Scrapy安装指南得知,Scrapy 需要 Python 3.8+,CPython 实现(默认)或 PyPy 实现。建议安装前校验所使用的Python版本。首先选取自己常用代码存放目录执行如下命令安装Scrapy框架。
命令执行完成后, 在终端内执行如下命令校验Scrapy是否安装成功。
如果出现对应版本号,则说明安装成功。其次执行如下命令创建Scrapy项目。
其中,myproject为自定义项目名称,[project_dir]为可选参数,该参数定义项目路径。本例中项目名称为“lianjia”执行成功后,进入项目路径,发现项目结构如下图所示:
至此,完成lianjia Scrapy项目骨架初始化完成。本例项目所在文件夹为lianjia,项目名称为lianjia。
本节简要介绍项目结构中各个文件用途,为后续实践奠定一定的理论基础。(1)文件,该文件为项目基础配置文件,主要用于配置部署参数,包含项目在完成开发后部署至生产环境时的配置信息,本案例在本地运行,因此未对该文件作修改。(2)文件定义数据结构,Scrapy框架将解析的最终结果以字典形式返回,简单来说即在该文件中定义了什么字段,就可以在返回结果中包含什么字段。(3),下载器中间件是介入到 Scrapy 的 spider 处理机制的钩子框架,可以添加代码来处理发送给 Spiders 的 response 及 spider 产生的 item 和 request,简单来说就是就是在发送请求和收到相应中间插入自定义处理逻辑,针对请求来说可以构造请求参数等,针对响应来说可以过滤响应结果参数等。(4),该文件为爬虫配置文件,包括设置爬虫名称、设置并发访问数量、设置自定义中间件执行顺序及设置重试时间等。(5)spiders文件夹中包含自定义的。
上述内容对于刚接触Scrapy框架的朋友来说可能有些抽象,不过随着后续实践,可以逐步加深对项目结构的认识和理解。
通过前两步,我们在实操和概念上对Scrapy框架有了初步认识。本节具体实现一个简单的爬虫,该爬虫可以获取北京朝阳区域部分小区名称。该爬虫为后续爬取详细小区信息奠定初步实践基础。首先创建爬虫命令如下所示:
其中[-t template]为可选参数,本案例不设置该参数,使用basic模板。name为爬虫名称domain or url为爬虫爬取数据时允许的域名。本案例具体执行如下命令创建一个爬取链家小区的爬虫:
命令执行完成后,进入spiders文件夹,发现生成了名为lianjiaxiaoqu.py的爬虫文件,该文件默认内容如下图所示:
其中name字段的值为执行创建爬虫命令时输入的爬虫名称,allowed_domains值为允许的域名,start_urls值为爬虫入口,该值类型为列表,说明可以包含多个值。 其次编修改该文件内容,将内容修改如下:
其中,(1)将爬虫入口换为朝阳区域,楼龄在20年内的小区首页的url。(2)在解析方法中将首页小区列表中第一个小区名称解析并打印。
最后,执行以下命令运行该爬虫:
运行结果如图所示:
从图中可以看出,“华腾新天地大厦” 为返回结果。