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

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...")

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,759评论 0 38
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 13,224评论 0 13
  • 我好像是裁取了小时候的一个午后。很小很小,小到还没有读《论语》没有读《飘》,或者干脆小到还没有识字。这样一个午后,...
    何青猊阅读 2,507评论 0 0
  • 前路, 荆棘丛生, 漫漫无光, 但, 我也将褪去软弱 怯懦,畏惧。 勇敢的心化为利剑, 劈尽所有阻碍! 即使, 受...
    莫嵇雪阅读 2,939评论 5 8
  • 获取Python字符串中的某字符可以使用索引: 截取字符串中的一段字符串可以使用切片,切片在方括号中使用冒号:来分...
    忽如寄阅读 37,564评论 0 7

友情链接更多精彩内容