Python 简单的爬虫案例——获取历史天气(一)

本文介绍使用Python爬虫技术抓取历史天气数据的全过程,包括安装requests和bs4库,解析天气网站获取城市历史天气链接,以及提取各城市每月天气详情。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python 简单的爬虫案例——获取历史天气(一)

1 前期准备
安装requests和bs4包,这两个库是爬虫常用的包,简单实用。
建议用pip匹配安装Python包。具体步骤简单介绍一下请参照如何用pip安装模块和包
2 具体过程
我们的目标是获得天气网(天气网链接)中各个城市过去十年每一天的天气情况。
天气网页面如下:

![天气网城市历史天气](https://img-blog.youkuaiyun.com/20180826105510906?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjA2MjM1Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
如果我们想要获得阿城历史天气,需要点击网页中阿城,转到如下页面:
![阿城历史天气](https://img-blog.youkuaiyun.com/20180826105818202?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjA2MjM1Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
该页面中显示阿城历史每个月的天气,点击页面中2018年07月天气,可以看到7月每一天的天气状况,如下图所示:
![7月天气](https://img-blog.youkuaiyun.com/20180826110040957?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjA2MjM1Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
如果是人工获得全国城市的历史天气,则 极其麻烦,并且十分消耗时间 采用Python进行获取,则显得十分省事。大致思路如下: 获取城市链接——>获取月份链接——>获取天气状况——>存到txt文本 最终结果如下所示:
![这里写图片描述](https://img-blog.youkuaiyun.com/2018082611274166?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjA2MjM1Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) ![这里写图片描述](https://img-blog.youkuaiyun.com/20180826112756292?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjA2MjM1Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
1)获取城市链接 打开网页([天气网链接](http://lishi.tianqi.com/)),右击网页—查看源代码,如下所示,可以看到阿城的历史链接,我们这一步的目的是获得城市链接:
![这里写图片描述](https://img-blog.youkuaiyun.com/20180826112122379?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjA2MjM1Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
代码如下所示:
import requests
import bs4
response = requests.get('http://lishi.tianqi.com/')
soup = bs4.BeautifulSoup(response.text,"html.parser")

arrCityName = [] #城市名称
arrCityLink = [] #城市链接

#选出内容所在区域
for tagone in soup.find_all('div', id="cityall"):
    for tagtwo in tagone.find_all('div',id="tool_site"):
        #获取城市链接
        for a in tagtwo.select('a'):
            print(a.get('href'))
            arrCityLink.append(a.get('href'))
        #获取城市名称
        for a in tagtwo.select('a'):
            print(a.text)
            arrCityName.append(a.text)

结果如下所示:

![这里写图片描述](https://img-blog.youkuaiyun.com/20180826114000305?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjA2MjM1Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) ![这里写图片描述](https://img-blog.youkuaiyun.com/20180826114008861?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjA2MjM1Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
代码解释

a 获取网页全部内容

response = requests.get('http://lishi.tianqi.com/')
soup = bs4.BeautifulSoup(response.text,"html.parser")

这两句代码的目的是将网址中的内容传给soup变量 。
b 查找城市链接所在的代码块
接下来需要找到城市链接所在的代码块,如下代码所示:在html语言中,对应的div语句为一整块。

<div class="box-hd">
	  <h3 class="box-t-l">国内城市历史天气</h3>
</div>

从网页源代码中,我们发现城市历史链接在如下代码块中(id="cityall"下的id="tool_site"中):

<div id="cityall">
<div class="lishi01"><script>lishi_index_01();</script></div>
	<div class="crl mb5"></div>

	<div align="center" class="travel_js">
	***********
	***********
	<div id="tool_site" class="box-base">
	<div class="box-hd">
	  <h3 class="box-t-l">国内城市历史天气</h3>
	</div>
	<div style="padding:10px 15px 20px 15px">
	  	  <ul class="bcity" id="city_A">
		<li><a href="#" class="one" title="A">A</a></li>
				<li><a href="http://lishi.tianqi.com/acheng/index.html" title="阿城历史天气" target="_blank">阿城</a></li>	
				<li><a href="http://lishi.tianqi.com/anda/index.html" title="安达历史天气" target="_blank">安达</a></li>	
				<li><a href="http://lishi.tianqi.com/antu/index.html" title="安图历史天气" target="_blank">安图</a></li>	
				<li><a href="http://lishi.tianqi.com/anshan/index.html" title="鞍山历史天气" target="_blank">鞍山</a></li>	
				<li><a href="http://lishi.tianqi.com/angangxiqu/index.html" title="昂昂溪历史天气" target="_blank">昂昂溪</a></li>	
				<li><a href="http://lishi.tianqi.com/aiminqu/index.html" title="爱民历史天气" target="_blank">爱民</a></li>	
		    
	  </ul>
	  	  <ul class="bcity" id="city_B">
		<li><a href="#" class="one" title="B">B</a></li>
				<li><a href="http://lishi.tianqi.com/beijing/index.html" title="北京历史天气" target="_blank">北京</a></li>	
				<li><a href="http://lishi.tianqi.com/baoshan/index.html" title="宝山历史天气" target="_blank">宝山</a></li>	
	***********
	***********

于是我们就利用查询语句,查到城市链接所在的内容,内容放在tagtwo中,代码如下所示:

for tagone in soup.find_all('div', id="cityall"):
    for tagtwo in tagone.find_all('div',id="tool_site"):

查询代码区域的方法为find_all(***)
c 提取链接和城市名称
找到了城市链接所在块后,我们发现城市链接在标签a中,因此我们需要提取标签a,方法为select(),代码如下:

for a in tagtwo.select('a'):

获得标签a后我们就可以用方法get()来获得标签的属性,用text来获得标签内容,代码如下:

#获取城市链接
for a in tagtwo.select('a'):
    print(a.get('href'))
    arrCityLink.append(a.get('href'))
#获取城市名称
for a in tagtwo.select('a'):
    print(a.text)
    arrCityName.append(a.text)

获得的结果中含有#和字母等无关字符,需要去除,比较简单这里就不在说明。

下一次我们讲述,在获得城市链接后如何获得月份链接和每日天气。
谢谢!祝各位天天开心。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值