[TOC]

学习目标

了解数据的获取渠道
掌握爬虫概念
了解网络爬虫及其应用
掌握爬虫的工作原理
了解HTML文档
掌握使用requests和BeautifulSoup编写静态网页的爬虫程序

数据的获取

获取数据的重要性:

  • 数据是大数据处理的基础,获取数据是数据处理和分析的第一步。

如何获取数据:

  • 从一些开源的网站上直接下载相关数据集,比如国外的kaggle和国内的阿里天池。
  • 利用相关技术从网页中抓取相关数据,比如爬虫,然后利用获得的数据进行相关数据分析工作。

    爬虫的概念

    如果将互联网比作一张大网,爬虫就像是在网上爬行的蜘蛛。把每个页面比作是一个个节点,网络爬虫访问了该页面并获取了信息就相当于爬过了该节点。
    爬虫就是一段自动抓取互联网信息的程序,从互联网抓取特定的信息。

    网络爬虫及其应用

    爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。
    爬虫能做很多事,能做商业分析,也能做生活助手,比如:分析北京近两年二手房成交均价是多少?深圳的Python工程师平均薪资是多少?北京哪家餐厅粤菜最好吃?等等。这是个人利用爬虫所做到的事情。
    而公司,同样可以利用爬虫来实现巨大的商业价值。比如你所熟悉的搜索引擎——百度和谷歌,它们的核心技术之一也是爬虫,而且是超级爬虫。
    百度这家公司会源源不断地把千千万万个网站爬取下来,存储在自己的服务器上。你在百度搜索的本质就是在它的服务器上搜索信息,你搜索到的结果是一些超链接,在超链接跳转之后你就可以访问其他网站了。
    爬虫还让这些搜索巨头有机会朝着人工智能的未来迈进,因为人工智能的发展离不开海量的数据。而每天使用这些搜索网站的用户都是数以亿计的,产生的数据自然也是难以计量的。

    浏览器的工作原理

    首先,我们在浏览器输入网址(也可以叫做URL)。
    然后,浏览器向服务器传达了我们想访问某个网页的需求,这个过程就叫做【请求】。
    紧接着,服务器把你想要的网站数据发送给浏览器,这个过程叫做【响应】。
    当服务器把数据响应给浏览器之后,浏览器并不会直接把数据丢给你。因为这些数据是用计算机的语言写的,浏览器还要把这些数据翻译成我们能看得懂的样子,这是浏览器的另一项工作【解析数据】。
    紧接着,我们就可以在拿到的数据中,挑选出对我们有用的数据,这是【提取数据】。
    最后,我们把这些有用的数据保存好,这是【存储数据】。

    爬虫的工作原理

    当你决定去某个网页后:

  • 首先,爬虫可以模拟浏览器去向服务器发出请求,并获取服务器的响应;

  • 爬虫程序还可以代替浏览器帮我们解析数据;
  • 接着,爬虫可以根据我们设定的规则批量提取相关数据,而不需要我们去手动提取;
  • 最后,爬虫可以批量地把数据存储到本地。

把最开始的【请求——响应】封装为一个步骤——获取数据。由此,可以得出,爬虫的工作分为四步:

  • 获取数据:爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。
  • 解析数据:爬虫程序会把服务器返回的数据解析成我们能读懂的格式。
  • 提取数据:爬虫程序再从中提取出我们需要的数据。
  • 储存数据:爬虫程序把这些有用的数据保存起来,便于你以后的使用和分析。

    获取数据

    利用一个强大的库——requests来获取数据。
    requests库可以帮我们下载网页源代码、文本、图片,甚至是音频。
    “下载”本质上是向服务器发送请求并得到响应。
    requests.get()
    requests.get()是在调用requests库中的get()方法,它向服务器发送了一个请求,括号里的参数是你需要的数据所在的网址,然后得到了服务器的响应。服务器返回的结果是个response对象。
    response = requests.get(url) ```python import requests res = requests.get(‘https://res.pandateacher.com/2018-12-18-10-43-07.png‘)

    打印变量res的数据类型

    print(type(res))

‘’’

‘’’

<a name="whVNm"></a>
## response对象常用属性
| response属性 | 作用 |
| --- | --- |
| response.status_code | 检查请求是否成功 |
| response.content | 把response对象转换为二进制数据 |
| response.text | 把response对象转换为字符串数据 |
| response.encoding | 定义response对象的编码 |

<a name="R8nJ3"></a>
### response.status_code属性
打印该返回响应状态码,可以用来检查requests请求是否得到了成功的响应。<br />不同的响应状态码,表示不同的响应状态。<br />常见响应状态码含义:

| 响应状态码 | 说明 | 举例 | 说明 |
| --- | --- | --- | --- |
| 1xx | 请求收到 | 100 | 继续提出请求 |
| 2xx | 请求成功 | 200 | 成功 |
| 3xx | 重定向 | 300 | 应使用代理访问 |
| 4xx | 客户端错误 | 400 | 禁止访问 |
| 5xx | 服务器端错误 | 500 | 服务不可用 |

```python
import requests
res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png')
# 打印变量res的响应状态码,以检查请求是否成功
print(res.status_code)

