爬取中国地震网地震数据

该项目介绍了如何爬取中国地震网的历史地震数据,包括震级、发震时刻、经纬度、深度和参考位置。文章详细阐述了安装环境、分析网站获取链接、数据解析的步骤,并给出了完整的Python爬虫代码,最后将数据保存到Excel文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目介绍:

地震(英文名称:earthquake)又称地动、地振动,是地壳快速释放能量过程中造成的振动,期间会产生地震波的一种自然现象。地球上板块与板块之间相互挤压碰撞,造成板块边沿及板块内部产生错动和破裂,是引起地震的主要原因。 地震开始发生的地点称为震源,震源正上方的地面称为震中。破坏性地震的地面振动最烈处称为极震区,极震区往往也就是震中所在的地区。地震常常造成严重人员伤亡,能引起火灾、水灾、有毒气体泄漏、细菌及放射性物质扩散,还可能造成海啸、滑坡、崩塌、地裂缝等次生灾害。据统计,地球上每年约发生500多万次地震,即每天要发生上万次的地震。其中绝大多数太小或太远,以至于人们感觉不到;真正能对人类造成严重危害的地震大约有十几二十次;能造成特别严重灾害的地震大约有一两次。人们感觉不到的地震,必须用地震仪才能记录下来;不同类型的地震仪能记录不同强度、不同远近的地震。世界上运转着数以千计的各种地震仪器日夜监测着地震的动向。地震成因:地球表层的岩石圈。地壳岩层受力后快速破裂错动引起地表振动或破坏就叫地震。由于地质构造活动引发的地震叫构造地震;由于火山活动造成的地震叫火山地震;固岩层(特别是石灰岩)塌陷引起的地震叫塌陷地震。

确定爬取的网站目标:

http://www.ceic.ac.cn/history

中国地震网的历史数据

获取字段为:震级(M)、发震时刻(UTC+8)、纬度(°) 、经度(°) 、深度(千米) 、 参考位置

安装环境:

pip install requests

pip install json

pip install lxml

pip install openpyxl

pip install time

pip install cchardet

pip install datetime

pip install pymysql

分析网站获取链接:

通过检查工具分析网站所有的请求链接

在这里插入图片描述

发现数据变化的是page和尾巴两个参数,page代表的是当前的页面 最后一个参数是一个时间戳 我们可以使用时间戳转换工具转换一下看看

在这里插入图片描述

可以看出转换后是当前访问网站的时间,我们可以datetime获取当前时间并转换成时间戳

在这里插入图片描述

对url进行拼接操作:

在这里插入图片描述

使用requests进行爬取 ,爬取过程中发现出现乱码的情况 使用cchardet检测字节是属于什么类型的编码 然后对于编码做一个转换

在这里插入图片描述
.
对请求下来的内容进行解析发现无法直接解析在请求下来内容前面有一串参数,

在这里插入图片描述

对于他进行删除在放到转换器上转换

在这里插入图片描述

删除后直接转换成字典类型

在这里插入图片描述

数据解析:

在这里插入图片描述

解析出来需要的内容:

在这里插入图片描述

完整思路:

创建数据并且循环出所有的页面page参数 将参数传递给链接拼接函数 main()

在这里插入图片描述

对于所有的链接进行拼接然后将链接传递给请求函数
在这里插入图片描述

对于所有链接进行请求,请求下来的内容传递给分析函数

在这里插入图片描述

对请求的内容进行解析 并保存进数据库

在这里插入图片描述

在这里插入图片描述

将数据保存进exel:

在这里插入图片描述

在这里插入图片描述

完整代码

list1=[]
def main(page):
    #链接后的参数是一个时间戳  所以实时获取当前时间 然后转换成时间戳
    times=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    timeArray = time.strptime(times, "%Y-%m-%d %H:%M:%S")
    timeStamp = int(time.mktime(timeArray))#转换时间戳
    time.sleep(5)
    url=f'http://www.ceic.ac.cn/ajax/search?page={page}&&start=2000-12-06&&end=2020-12-06&&jingdu1=&&jingdu2=&&weidu1=&&weidu2=&&height1=&&height2=&&zhenji1=&&zhenji2=&&callback=jQuery180031232585725055584_1607253668377&_={timeStamp}'
    html=download(url)#将生成的链接传入数据请求函数
    # print(html)
    parst_html(html)
    downloader(list1)#将获取到的数据传入保存函数处理
    # print(list1)
    
def download(url):
    headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36"}
    data=requests.get(url,headers)
    encoding=cchardet.detect(data.content)['encoding']
    html=data.content.decode(encoding)
    return html


def parst_html(html):
    print("连接成功")
    # 因为请求下来的数据前有一个数据无法直接对他进行转换所以我们将他进行删除
    
    json_data =html.replace('jQuery180031232585725055584_1607253668377','')#删除请求下来的数据中前的一段数据
    json_data = eval(json_data)#转换成字典
    for i in json_data['shuju']:
        latitude=i['EPI_LAT']#维度
        longitude=i['EPI_LON']#经度
        depth=i['EPI_DEPTH']#深度
        location=i['LOCATION_C']#参考位置
        timg=i['SYNC_TIME']#时间
        Magnitude=i['M']#震级
        print(Magnitude)
        list1.append([latitude,longitude,depth,location,timg,Magnitude])
        cursor.execute("insert into sina2(latitude,longitude,depth,location,timg,Magnitude) values('{}','{}','{}','{}','{}','{}')".format(latitude,longitude,depth,location,timg,Magnitude))
def downloader(list1):
    pass
    # 将数据保存成xlsx
    wb = openpyxl.Workbook()
    sheet = wb.active
    sheet.title = "dizhengshuju"  
    for row in list1:
        sheet.append(row)
    wb.save("dizhengshuju6.xlsx")
    print("成功")

if __name__=='__main__':
    com=pymysql.connect(host="127.0.0.1",port=3306,user="root",password="xufujie",db="edu")
    try:
        with com.cursor() as cursor:
            
            sql1='''
                DROP TABLE IF EXISTS `sina2`
            '''
            cursor.execute(sql1)
            sql='''
                create table `sina2`(`id` int(11)not null auto_increment,
                `latitude` varchar(255) ,primary key(`id`),
                `longitude` varchar(255) ,
                `depth` varchar(255),
                `location` varchar(255),
                `timg` varchar(255),
                `Magnitude` varchar(255))
                engine=innodb auto_Increment=1 default charset=utf8;
            '''
            cursor.execute(sql)
            for page in range(1,425):
                main(page)
        com.commit()
    finally:
        com.close()
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值