基于Scrapy框架的天气数据采集系统设计
2021-07-27陈浩东
徐 伟 许 鹏 陈浩东
(合肥职业技术学院,安徽 合肥 230013)
1 Scrapy框架简介
Scrapy是一个基于Python的爬虫框架,可以被应用在大数据处理、数据挖掘等应用中。该框架最初设计目的是页面抓取,也可以用于获取API数据或者编写通用的爬虫程序之中。图1是Scrapy的结构图,以及Scrapy的各个组件在系统中发生的数据流向的概览,并对每个组件都做了一些简单的介绍。
图1 框架结构
Scrapy Engine引擎是用来控制整个Scrapy系统的数据处理流程的核心部件,也会进行事务处理的触发。Scheduler(调度器),调度程序从Scrapy引擎接受请求并将请求进行排序,再列入队列,并在Scrapy引擎发出请求后,将结果返还给它们。Downloader根据url地址抓取网页,并将网页内容传给Spiders。Spiders(爬虫类)由用户自己定义并实现,其中的parse()函数通常用来获取网络源码内容,并使用xpath、beautiful soup或正则表达式技术对html文档的内容进行解析,并抓取需要的数据或特定位置的url,并经历对新的url进行请求、获取响应数据并解析数据的过程。每个Spiders都可以处理一个域名或一组域名。可以给每个Spiders定义一组特定网站的解析规则和抓取规则。解析的数据可以封装成自定义的Item对象并交给Pipeline进行数据持久化。
2 爬虫代码结构
本系统所爬取的网站是中国天气网http://www.weather.com.cn,使用Python的开源爬虫框架Scrapy爬取天气数据页面并通过Xpath技术从html文档中提取结构化的数据与信息。
爬虫代码的文件结构组成如图2:
图2 爬虫项目代码结构
对爬虫项目的主要文件说明如下:scrapy.cfg:该文件是整个项目的配置文件。主要是为命令行操作提供了一些配置参数。items.py:该文件包含了设置数据如何存储的类,让数据结构化,如天气、风速、日期等数据。pipelines.py:该文件用于处理从爬虫Spider返回的数据。settings.py:该文件是整个爬虫项目的配置文件,包含了很多配置内容,比如延迟下载的时间,是否遵循网站robots.txt的口令约束,以及并发数量等。spiders:爬虫程序所在的目录,即包含爬虫的主体程序文件weatherSpider.py。middlewares.py:中间件配置文件。cron.sh:自己编写的定时脚本任务,用来定期进行数据的爬取和保存。weather.log:保存爬虫程序的运行日志,以便出错误时方便定位错误。
3 数据库设计
本系统中,采用MySQL数据库进行数据存储,设计了5张表用来存储整个系统的全部天气数据、用户登录信息、用户详细信息和一份全国城市天气代码对照表。
表1为数据库中的全部表格及其功能含义,下面详细介绍每一个表的设计:
表1 数据库表功能
City_code表:
| city_code | CREATE TABLE `city_code`(
`province` varchar(20)DEFAULT NULL,
`city` varchar(20)DEFAULT NULL,
`area` varchar(20)DEFAULT NULL,
`city_code` varchar(20)DEFAULT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=′全部的城市代码:省、市、地区、城市代码′
Register_city表:
| register_city |CREATE TABLE `register_city`(
`city_code` varchar(20)NOT NULL,
PRIMARY KEY(`city_code`)
)ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT=′所有已经被注册的城市的城市代码集合′
User_info表:
| user_info | CREATE TABLE `user_info`(
`username` varchar(20)NOT NULL,
`city` varchar(20)NOT NULL,
PRIMARY KEY(`username`,`city`)
)ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT=′每一个用户所注册的城市′
User_login表:
| user_login | CREATE TABLE `user_login`(
`username` varchar(20)NOT NULL,
`password` varchar(20)NOT NULL,
PRIMARYKEY(`username`)
)ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT=′用户的用户名与密码′
Weather7day表:
| weather7day | CREATE TABLE `weather7day`(
`id` int(11)NOT NULL AUTO_INCREMENT,
`city_code` varchar(10)NOT NULL,
`weatherDate1` varchar(10)DEFAULT NULL,
`weatherDate2` varchar(10)DEFAULT NULL,
`weatherWea` varchar(10)NOT NULL,
`weatherTem1` varchar(10)NOT NULL,
`weatherTem2` varchar(10)NOT NULL,
`weatherWin` varchar(10)NOT NULL,
`updateTime` datetime NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 COMMENT=′近7d的大致天气(仅有每天的最高温度与最低温度)′
Weather7day_full表:
| weather7day_full | CREATE TABLE `weather7day_full`(
`id` int(11)NOT NULL AUTO_INCREMENT,
`city_code` varchar(10)NOT NULL,
`weatherDate` varchar(10)DEFAULT NULL,
`weatherWea` varchar(10)NOT NULL,
`weatherTem` varchar(10)NOT NULL,
`weatherWinf` varchar(10)NOT NULL,
`weatherWinl` varchar(10)NOT NULL,
`updateTime` datetime NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=InnoDB AUTO_INCREMENT=161DEFAULT CHARSET=utf8 COMMENT=′近7d的详细天气(按小时统计),包括今天的详细天气。
4 Spider的设计与实现
Scrapy网络爬虫框架的各个模块的功能在前面已经做了简单介绍,下面对其各个模块核心功能和代码进行说明:
1)Items.py主要包含了一个类TodayWeatherItem,其功能是配置需采集页面的字段实例。
class TodayWeatherItem(scrapy.Item):
content = scrapy.Field()
city_code = scrapy.Field()
其中,content是一个ajax请求返回的json串,其中包含了“今天”的天气数据;city_code为城市代码。
2)settting.py主要包含的是一些配置项和中间件以及一些数据库的连接参数信息。
BOT_NAME = ′today_weather′
SPIDER_MODULES = [′today_weather.spiders′]
NEWSPIDER_MODULE = ′today_weather.spiders′
DEBUG = True
dbuser = ′root′
dbpass = ′123456′
dbname = ′bs_db′
dbhost = ′127.0.0.1′
dbport = ′3306′
#遵循robots.txt中的口令约束
ROBOTSTXT_OBEY = True
ITEM_PIPELINES = {
#′today_weather.pipelines.TodayWeatherPipeline′: 300,
′today_weather.pipelines.MySQLStorePipeline′: 400,
}
3)weatherSpider.py是爬虫程序的主体,在设计上,爬虫程序需要实现这样的功能:从数据库读取用户注册的城市信息,再根据城市天气代码生成url,将url传给爬虫程序进行网页内存的爬取,再对下载的内容使用xpath技术提取出我们想要的内容。
爬虫主体类是CatchWeatherSpider类,继承自scrapy.Spider类,功能是下载网页并进行内容解析,具体实现如图3所示:
图3 CatchWeatherSpider函数的实现
5 Crontab实现定时数据爬取
爬虫程序运行在Linux操作系统下,需要定期地运行和更新最新的天气信息,本系统借助Linux的crontab定时任务来实现该功能。
下面是根据crontab语法编写出的crontab定时任务:
#每隔1 h爬取1次未来7 d的天气走向数据
0*/1 * * * sudo sh /home/by/python_test/today_weather/cron.sh
6 结语
本文凭借Python语言丰富的第三方扩展库和快速开发的特点,设计了一款基于Scrapy框架下的爬虫程序,实现了对中国天气网天气数据的自动爬取和存储,让用户可以精确、快速地获取天气信息,减少用户浪费在数据分辨与筛选上的时间,为用户提供一个纯净、可靠的信息获取来源,具有一定的研究价值。