'''
200
'''

response.content属性

该属性能把response对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载。

'''
下载一张图片,它的url是:https://res.pandateacher.com/2018-12-18-10-43-07.png
'''

import requests
res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png')
# 发出请求,并把返回的结果放在变量res中
pic = res.content
# 把response对象的内容以二进制数据的形式返回
with open('ppt.jpg', 'wb') as photo:
    # 新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下
    # 图片内容需要以二进制wb读写
    # 获取pic的二进制内容
    photo.write(pic)

response.text属性

该属性可以把response对象的内容以字符串的形式返回,适用于文字、网页源代码的下载。

'''
下载小说《三国演义》的第一章
小说的url是:https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md
然后通过读写文件把小说保存到本地
'''

import requests
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
# 把response对象的内容以字符串的形式返回
novel = res.text
# 创建一个名为《三国演义》的txt文档,指针放在文件末尾,追加内容
with open('《三国演义》.txt', 'a+') as k:
    # 写进文件中
    k.write(novel)

response.encoding属性

该属性能帮我们定义response对象的编码。
遇上输出的文本有乱码问题,才考虑用res.encoding。
首先,目标数据本身是什么编码是未知的。用requests.get()发送请求后,会取得一个response对象,其中,requests库会对数据的编码类型做出自己的判断。但是这个判断有可能准确,也可能不准确。如果它判断准确的话,打印出来的response.text的内容就是正常的、没有乱码的,就无需用res.encoding;如果判断不准确,就会出现一堆乱码,那我们就可以去查看目标数据的编码,然后再用res.encoding把编码定义成和目标数据一致的类型即可。

import requests
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
# 定义response对象的编码为gbk
res.encodig = 'gbk'
# 把response对象的内容以字符串的形式返回
novel = res.text
# 打印小说的前171个字
print(novel[:171])

'''
## 三国演义

作者:罗贯中

### 第一回 宴桃园豪杰三结义 斩黄巾英雄首立功

> 滚滚长江东逝水,浪花淘尽英雄。
> 是非成败转头空。
> 青山依旧在,几度夕阳红。  
> 白发渔樵江渚上,惯看秋月春风。
> 一壶浊酒喜相逢。
> 古今多少事,都付笑谈中。
>           ——调寄《临江仙》
'''

robots文档

通常情况下,服务器不太会在意小爬虫,但是,服务器会拒绝频率很高的大型爬虫和恶意爬虫,因为这会给服务器带来极大的压力或伤害。
不过,服务器在通常情况下,对搜索引擎是欢迎的态度(刚刚讲过,谷歌和百度的核心技术之一就是爬虫)。当然,这是有条件的,而这些条件会写在Robots协议中。
Robots协议是互联网爬虫的一项公认的道德规范,它的全称是“网络爬虫排除标准”(Robots exclusion protocol),这个协议用来高速爬虫,哪些页面是可以抓取的,哪些不可以。
在网站的域名后加上/robots.txt就可以查看网站的robots协议。
虽然robots协议只是一个道德规范,和爬虫相关的法律也还在建立和完善之中,但我们在爬取网络中的信息时,也应该有意识地去遵守这个协议。
恶意消耗别人的服务器资源,是一件不道德的事,恶意爬取一些不被允许的数据,还可能会引起严重的法律后果。
工具在你手中,如何利用它是你的选择。当你在爬取网站数据的时候,别忘了先看看网站的robots协议是否允许你去爬取。
同时,限制好爬虫的速度,对提供数据的服务器新存感激,避免给它造成太大压力,维持良好的互联网秩序,也是我们该做的事。

