利用Python爬虫爬取天气数据

∥☆過路亽.° 提交于 2019-11-26 10:30:00
之前断断续续地学习了python,最近系统地整理了一些,专注于学习python爬虫系列课程,也看了许多关于python爬虫的许多博客文章,也试着参考一些文章的方法进行爬虫实践,结合自己的学习经验,写了一个爬取天气的小程序。
#这个小程序是看了Bo_wen的文章‘http://blog.csdn.net/bo_wen_/article/details/50868339’,结合自己的学习经验,认为这篇文章的方法较为通俗易懂,因此写了这篇文章。

前期准备:

1.准备好一个适合的python编辑器,自己使用的是集成包管理的Anaconda中的Jupyter Notebook,因为便于管理和编写,所以也推荐大家使用这个编辑器。下载地址为:https://www.anaconda.com/download/
2.本文章要使用python库中的requests和BeautifulSoup4库爬取网页和解析网页。因为不是python自带的标准库,所以要手动安装以上两个库。

3.用pip安装以上两个库,首先Win+R打开,输入cmd,点击确认进入管理窗口,输入如下:
pip install requests
pip install beautifulsoup4

网页分析:

下面我们开始爬虫程序的主体部分,我们爬取的是中国天气网中苏州的近7天的天气情况
如下图:

























接下来,右键检查元素,或者F12打开网页源代码,我们查询“6日”这个词,可以看到我们所需要的字段所在的标签位置,如下图:





















我们所需要的字段全部在id=“7d"中的div中的ul中,日期在标签li中的h1标签中,天气情况在第一个p标签中。
最高温度在第二个p标签的span 标签中,最低温度在第二个p标签的 i 标签中。风级在第三个p 标签中的 i 标签中。如下图:

其他几天中的所需字段都是类似的结构,下面我们可以来写我们的主程序。

程序结构:

先导入所需要的requests库和Beautiful Soup4库;
import requests
from bs4 import BeautifulSoup
然后我们写程序的主体框架结构;
def getHTMLText(url):                              #这个函数是为了获取网页信息
    return

def get_data(html):                                #这个函数是从网页中爬取数据,并保存在一个列表中
    return

def print_data(final_list,num):                    #这个函数是为了在列表中将结果打印输出

def main():                                        #主函数,将各个函数连接起来
    url = ' '
    html = getHTMLText(url)
    final_list = get_data(html)
    print_data(final_list,7)
main()
我们来填充第一个函数的内容(def getHTMLText());
def getHTMLText(url,timeout = 30):
    try:
        r = requests.get(url, timeout = 30)       #用requests抓取网页信息
        r.raise_for_status()                      #可以让程序产生异常时停止程序
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return '产生异常'

用requests库的get()方法简明地获取网页信息,采用的try-except结构,在程序出问题的时候能自动停止。第一个函数返回一个网页内容---r.text.

接下来我们来填充第二个函数的内容(def get_data());
def get_data(html):
    final_list = []
    soup = BeautifulSoup(html,'html.parser')       #用BeautifulSoup库解析网页
    body  = soup.body
    data = body.find('div',{'id':'7d'})
    ul = data.find('ul')
    lis = ul.find_all('li')


    for day in lis:
        temp_list = []
        
        date = day.find('h1').string             #找到日期
        temp_list.append(date)     
    
        info = day.find_all('p')                 #找到所有的p标签
        temp_list.append(info[0].string)
    
        if info[1].find('span') is None:          #找到p标签中的第二个值'span'标签——最高温度
            temperature_highest = ' '             #用一个判断是否有最高温度
        else:
            temperature_highest = info[1].find('span').string
            temperature_highest = temperature_highest.replace('℃',' ')
            
        if info[1].find('i') is None:              #找到p标签中的第二个值'i'标签——最高温度
            temperature_lowest = ' '               #用一个判断是否有最低温度
        else:
            temperature_lowest = info[1].find('i').string
            temperature_lowest = temperature_lowest.replace('℃',' ')
            
        temp_list.append(temperature_highest)       #将最高气温添加到temp_list中
        temp_list.append(temperature_lowest)        #将最低气温添加到temp_list中
    
        wind_scale = info[2].find('i').string      #找到p标签的第三个值'i'标签——风级,添加到temp_list中
        temp_list.append(wind_scale)
    
        final_list.append(temp_list)              #将temp_list列表添加到final_list列表中
    return final_list
