目标设定

爬取中国地震台网地震数据,并录入Mysql,一次全量爬取,后续增量爬取

前期准备

分析请求路径

通过访问中国地震台网查询地震数据-http://www.ceic.ac.cn/speedsearch ,查看网络请求可发现请求路径规律。


24小时内地震:http://www.ceic.ac.cn/ajax/speedsearch?num=1&&page=1&&callback=jQuery180009054009589000045_1580746774613&_=1580781305394

48小时内地震:http://www.ceic.ac.cn/ajax/speedsearch?num=2&&page=1&&callback=jQuery180009054009589000045_1580746774613&_=1580781362409

7日内地震:http://www.ceic.ac.cn/ajax/speedsearch?num=3&&page=1&&callback=jQuery180009054009589000045_1580746774613&_=1580781379658

30日内地震:http://www.ceic.ac.cn/ajax/speedsearch?num=4&&page=1&&callback=jQuery180009054009589000045_1580746774613&_=1580781405444

1年内地震:http://www.ceic.ac.cn/ajax/speedsearch?num=6&&page=1&&callback=jQuery180009054009589000045_1580746774613&_=1580781433861

可见,按照时间获取地震数据的路径为:http://www.ceic.ac.cn/ajax/speedsearch?num=[数字1]&&page=[数字2]&&callback=jQuery***

猜测如下:

  1. 数字1代表不同的时间查询维度(1:24小时内 2:48小时内 3:7日内 4:30日内 6:1年内)
  2. 数字2代表页码
  3. callback参数含时间戳,用来调用数据展示,于我们可有可无,经测试确实如此

因而确定我们爬取的路径为:http://www.ceic.ac.cn/ajax/speedsearch?num=[数字1]&&page=[数字2]

我们的目标是做一次全量和每日增量地震数据爬取,因而仅需请求路径:

全量 http://www.ceic.ac.cn/ajax/speedsearch?num=6&&page=[页码]

增量 http://www.ceic.ac.cn/ajax/speedsearch?num=1&&page=[页码]

分析响应报文

浏览器内输入:http://www.ceic.ac.cn/ajax/speedsearch?num=6&&page=1