网页数据的基本组织形式

将网页作为一个整体进行获取并不困难,困难之处是在于要如何从网页数据中提取出用户感兴趣的所需要的数据。想要实现这个目的,了解网页是如何组织的就显得非常的有必要了。在浏览器中,用户可以看见网页的最终呈现形式,继而将很清楚的知道自己需要哪些数据。
那么,如何获取数据呢?
通常而言,计算机程序获取的是以文本形式存在的网页源代码,并且必须由用户告诉它需要提取网页源代码中的哪部分数据。
为此,需要了解典型的网页组织方式HTML,为网络数据的抓取做好基础工作。

HTML概述

HTML,全称Hyper Text Markup Language,即超文本标记语言。
超文本标记语言是标准通用标记语言下的一个应用,也是一种规范和标准,它通过标记符号来标记要显示的网页中的各个部分。
网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏览器如何显示其中的内容(如:文字如何处理、画面如何安排、图片如何显示等)。
浏览器按顺序阅读网页文件,然后根据标记符解释和显示其标记的内容,对书写出错的标记将不指出其错误,且不停止其解释执行过程,编制者只能通过显示效果来分析出错原因和出错部位。
但需要注意的是,对于不同的浏览器,对同一标记符可能会有不完全相同的解释,因而可能会有不同的显示效果。

HTML的特点

超文本标记语言文档的制作并不是很复杂,但其功能确是异常的强大,支持不同数据格式的文件嵌入HTML文档中,这也是万维网(WWW)盛行的原因之一,HTML主要有如下几个特点:

  • 简易性:超文本标记语言版本的升级采用超集方式,从而更加灵活方便。
  • 可扩展性:超文本标记语言的广泛应用,促使越来越多的组织或者个人为其带来了加强功能,增加标识符等要求,超文本标记语言采取子类元素的方式,为系统扩展带来保证。
  • 平台无关性:虽然windows操作系统计算机大行其道,但使用MACOS、Linux、UNIX等其他操作系统的也大有人在,超文本标记语言是一项互联网通用标准,可以使用在广泛的平台上,并不依赖于某个或某些特定的操作平台。同时,这也是万维网(WWW)盛行的另一个原因。
  • 通用性:超文本标记语言是网络的通用语言,是一种简单、通用的全置标记语言。其允许网页制作人可基于HTML建立文本与图片、音频、视频相结合的复杂页面,这些页面可以被网上任何其他人浏览到,无论使用的是什么类型的操作系统或浏览器。

    HTML标签

    HTML文档包含了HTML标签(TAG)和元素,通过它们来描述网页。Web浏览器的作用是将HTML源文件转化为网页形式,并展示出它们。浏览器本身并不会显示出HTML标签,而是使用它们来解释页面的内容。
    HTML标签通常用两个角括号括起来,即用<>来进行标记,比如段落标记

    ,图片标记等。
    标签都是闭合的。
    两种格式:双标签和单标签。

  • 双标签形如<标签名>标签名称</标签名>,如

    ,第一个标签是开始标签(开放标签),第二个标签是结束标签(闭合标签)。

  • 单标签形如<标签名/>,如

    等。
  • 在HTML中,大多数HTML标签通常是成对出现的。

    注意 :

    • 由于HTML是一种弱势语言,所以如果单标签不写“/”一般也不会报错,但如果放在某些比较严格的浏览器上运行,可能会出现问题,所以,建议还是按照规范的格式写代码。
    • 标签是大小写无关的,跟表示意思是一样的,标准推荐使用小写,这样符合XHTML标准。

HTML常见标签表

标签 描述
定义注释
定义超链接
定义粗体文本
定义body元素

插入换行符
定义按钮
定义图形
定义表格列的属性
第一文档中的一个部分
定义section或page的页脚
定义表单

定义标题1到标题6
定义关于文档的信息
定义section或page的页眉

定义水平线
定义HTML文档
第九章 网络爬虫 - 图1 定义图像
定义表单控件的标注
  • 定义列表的项目
    定义资源引用
    定义元信息
      定义有序列表

      定义段落