【Python】Python爬虫爬取中国天气网(一)
0. 本文内容
最近想写一个爬取中国天气网的爬虫。所以打算写一个关于爬虫的系列教程,本文介绍爬虫的基础知识和简单使用。
- 获取HTML文件
- Beautiful Soup4库安装
- Beautiful Soup4对象类型说明
- 爬取网页标题
- 爬取网页图片
1. 关于爬虫
维基百科是这样解释爬虫的。
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。
实现一个爬虫,大致需要三步
- 根据url获取HTML数据
- 解析获取到的HTML数据,获取信息
- 存储数据
1.1 获取HTML文件
HTML是创建网页的标记语言,其中嵌入了文本、图像等数据,然后被浏览器读取并渲染成我们看到的网页的样子。
使用python内置库urllib中的urlopen函数,就可以根据url获取HTML文件。
1.1.1 HTML标签
在HTML中 用于标记的符号称为超文本标记语言标签,HTML标签的组成如下。
- HTML标签以尖括号标识标签名称,如
<title>
- 大多数HTML标签是成对存在的(开始标签和结束标签),如
<head>,</head>
- 也有极少数单独存在的标签,如
<br/>,<hr/>
- 标签中还可以添加属性值。
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类
- Tag:HTML中的标签加上标签内的内容(例如下面的爬取标题)。 它有两个属性(name和attrs),name用来获取标签的名称;attrs用来获取属性。
- NavigableString :标签内部文字的属性。 使用.string可以获得标签内的文字内容
- BeautifulSoup :表示一个文档的全部内容。
- 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 获取网页图片
获取网页中的一张图片步骤如下
- 使用BeautifulSoup中的findall方法获取网页所有图片的url。
- 根据图片的地址,使用 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)
爬取到的图片
- 海量数据迁移之数据抽取流程 (r4笔记第72天)
- CSS Selectors Level 4新特性全面解析
- 巧用外部表避免大量的insert (r4笔记第71天)
- 如何用java语言实现C#中的ref关键字(按引用传递参数)的效果
- 16(01)总结List的子类,ArrayList,Vector,LinkedList
- 16(02)总结泛型
- 基于 React + Webpack 的音乐相册项目(上)
- 16(03)总结增强for循环,静态导入,可变参数
- 基于 React + Webpack 的音乐相册项目(下)
- 通过图表简化sql语句的表关联(r4笔记第70天)
- 通过编程控制CPU利用率(r4笔记第69天)
- Java基础(01)-15总结对象数组,集合Collection,集合List
- 【专业技术】Android内存泄漏简介
- 设计模式之工厂方法(r4笔记第89天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spark Java UDAF 输入struct嵌套结构
- 深入理解Java内存模型
- Mybatis高级查询(一):resultMap与resultType
- JDK错误用法—TimSort
- Mybatis高级查询(三):分页查询
- 以OpenResty搭建RTB竞价引擎接入层
- 优化Linux bootloader速度的究极之路:从GRUB到EFI Stub
- Linux--nc命令
- Netty之美--I/O模型
- 023.基于IT论坛案例学习Elasticsearch(二):Query高级知识(一)
- 打卡群刷题总结0807——验证二叉搜索树
- 打卡群刷题总结0808——二叉树的层序遍历
- Mybatis高级查询(四):延迟加载
- I/O多路复用器之隐秘的角落
- 打卡群刷题总结0809——二叉树的锯齿形层次遍历