响应报文为Unicode格式,通过在线工具(http://www.jsons.cn/unicode)进行转码分析


返回值为一个元组,只有一个json格式的元素,通过在线工具(https://www.sojson.com)进行格式化分析,有效数据为键为shuju的值,值类型为地震数据列表,列表元素有这几个键值是我们关心的:M(震级)、O_TIME(发震时刻)、EPI_LAT(震中纬度)、EPI_LON(震中经度)、EPI_DEPTH(震深)、LOCATION_C(地震位置)、id(数据唯一ID,用以后期增量判重)

数据存储规划

在Mysql的GEO_DB数据库中新建数据表EARTHQUAKE

CREATE TABLE `EARTHQUAKE` (`EARTHQUAKE_LEVEL` float(3,1) DEFAULT NULL COMMENT '地震级别',`EARTHQUAKE_TIME` datetime(6) DEFAULT NULL COMMENT '地震时间',`EARTHQUAKE_LON` float(5,2) DEFAULT NULL COMMENT '震中经度',`EARTHQUAKE_LAT` float(5,2) DEFAULT NULL COMMENT '震中纬度',`EARTHQUAKE_DEPTH` bigint(10) DEFAULT NULL COMMENT '震中深度',`EARTHQUAKE_ADDRESS` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '震中地点',`VERSION` datetime(6) DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',`DID` varchar(20) CHARACTER SET utf8 DEFAULT NULL COMMENT '数据唯一ID'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Scrapy代码实现

Scrapy工作原理

项目创建

# 创建爬虫项目
>> scrapy startproject earthquake
>> cd earthquake/earthquake
# 创建全量爬虫任务
>> scrapy genspider full_mount "www.ceic.ac.cn"
# 创建增量爬虫任务
>> scrapy genspider increment "www.ceic.ac.cn"

目录结构如下

  1. 修改配置文件setting.py相关配置,添加Mysql连接参数
# 避开防爬虫规则
ROBOTSTXT_OBEY = False
# 打开默认爬虫任务
ITEM_PIPELINES = {'earthquake.pipelines.EarthquakePipeline': 300,
}
# Mysql连接参数
MYSQL_HOST = '***.***.***.***'
MYSQL_PORT = **
MYSQL_USER = '***'
MYSQL_PASSWORD = '***'
MYSQL_DB = '***'
  1. 实现数据模型 items.py
# -*- coding: utf-8 -*-
"""
地震数据模型
"""
import scrapyclass EarthquakeItem(scrapy.Item):earthquake_level = scrapy.Field()earthquake_time = scrapy.Field()earthquake_lon = scrapy.Field()earthquake_lat = scrapy.Field()earthquake_depth = scrapy.Field()earthquake_address = scrapy.Field()version = scrapy.Field()did = scrapy.Field()
  1. 实现全量爬虫 full_mount.py文件
# -*- coding: utf-8 -*-
"""
全量爬取1年内全球地震数据
"""
import scrapy
from ..items import EarthquakeItemclass FullMountSpider(scrapy.Spider):name = 'full_mount'allowed_domains = ['www.ceic.ac.cn']# 起始爬取路径start_url = 'http://www.ceic.ac.cn/ajax/speedsearch?num=6&&page='# 爬取页码循环次数MAX_PAGE = 60def start_requests(self):# 遍历各页for i in range(1, self.MAX_PAGE+1):yield scrapy.Request('%s%d' % (self.start_url, i), callback=self.parse, dont_filter=True)def parse(self, response):result=eval(response.body.decode('utf-8'))records=result['shuju']for record in records:item=EarthquakeItem()item['earthquake_level']=record['M']item['earthquake_time']=record['O_TIME']item['earthquake_lon']=record['EPI_LON']item['earthquake_lat']=record['EPI_LAT']item['earthquake_depth']=record['EPI_DEPTH']item['earthquake_address']=record['LOCATION_C']item['did']=record['id']yield item
  1. 实现增量爬虫 increment.py文件
# -*- coding: utf-8 -*-
"""
增量爬取24小时内全球地震数据
"""
import scrapy
from ..items import EarthquakeItemclass IncrementSpider(scrapy.Spider):name = 'increment'allowed_domains = ['www.ceic.ac.cn']# 起始爬取路径start_url = 'http://www.ceic.ac.cn/ajax/speedsearch?num=1&&page='# 爬取页码循环次数MAX_PAGE = 1def start_requests(self):# 遍历各页for i in range(1, self.MAX_PAGE+1):yield scrapy.Request('%s%d' % (self.start_url, i), callback=self.parse, dont_filter=True)def parse(self, response):result=eval(response.body.decode('utf-8'))records=result['shuju']for record in records:item=EarthquakeItem()item['earthquake_level']=record['M']item['earthquake_time']=record['O_TIME']item['earthquake_lon']=record['EPI_LON']item['earthquake_lat']=record['EPI_LAT']item['earthquake_depth']=record['EPI_DEPTH']item['earthquake_address']=record['LOCATION_C']item['did']=record['id']yield item
  1. 将爬取的数据插入Mysql数据库 pipelines.py
# -*- coding: utf-8 -*-
"""
爬取数据入库Mysql
"""
import pymysql
import logging
logging.getLogger().setLevel(logging.INFO)from scrapy.utils.project import get_project_settings
settings = get_project_settings()class EarthquakePipeline(object):def open_spider(self, spider):# Mysql连接参数host = settings['MYSQL_HOST']port = settings['MYSQL_PORT']user = settings['MYSQL_USER']password = settings['MYSQL_PASSWORD']database = settings['MYSQL_DB']try:self.conn = pymysql.connect(host=host, port=port, user=user, password=password, database=database)logging.info('Mysql数据库连接成功。')except Exception as e:logging.error('Mysql数据库连接失败!')raise edef process_item(self, item, spider):# 判断是否已存在记录select_sql = 'SELECT COUNT(1) AS CNT FROM EARTHQUAKE WHERE DID=\'%s\''%(item['did'])try:cursor = self.conn.cursor()cursor.execute(select_sql)result_count,=cursor.fetchone()if result_count>0:logging.info('数据已存在,无需重复录入!')return itemexcept Exception as e:logging.error('数据查询错误:%s' % select_sql)return item# 插入新记录insert_sql = 'INSERT INTO EARTHQUAKE(DID,EARTHQUAKE_LEVEL,EARTHQUAKE_TIME,EARTHQUAKE_LON,EARTHQUAKE_LAT,EARTHQUAKE_DEPTH,EARTHQUAKE_ADDRESS,VERSION) VALUES(\'%s\',%s,\'%s\',%s,%s,%s,\'%s\',now())' % (item['did'], item['earthquake_level'], item['earthquake_time'], item['earthquake_lon'], item['earthquake_lat'], item['earthquake_depth'], item['earthquake_address'])try:cursor = self.conn.cursor()cursor.execute(insert_sql)logging.info('插入数据成功!')except Exception as e:logging.error('插入数据错误:%s' % insert_sql)self.conn.rollback()return itemself.conn.commit()return itemdef close_spider(self, spider):self.conn.close()logging.info('Mysql数据库连接已关闭。')

全量爬取执行

# 爬取一年内全部地震数据
>> scrapy crawl full_mount

增量爬取执行

# 爬取24小时内全部地震数据
>> scrapy crawl increment

爬取结果

SELECT * FROM `GEO_DB`.`EARTHQUAKE` LIMIT 1000;

完整代码查看

https://gitee.com/angryshar128/Spider.git

Scrapy爬取中国地震台网1年内地震数据相关推荐

  1. Java爬取中国天气网实况天气数据

    因实验室需求,需要找一个实况天气API. 百度云.阿里云.腾讯云上边我都去找了,很多平台要么没有,要么要收费(免费的可调用次数太少了).而我在高德开放平台上找到了一个,但是不符合要求,被老师pass掉 ...

  2. 用scrapy爬取Kelly Blue Book二手车网数据

    这是我以前的一篇博文:数学建模用/Python爬虫实战--爬取Kelley Blue Book(KBB二手车交易网站)的交易信息 这是我在去年数学建模校赛时候写的一个爬虫,用来获得数据分析需要的数据信 ...

  3. python scrapy 爬取包含iframe标签内的数据

    如图所示: 所要提取的数据都在iframe标签里面的,直接用xpath提取iframe标签里的内容是提取不到的, 看到图一有一个script 所有的数据都在这个js标签内的,展开script标签后会看 ...

  4. python爬取京东手机数据_用scrapy爬取京东的数据

    本文目的是使用scrapy爬取京东上所有的手机数据,并将数据保存到MongoDB中. 一.项目介绍 主要目标 1.使用scrapy爬取京东上所有的手机数据 2.将爬取的数据存储到MongoDB 环境 ...

  5. 使用scrapy爬取京东的手机数据

     使用scrapy爬取京东的数据 本文目的是使用scrapy爬取京东上所有的手机数据,并将数据保存到MongoDB中 一.项目介绍 主要目标 使用scrapy爬取京东上所有的手机数据 将爬取的数据存储 ...

  6. 用Python爬取中国各省GDP数据

    介绍 在数据分析和经济研究中,了解中国各省份的GDP数据是非常重要的.然而,手动收集这些数据可能是一项繁琐且费时的任务.幸运的是,Python提供了一些强大的工具和库,使我们能够自动化地从互联网上爬取 ...

  7. 爬取中国最好大学网数据(Python的Scrapy框架与Xpath联合运用)

    前言        大二上学期学校外出实习,做了一个关于爬取中国最好大学网http://www.zuihaodaxue.com/rankings.html的项目用的这个Scrapy框架,多线程还挺好用 ...

  8. 使用scrapy框架爬取中国各城市天气预报 实验

    使用scrapy框架爬取山东各城市天气预报 实验 实验目的: 熟练安装 Python 扩展库 scrapy. 熟悉常见 HTML 标签的用法. 理解网页源代码结构. 理解 scrapy 框架工作原理. ...

  9. scrapy-redis案例(一)爬取中国红娘相亲网站

    前言:本案例将分为三篇. 第一篇,使用scrapy框架来实现爬取中国红娘相亲网站. 第二篇,使用scrapy-redis 简单的方式爬取中国红娘相亲网站.(使用redis存储数据,请求具有持续性,但不 ...

最新文章

  1. Leetcode1713. 得到子序列的最少操作次数[C++题解]:LCS转化成LIS,转化为nlogn做法
  2. 全球及中国食品供应区块链行业运行形势及未来投资规模建议报告2021年版
  3. IO流文件的相对路径及获取系统路径方法
  4. Hopsan -- 液压、电力等行业的仿真开源软件
  5. jstack 线程状态分析_面试官:说说你是怎么用JDK监控和故障处理工具的吧?例如jstack...
  6. 11.springcloud的springconfig配置
  7. 2007-11-22 21:24 大端(Big Endian)与小端(Little Endian)详解
  8. mysql ,show slave status详解
  9. ubuntu服务器系统管理软件,安装 Webmin 来管理你的 Ubuntu 主机
  10. VBA员工出差管理系统(上)
  11. java代码c3p0连接池配置,c3p0连接池acquireincrement属性配置详解
  12. SOP24/SSOP24低功耗LCD驱动芯片VK1056B规格书下载
  13. 软件促进两化深度融合 ——记2016中国软件和信息技术服务业发展高峰论坛
  14. php + redis 实现延迟队列
  15. 【信息系统项目管理师】干系人管理
  16. 域名到期查询如何查看?有什么新方法吗?
  17. 2022华中杯数学建模思路
  18. js 时间戳和时间的处理
  19. 九九八十一难|R一步安装TSA包
  20. 机器学习(二)--sklearn之逻辑斯蒂回归和朴素贝叶斯

热门文章

  1. 大学生、办公人员电脑必备的10款实用软件 简直是太好用了
  2. Windows On Top v3.8.0 Windows窗口置顶小工具单文件版
  3. 网上千万不要在非官方直营店铺买的商品排行榜
  4. 苹果手机fiddler代理后无法联网的问题
  5. 美国国防部发布集成化无人系统路线图
  6. mac一体机win7下调节亮度方法
  7. hihoCoder#1082 : 然而沼跃鱼早就看穿了一切(做题总结)
  8. Python实战——自动生成情人节对女朋友表白玫瑰花、爱心,以及用Python画一颗樱花树,愿祖国繁花与共!
  9. 设计模式之Reactor反应堆
  10. 2021阳城一中高考成绩查询入口,2019阳城一中录取分数线(附2019高考成绩喜报)...