根据我们之前分析的网页结构的标签树,用 Beautiful Soup 方法解析网页结构,用find()找到对应的标签。再在标签中遍历元素,将其中的文本内容添加到 temp_list 中,再将 temp_list 添加到 final_list 中,最后返回 final_list.

以上的所有数据已经保存在 final_list 中,我们来填充第三个函数的内容,将数据打印输出;
#用format()将结果打印输出
def print_data(final_list,num):
    print("{:^10}\t{:^8}\t{:^8}\t{:^8}\t{:^8}".format('日期','天气','最高温度','最低温度','风级'))
    for i in range(num):    
        final = final_list[i]
        print("{:^10}\t{:^8}\t{:^8}\t{:^8}\t{:^8}".format(final[0],final[1],final[2],final[3],final[4]))
python倾向于用format()打印输出结果。最后的输出结果如下:


















程序代码:

到此,我们的爬虫程序就写完了。下面是全部的代码:
import requests
from bs4 import BeautifulSoup


def getHTMLText(url,timeout = 30):
    try:
        r = requests.get(url, timeout = 30)       #用requests抓取网页信息
        r.raise_for_status()                      #可以让程序产生异常时停止程序
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return '产生异常'
    

def get_data(html):
    final_list = []
    soup = BeautifulSoup(html,'html.parser')       #用BeautifulSoup库解析网页
    body  = soup.body
    data = body.find('div',{'id':'7d'})
    ul = data.find('ul')
    lis = ul.find_all('li')


    for day in lis:
        temp_list = []
        
        date = day.find('h1').string             #找到日期
        temp_list.append(date)     
    
        info = day.find_all('p')                 #找到所有的p标签
        temp_list.append(info[0].string)
    
        if info[1].find('span') is None:          #找到p标签中的第二个值'span'标签——最高温度
            temperature_highest = ' '             #用一个判断是否有最高温度
        else:
            temperature_highest = info[1].find('span').string
            temperature_highest = temperature_highest.replace('℃',' ')
            
        if info[1].find('i') is None:              #找到p标签中的第二个值'i'标签——最高温度
            temperature_lowest = ' '               #用一个判断是否有最低温度
        else:
            temperature_lowest = info[1].find('i').string
            temperature_lowest = temperature_lowest.replace('℃',' ')
            
        temp_list.append(temperature_highest)       #将最高气温添加到temp_list中
        temp_list.append(temperature_lowest)        #将最低气温添加到temp_list中
    
        wind_scale = info[2].find('i').string      #找到p标签的第三个值'i'标签——风级,添加到temp_list中
        temp_list.append(wind_scale)
    
        final_list.append(temp_list)              #将temp_list列表添加到final_list列表中
    return final_list
    
#用format()将结果打印输出
def print_data(final_list,num):
    print("{:^10}\t{:^8}\t{:^8}\t{:^8}\t{:^8}".format('日期','天气','最高温度','最低温度','风级'))
    for i in range(num):    
        final = final_list[i]
        print("{:^10}\t{:^8}\t{:^8}\t{:^8}\t{:^8}".format(final[0],final[1],final[2],final[3],final[4]))
        
#用main()主函数将模块连接
def main():
    url = 'http://www.weather.com.cn/weather/101190401.shtml'
    html = getHTMLText(url)
    final_list = get_data(html)
    print_data(final_list,7)
main()

总结:

1.爬虫主要用requests库和Beautiful Soup库可以简明地爬取网页上的信息;
2.先定好程序主要框架,再根据目的需求填充函数内容:获取网页信息>爬取网页数据>打印输出;
3.最重要的是解析网页结构,最好可以用标签树的形式确定字段所在的标签,并遍历全部标签存储数据。


第一次写博客,学习的python也不太久,文章中有些理解和书写错误,还望大家理解和之处,谢谢!
另外,强烈推荐北京理工大学嵩天老师的python系列课程。
更多关于本人的信息请访问本人网站http://www.o-xunkhun.com/(目前处于申请维护状态)

























易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!