.自己做一个智能语音机器人之三: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.让爬虫找不到需要的内容。把内容用各种办法藏起来,比如把内容作出一张图片。
相关文章推荐
- Python 爬虫入门实战
- MOOC_北理_python爬虫学习_2(入门入门入门级实战)
- 学习笔记(2):零基础掌握 Python 入门到实战-一个圆点的何去何从(一)
- python3 [爬虫入门实战]爬虫之scrapy爬取织梦者网站并存mongoDB
- 学习笔记(4):零基础掌握 Python 入门到实战-一个圆点的何去何从(二)
- 学习笔记(1):零基础掌握 Python 入门到实战-一个圆点的何去何从(一)
- 学习笔记(2):零基础掌握 Python 入门到实战-自己造积木:编写和搭建模块(一)...
- 2019最新零基础21天搞定Python分布式爬虫(分布式网络爬虫入门进阶项目实战)
- Python入门如何给自己写一个文字小游戏?一只小白的Python游戏
- Python爬虫入门笔记:一个简单的爬虫架构
- 学习笔记(1):零基础掌握 Python 入门到实战-一个圆点的何去何从(一)
- python3 [爬虫入门实战]爬虫之scrapy爬取中华人民共和国民政部
- python3 [爬虫入门实战]爬虫之mongoDB数据库的安装配置与可视化
- Python 网络爬虫 002 (入门) 爬取一个网站之前,要了解的知识
- Python爬虫实战入门一:工具准备
- 学习笔记(2):零基础掌握 Python 入门到实战-一个圆点的何去何从(二)
- 学习笔记(2):零基础掌握 Python 入门到实战-一个圆点的何去何从(一)
- 学习笔记(03):零基础掌握 Python 入门到实战-一个圆点的何去何从(三)
- python3 [爬虫入门实战]爬虫之scrapy爬取游天下南京短租房存mongodb
- Python 网络爬虫 002 (入门) 爬取一个网站之前,要了解的知识