您的位置:首页 > 编程语言 > Python开发

.自己做一个智能语音机器人之三:Python爬虫入门实战

2020-08-20 22:11 537 查看

按照我们设想的使用场景,当你问“今天天气怎么样”的时候,智能机器人“小猪”可以播报当天的天气。

Ruby:今天天气怎么样?
小猪:(开始播报当天天气……)

如何获得当天的天气呢?
如果是我们自己的话,可以通过手机app,如墨迹天气,也可以访问天气网站,比如“中国天气网”,但是“小猪”要怎么做,才能获得这些数据呢?
这一篇,我们要介绍的就是,python程序如何从互联网上自动爬取天气数据。
当然,学会了爬取天气数据,爬取其它数据也是一样的,比如新闻、音乐等等。

图解浏览网页的过程

在介绍爬虫技术之前,需要先简单了解一下上网浏览网页的过程。

当我们在电脑里打开浏览器,输入如下内容,并回车,就能访问“中国天气网”,看到上海市当天的天气。

那么在这个过程中,究竟发生了什么呢?

1.当你输入一串由字母、数字、和其它符号组成的内容并回车,你就发出了一个“请求”,你输入的内容称为“地址”。当然,你得保证"地址"是有效的。然后你的“请求”就会被送到对应的“地址”。就如下图的第1步。

2.这个“地址”接受到你的请求后,就会返回一些东西给你。然后,你就在浏览器上看到了一个页面,上面展示了你想要的信息。就如下图的第2步。

但是,我们深入思考第2步,其实有2种可能
第一种:返回的东西就是你在浏览器上看到的页面。
第二种:返回的是别的东西,这个东西给到浏览器之后,浏览器把它变成了你看到的样子。

那么究竟哪一种呢?
我们可以在页面上右击,然后点击“查看网页源代码”

如下图,图里的内容,才是真正返回的东西。
浏览器是拿到这个东西,把它变成了你最终看到的样子。

HTML简介

上图里面的东西,我们称为HTML文件,它是使用HTML语言编写的。
我们在互联网上看到的所有网页的基础都是HTML。

HTML语言也是一门非常简单的语言,虽然想要精通它很困难,但如果只是想简单看懂的话,其实很简单。甚至,马上我们就可以自己用HTML编写一个网页。

在电脑左下角输入“notepad” 或者“记事本”,然后打开一个记事本。

输入如下内容:
I am Ruby! , , 都是HTML语言里的标签,它们一般成对出现。 表示整个文件开始,表示结束 表示head部分的开始,表示结束 表示body部分的开始,表示结束。
要在页面上展示的内容放在body里面。
这里只放了一句简单的话:I am Ruby!

然后把它保存起来,要特别注意的是: 要保存成.html 文件!

最后去保存文件的地方找到它,双击打开文件。
你就能在浏览器里看到最终的样子。
<body>里的内容被展示出来了

我们上网浏览网站,其实也是浏览器把类似于这样的HTML文件展示成五花八门的页面,虽然要复杂得多,但本质上是一样的。

在HTML文件里寻找天气数据

既然知道了“中国天气网”返回的是一个HTML文件,那Python程序是否就可以打开这个文件,然后从文件里面找到天气的数据呢?

以如下这个上海市天气的地址为例

右击“查看页面源代码”

不停地往下找。
终于在629行找到了我们想要的天气数据。

所以,如果想要Python获取到天气数据,需要2步

1.发送“请求”,得到返回的HTML文件
2.从文件里找到天气的数据。

使用Python爬取天气数据

1.发送“请求”,得到返回的HTML文件

如下程序
首先 import requests这个模块
然后使用 request.get(url,headers).content  就能够获得返回的HTML文件,其中url就是你要访问的“地址”,而headers参数暂时不用管它。
得到HTML文件之后,要使用 decode(‘utf-8’) 解码,如果不这么做的话,文件里面的英文都是正常的,但是中文会是乱码。

import requests
def get_weather(url):
headers = {}
text = requests.get(url, headers).content.decode(‘utf-8’)
print(text)

url = ‘http://www.weather.com.cn/weather1d/101020100.shtml’
get_weather(url)

把获取到的内容打印出来,发现和上面使用右击“查看页面源代码”得到的文件内容是一模一样的。

2.从文件里找到天气数据

通过查看文件里的内容,我们知道天气数据在这里:

<input type="hidden" id="hidden_title" value="08月14日20时 周五  多云转晴  38/29°C" />

但Python程序怎么取到 value = 后面的内容呢?

一种比较麻烦的办法是通过字符串的函数,因为整个文件在python里被保存成了一个字符串,使用字符串的函数可以定位到数据的位置并取出来,只不过比较麻烦。

更简单的办法是通过正则表达式。对于模糊的,不定长度内容的查找,正则表达式是一个非常强大的工具。

如下程序
首先import re模块,也即正则表达式模块。
然后首先构建一个匹配模式

re.compile('<input type="hidden" id="hidden_title" value="(.*?)" />')

相当于是说从整个文件里去查找
其中 "(.*?)" 里的内容是随意的,而其它的内容必须一模一样。
最后再通过 findall(text)  函数从 text里进行查找。

import requests
import re
def get_weather(url):
headers = {}
text = requests.get(url, headers).content.decode(‘utf-8’)

pattern = re.compile('<input type="hidden" id="hidden_title" value="(.*?)" />')
weather = pattern.findall(text)

print(weather)

把查找出来的内容打印出来,正是我们所需要的。

这样,我们就成功爬取到了当天的天气数据。

由此看来,做一个爬虫程序好像是非常简单的事情。
但其实不然。很多网站并不想让别人随便爬取它的数据,所以会想尽一切办法来阻止爬虫程序。最基本的2招就是

1.让爬虫获取不到文件。比如说要先登录才可以看到内容。
2.让爬虫找不到需要的内容。把内容用各种办法藏起来,比如把内容作出一张图片。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