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

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

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

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

国内城市历史天气

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

*********** ***********

国内城市历史天气

于是我们就利用查询语句,查到城市链接所在的内容,内容放在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)

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

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

你可能感兴趣的:(爬虫,python)