Python爬虫--爬取历史天气数据
写在前面:爬虫是老鼠屎在进入实验室后接触的第一个任务,当时刚刚接触代码的老鼠屎一下子迎来了地狱难度的爬微博签到数据。爬了一个多月毫无成果,所幸带我的师兄从未给我疾言厉色,他给与了我最大的包容与理解。尽管无功而返,但是那一个月也给了老鼠屎充足的学习时间,让老鼠屎对爬虫有了一点点的理解和执念。今天老鼠屎由于项目原因又需要爬天气数据,所以在这里把老鼠屎的一点经验写在这里,希望能给向曾经的我一样迷茫的朋友们一点点帮助,付出的努力总会在不经意的时候绽放
目录
1 所需要的库
爬虫用到了requests库和BeautifulSoup库,这两个库分别用于对网页的获取和分析,对于数据的整理用到了pandas库。这三个库的安装非常简单,直接在cmd或者powershell当中pip install即可。唯一需要注意的是BeautifulSoup库安装时是在cmd中输入pip install beautifulsoup4。安装有问题的童鞋可以参考老鼠屎的旧博文进行安装。安装好后即可导入所需的库。
import requests
from bs4 import BeautifulSoup
import pandas as pd
2 爬取数据
2.1 获取网页内容
这里,老鼠屎爬取的是天气网上青岛2016年3月的数据。
红色方框内容为网页的url,这里需要用requests库进行请求。
url = "https://lishi.tianqi.com/qingdao/201603.html"
response = requests.get(url)
可以看一下response:。状态码为200证明请求成功。
2.2 对网页进行解析
对网页解析用到BeautifulSoup库。
soup = BeautifulSoup(response.text, 'html.parser')
我们可以看一下现在的soup
这里有网页里所有的内容。我们需要从这里提取出我们想要的内容。我们回到要爬取的网页,按F12可以看到网页的源码。
这里我们要爬的是左下角的天气数据。我们点击中间上方红色框框住的箭头按钮,点击要爬取的内容,即可在右面网页源码快速找到它所对应的部分。
我们可以发现,所需要的内容都在<div class="tqtongji2">标签下。每个<ul>里面包含一天的天气,每个<li>里面有不同的内容(如日期、天气、最高气温、最低气温等)。我们可以用BeautifulSoup里面的find和find_all来选取想要的内容。
tqtongji2=soup.find("div",{"class":"tqtongji2"})
ul_all=tqtongji2.find_all("ul")
data_all=[]
for i in ul_all:
li_all=i.find_all("li")
data=[]
for j in li_all:
data.append(j.text)
data_all.append(data)
可以看一下现在的data_all的样子
3 数据的整理与存储
接下来就是为数据存储做准备啦。把数据放到DataFrame里面,之后保存至csv即可。
weather=pd.DataFrame(data_all)
weather.columns=["日期","最高气温","最低气温","天气","风向","风力"]
weather.drop([0],inplace=True)
weather.to_csv("xxx.csv",encoding="utf_8_sig")
这里需要注意的是,因为内容中有中文,直接保存会乱码,所以保存时要加上encoding="utf_8_sig"。详细情况可以参考老鼠屎的旧博文。
4 全部代码
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = "https://lishi.tianqi.com/qingdao/201603.html"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
tqtongji2=soup.find("div",{"class":"tqtongji2"})
ul_all=tqtongji2.find_all("ul")
data_all=[]
for i in ul_all:
li_all=i.find_all("li")
data=[]
for j in li_all:
data.append(j.text)
data_all.append(data)
weather=pd.DataFrame(data_all)
weather.columns=["日期","最高气温","最低气温","天气","风向","风力"]
weather.drop([0],inplace=True)
weather.to_csv("xxx.csv",encoding="utf_8_sig")
5 推荐资料
最后推荐一点老鼠屎认为不错的资料。
- 嵩天老师的《Python网络爬虫与信息提取》课程。这个课程可以在中国大学MOOC网站上找到,是给免费的课程。老师的讲解十分清晰,对于想要入门爬虫的童鞋来说是个不错的选择。
- 崔庆才的《Python3网络爬虫开发实战教程》。里面的讲解非常细致,对于概念的讲解也深入浅出。
写在后面:尽管老鼠屎爬的这个是个非常简单的例子,但是老鼠屎希望通过自己的亲身经历鼓励那些迷茫的童鞋们不要抛弃不要放弃。希望大家都能够学有所成