APP下载

基于Scrapy框架的天气数据采集系统设计

2021-07-27陈浩东

湖北农机化 2021年13期
关键词:爬虫代码框架

徐 伟 许 鹏 陈浩东

(合肥职业技术学院,安徽 合肥 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框架下的爬虫程序,实现了对中国天气网天气数据的自动爬取和存储,让用户可以精确、快速地获取天气信息,减少用户浪费在数据分辨与筛选上的时间,为用户提供一个纯净、可靠的信息获取来源,具有一定的研究价值。

猜你喜欢

爬虫代码框架
利用网络爬虫技术验证房地产灰犀牛之说
有机框架材料的后合成交换
框架
Rn上的测度双K-框架
基于Python的网络爬虫和反爬虫技术研究
基于Scrapy框架的分布式网络爬虫的研究与实现
谁抢走了低价机票
神秘的代码
一周机构净增(减)仓股前20名
一行代码玩完19亿元卫星