美文网首页
2018-07-18气象爬虫数据2

2018-07-18气象爬虫数据2

作者: 加勒比海带_4bbc | 来源:发表于2018-07-18 17:04 被阅读0次

coding=utf-8

from selenium import webdriver
from bs4 import BeautifulSoup
import pymongo
import xlwt

main function entry:

if name == 'main':
print("准备开始爬取目标网页!")
print('----------------------------------------------------------')
URL = "http://typhoon.weather.com.cn/gis/typhoon_p.shtml"

browser = webdriver.Firefox()  # 创建浏览器对象
browser.get(URL)  # 打开页面,并加载内容,渲染对象
response = browser.page_source  # 获取页面的html源码

sourceData = response.encode()

fobj = open("data2.txt", 'wb')
fobj.write(sourceData)
fobj.close()
print("网页数据爬取完毕!")
print('----------------------------------------------------------')

print("开始数据处理!")
print('----------------------------------------------------------')
f = open("./data2.txt", encoding='UTF-8')
lines = f.readlines()
#print(str(lines))
soup = BeautifulSoup( str(lines),'lxml')
#print(soup.prettify())
#只输出第一个span标签的内容 .string表示输出标签内的内容
#print(soup.span.string)
#.contents .children表示输出该节点下的所有自己节点
#print(soup.span.contents)
#.next_siblings .previous_siblings表示输出该节点前后节点
#print(soup.span.next)
#print(soup.span.previous)
#findall找出所有匹配
#print(soup.find_all('span')[163].string)
#print(len(soup.find_all('span')))
#print(soup.find_all('span')[0].string[0])
#print(len(soup.find_all('span'))/4)
#建立数组添加标题
a = []
b = []
c = []
a.append('时间')
a.append('经纬度')
a.append('气压(hPa)')
a.append('风速(m/s)')
#将所有符合初步筛选结果的数据填入数组
for i in range(int(len(soup.find_all('span'))/4)):
    #if soup.find_all('span')[i*4].string[0] == True:
        #if soup.find_all('span')[i * 4].string[0].equal(2):
            a.append(soup.find_all('span')[i * 4].string)
            a.append(soup.find_all('span')[i * 4 + 1].string)
            a.append(soup.find_all('span')[i * 4 + 2].string)
            a.append(soup.find_all('span')[i * 4 + 3].string)
    #print(i)
#保存数据标题
c.append(a[0])
c.append(a[2])
c.append(a[3])
c.append('经度')

最后筛选获得需要的台风数据

for j in range(int((len(a)/4))):
#print('j',j)
#print(a[0])
if a[0]:
#print(111)
#print('a[j][0]///////',a[j][0])
if a[0][0] != '2':
#print(222)
a.pop(0)
if a[0]:
if a[0][0] == '2':
b.append(a[0])
a.pop(0)
if a[0]:
if a[0][0] == '2':
b.append(a[0])
a.pop(0)
if a[0]:
if a[0][0] == '2':
b.append(a[0])
a.pop(0)
if a[0]:
if a[0][0] == '2':
b.append(a[0])
#print('------------------------------')
#print(a[0])
#print(a[1])
#print(a[2])
#print(a[3])
#print('------------------------------')
else:
#print(333)
a.pop(0)
if a[0]:
if a[0][0] == '2':
b.append(a[0])
a.pop(0)
if a[0]:
if a[0][0] == '2':
b.append(a[0])
a.pop(0)
if a[0]:
if a[0][0] == '2':
b.append(a[0])
a.pop(0)
if a[0]:
if a[0][0] == '2':
b.append(a[0])
#print('------------------------------')
#print(a[0])
#print(a[1])
#print(a[2])
#print(a[3])
#print('------------------------------')

最终的数据处理补丁防止html的格式出现变化只保留所需的信息:注保留了一个多余的数据作为台风登陆的标记信息,样例如下:

时间 经纬度 气压(hPa) 风速(m/s)

2018-07-11 10时 26.3N/119.5E 970 35

