【Python】Python爬虫爬取中国天气网(一)

时间:2022-07-23
本文章向大家介绍【Python】Python爬虫爬取中国天气网(一),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

0. 本文内容

最近想写一个爬取中国天气网的爬虫。所以打算写一个关于爬虫的系列教程,本文介绍爬虫的基础知识和简单使用。

  1. 获取HTML文件
  2. Beautiful Soup4库安装
  3. Beautiful Soup4对象类型说明
  4. 爬取网页标题
  5. 爬取网页图片

1. 关于爬虫

维基百科是这样解释爬虫的。

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。

实现一个爬虫,大致需要三步

  1. 根据url获取HTML数据
  2. 解析获取到的HTML数据,获取信息
  3. 存储数据

1.1 获取HTML文件

HTML是创建网页的标记语言,其中嵌入了文本、图像等数据,然后被浏览器读取并渲染成我们看到的网页的样子。

使用python内置库urllib中的urlopen函数,就可以根据url获取HTML文件。

1.1.1 HTML标签

在HTML中 用于标记的符号称为超文本标记语言标签,HTML标签的组成如下。

  1. HTML标签以尖括号标识标签名称,如<title>
  2. 大多数HTML标签是成对存在的(开始标签和结束标签),如<head>,</head>
  3. 也有极少数单独存在的标签,如<br/>,<hr/>
  4. 标签中还可以添加属性值。

1.1.2 实现方法

这里以中国天气网为例,使用python内置库urllib中的urlopen函数获取该网站的HTML文件。

from urllib.request import urlopen
#使用urlopen获取一个网页的内容
html = urlopen("http://www.weather.com.cn/")
#获取一个网页html内容,并使用decode将其转化为字符串
html_text = bytes.decode(html.read())
print(html_text)

获取到的HTML文件

1.2 解析HTML文件

读取到网页内容后,需要在HTML文件中找到我们需要的信息。这里使用BeautifulSoup库来实现这个功能。

Beautiful库的官网介绍如下

Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

1.2.1 Beautiful Soup4库安装

目前Beautiful Soup4已经被移植到BS4中了,所以安装使用如下命令,我这里使用的清华源。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple bs4

安装成功后,cmd中会显示

Successfully built bs4
Installing collected packages: bs4
Successfully installed bs4-0.0.1

现在在jupyter里使用如下代码测试一下是否成功安装。一定要注意大写

from bs4 import BeautifulSoup

1.2.2 Beautiful Soup4中的对象

Beautiful Soup4将HTML文档转换成树形结构,每个节点都是Python对象。这些对象可以归为4类

  1. Tag:HTML中的标签加上标签内的内容(例如下面的爬取标题)。 它有两个属性(name和attrs),name用来获取标签的名称;attrs用来获取属性。
  2. NavigableString :标签内部文字的属性。 使用.string可以获得标签内的文字内容
  3. BeautifulSoup :表示一个文档的全部内容。
  4. Comment :特殊的NavigableString对象。

1.2.3 获取网页标题

还是以刚才的中国天气网为例,现在我们来爬取它的标题。

from bs4 import  BeautifulSoup as bf
from urllib.request import urlopen
html = urlopen("http://www.weather.com.cn/")
obj = bf(html.read(),'html.parser')
title = obj.head.title
print(title)

爬取到的信息如下

<title>首页-中国天气网</title>

1.2.4 获取网页图片

获取网页中的一张图片步骤如下

  1. 使用BeautifulSoup中的findall方法获取网页所有图片的url。
  2. 根据图片的地址,使用 urllib.urlretrieve函数下载图片。

图片信息一般都包含在'img'标签中,所以我们通过find_all('img')来爬取网页的图片信息。

from bs4 import  BeautifulSoup as bf
from urllib.request import urlopen
#使用urlopen获取一个网页的内容
html = urlopen("http://www.weather.com.cn/")
#解析HTML文件
obj = bf(html.read(),'html.parser')
#获取网页中图片文件的信息
pic = obj.find_all('img')
#输出所有图片信息
for i in pic:
    print(i)

爬取到的图片信息如下

可以看到,图片的属性有class、src和长宽等,src代表链接地址。

得到图片信息后,需要提取图片链接来下载(这里我选的第五张图片),

url = pic[4]['src']

然后使用urllib.urlretrieve函数下载图片。

urllib.urlretrieve(url, '1.png')

完整程序如下

from bs4 import  BeautifulSoup as bf
from urllib.request import urlopen
from urllib.request import urlretrieve
#使用urlopen获取一个网页的内容
html = urlopen("http://www.weather.com.cn/")

obj = bf(html.read(),'html.parser')
title = obj.head.title
pic = obj.find_all('img')
#print (obj.prettify())
url = pic[4]['src']
urlretrieve(url, 'pachong1.png')
print(title)
print(url)

爬取到的图片