项目介绍:
地震(英文名称: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()