爬虫-kaggle数据集Rain_in_AUS的Location气候分类

澳大利亚气象局和澳大利亚建筑规范委员会(ABCB)将澳大利亚不同地区不同城市的所在的气候区域进行划分,总共划分为八个区域,非常适合用来做分类。能够将Rain in Australia数据集中的地点Location转换成对应的气候,这个信息对于预测是否会下雨比较有用。
在google上进行爬虫,爬出每个城市对应的经纬度,并保存在数据city_climate.csv当中。原视频链接:https://www.bilibili.com/video/av39338080/
由于谷歌经常上不了,就另外找了个一个网站https://www.geodatos.net/en/coordinates,输入城市名称可以查询经纬度,如输入Adelaide Australia
爬虫-kaggle数据集Rain_in_AUS的Location气候分类_第1张图片
具体爬虫代码如下:(可能因为网站或者网速不稳定?经常容易跑出错,抛出NoSuchElementException以及TimeoutException错误)

#导入需要的模块
import time
#pip install selenium,安装爬虫使用的selenium
from selenium import webdriver
import pandas as pd
import numpy as np
from lxml import etree
import selenium.webdriver.support.ui as ui

city = pd.read_csv(r"C:\Users\86188\Desktop\coding\kaggle-raininaustralia\cityclimate.csv")#导入原数据
city.head()#查看原数据,第一列是城市名称,第二列是城市对应的气候
#提取城市名称
cityname = city.iloc[:,0]
cityname

爬虫-kaggle数据集Rain_in_AUS的Location气候分类_第2张图片

df = pd.DataFrame(index = cityname.index)#创建新dataframe用于存储爬取的数据
driver_url = r"D:\Anaconda\msedgedriver.exe"
driver = webdriver.Edge(executable_path = driver_url)#调用MS Edge浏览器

time0 = time.time()#计时开始
#循环开始
for num,city in enumerate(cityname):#在城市名称中进行遍历
    driver_url = "https://www.geodatos.net/en/coordinates"
    driver.get(driver_url)    #首先打开MS Edge主页
    time.sleep(0.3)#停留0.3秒,看看发生了什么
    search_box = driver.find_element_by_name(name = "qs")#锁定网站的搜索输入框
    search_box.send_keys("%s Australia" % (city))#在输入框中输入“城市”澳大利亚
    search_box.submit()#enter,确认开始搜索
    resulturl = driver.find_element_by_xpath("/html/body/div[2]/div[1]/ul/li[1]/a").get_attribute("href")#选择第一个超链接
    driver.get(resulturl)#获取第一个超链接的网址
    wait = ui.WebDriverWait(driver,60,1)#在60秒内每隔1秒检查一次
    #WebDriverWait,是指在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为:NoSuchElementException
    wait.until(lambda driver: driver.find_element_by_xpath("/html/body/div[2]/div[1]/div[2]/p"))#知道检查出存在元素href
    result = driver.find_element_by_xpath("/html/body/div[2]/div[1]/div[2]/p").text##爬取需要的经纬度
    resultsplit = result.split(" ")#将爬取的结果用split进行分割
    df.loc[num,"City"] = city#向提前创建好的df中输入爬取的数据,第一列是城市名
    df.loc[num,"Latitude"] = resultsplit[0]#第二列是维度
    df.loc[num,"Longitude"] = resultsplit[2]#第三列是经度
    df.loc[num,"Latitudedir"] = resultsplit[1]#第四列是维度的方向
    df.loc[num,"Longitudedir"] = resultsplit[3]#第五列是经度的方向
    print("%i webcrawler successful for city %s" % (num,city))#每次爬虫成功之后,打印“城市”爬取成功
    
time.sleep(1)#全部爬取完毕后,停留1秒钟
driver.quit()#关闭浏览器
print(time.time()-time0)#打印爬虫花费的时间
#结果:186.37813663482666
df.head()#所有的城市的经纬度数据集

爬虫-kaggle数据集Rain_in_AUS的Location气候分类_第3张图片

df.to_csv(r"C:\Users\86188\Desktop\coding\kaggle-raininaustralia\city_climate.csv",mode ="a+",index=False,header=True)#将数据写入csv文件中

你可能感兴趣的:(机器学习,爬虫,python,数据挖掘)