2018-07-11 09时 26.40000N/119.85000E null null

2018-07-11 09时 26.4N/119.9E 960 42

第二条多余的无效信息则为台风登陆的时间和地点信息

for k in range(int((len(a)))):
if not a[k]:
a.pop(0)
if a[k] and not a[k + 1]:
a.pop(0)
if a[k][0] == '2' and a[k + 4][0] == '2':
break
else:
a.pop(0)

for k in range(int((len(a)))):

#if not a[k]:

a.pop(0)

#if a[k][0] == '2' and a[k + 4][0] == '2':
    #break
#else:
    #a.pop(0)

临时数据存放为了分开爬取数据中的经纬度

jd = []
wd = []
for i in range(int((len(a) / 4))):
jd1 = []
wd1 = []
flag = 0
for j in range(int(len(a[i * 4 + 1]))):
if a[i * 4 + 1][j] == '/':
flag = 1
continue
else:
if a[i * 4 + 1][j] == 'N':
continue
else:
if flag == 0:
wd1.append(a[i * 4 + 1][j])
if a[i * 4 + 1][j] == 'E':
continue
else:
if flag == 1:
jd1.append(a[i * 4 + 1][j])
if int(len(jd1)) == 3:
# print(jd1[0],' ',jd1[1],' ',jd1[2],' ')
jd.append(int(jd1[0]) * 100 + int(jd1[1]) * 10 + int(jd1[2]))
else:
jd.append(int(jd1[0]) * 100 + int(jd1[1]) * 10 + int(jd1[2]) + int(jd1[4]) * 0.1)
if int(len(wd1)) == 2:
wd.append(int(wd1[0]) * 10 + int(wd1[1]))
else:
wd.append(int(wd1[0]) * 10 + int(wd1[1]) + int(wd1[3]) * 0.1)
# print('jd',jd)
# print('wd',wd)

print('jd',jd)

print(len(jd))

print('wd',wd)

print(len(wd))

print("数据处理完毕!")
print('----------------------------------------------------------')

打印输出最后的结果

print(len(a))

for p in range(len(b)):
if '活动中' in b[p]:
print(b[p])
print(" ", '时间', " ",'经纬度', " ", '气压(hPa)', " ", '风速(m/s)')
for k in range(int((len(a)/4))):
#print('wwwwwwwwwwww')
print(a[k4]," ",a[k4+1]," ",a[k4+2]," ",a[k4+3])

f.close()

将数存入excle中

print('----------------------------------------------------------')
workbook = xlwt.Workbook(encoding='utf-8')
booksheet = workbook.add_sheet('Sheet 1', cell_overwrite_ok=True)

写入标题

for i in range(5):
booksheet.write(0,i,c[i])

写入数据

for j in range(int((len(a)/4))):
if a[j*4+2] != "null":
booksheet.write(j + 1, 0, a[j * 4])
booksheet.write(j + 1, 3, jd[j])
booksheet.write(j + 1, 4, wd[j])

    booksheet.write(j + 1, 1, a[j*4+2])
    booksheet.write(j + 1, 2, a[j*4+3])
else:
    continue

workbook.save('台风.xls')

print("数据已成功导入Excle中!")

将数存入mongodb中

print('----------------------------------------------------------')
client = pymongo.MongoClient()
db = client.mydb # 连接mydb数据库,没有则自动创建
my_set = db.taifeng_set # 使用集合,没有则自动创建
my_set.remove()#先清空表中原有的内容防止重复
for q in range(int((len(a)/4))):
my_set.insert({"时间": a[q4], "经度": jd[q], "纬度": wd[q],"气压(hPa)": a[q4+2], "风速(m/s)": a[q*4+3]})
for i in my_set.find():
print(i)
print('----------------------------------------------------------')
print("数据已成功导入Mongodb中!")
print('----------------------------------------------------------')
print("end...")

相关文章

网友评论

      本文标题:2018-07-18气象爬虫数据2

      本文链接:https://www.haomeiwen.com/subject/sjqapftx.html