关于python:爬虫系列读取文档

45次阅读

共计 3841 个字符,预计需要花费 10 分钟才能阅读完成。

上一篇文章咱们介绍了如何通过 MySQL 存储 Python 爬虫采集的内容,以及应用 Python 与 MySQL 交互,这篇文章咱们介绍如何通过 Python 读取文档。

尽管互联网在 20 世纪 60 年代末期就曾经以不同的模式呈现,然而 HTML 直到 1992 年才问世。在此之前,互联网上根本就是收发邮件传输文件;明天看到的网页概念那时还没有。总之,互联网并不是一个 HTML 页面的汇合。他是一个信息汇合,而 HTML 文件只是展现信息的一个框架而已。如果咱们的爬虫不能读取其余类型的文件,包含纯文本、PDF、图像、视频、邮件等,咱们将会失去很大一部分数据。

本篇文章我将具体介绍文档解决的相干内容,包含把文件下载到文件夹里,以及读取文档并提取数据。同时介绍文档不同编码类型,让程序能够读取非英文 HTML 页面。

文档编码

文档编码是一种通知程序——无论是计算机的操作系统还是 Python 代码——读取文档的规定。文档的编码方式通常能够依据文件的扩展名进行判断,尽管文件扩展名并不是由编码确定的,而是由开发者确定的。例如,如果我把 python_logo.jpg 存储为 python_logo.txt 不会呈现任何问题,但当我应用文本编辑器关上的时候就有问题了。这种状况很少见,如果要正确的读取一个文档,必须晓得它的扩展名。

从最底层的角度看,所有文档都是由 0 和 1 编码而成的。而在高层(贴近用户的层级)编码算法会定义“每个字符多少位”或“每个像素的色彩值用多少位”(图像文件里)之类的事件,在哪里你会遇到一些数据压缩算法或体积缩减算法,比方 PNG 图像编码格局(一种无损压缩的位图图形格局)。

尽管咱们第一次解决这些非 HTML 格局的文件会感觉没有任何教训,然而只有装置了适合的库,Python 就能够帮你解决任意类型的文档。纯文本文件、视频文件和图像文件的惟一区别,就是他们的 0 和 1 面向用户的转换形式不同。

纯文本

尽管把文件存储为在线的纯文本格式并不常见,然而一些繁难的网站,或者有大量纯文本文件的“新式学术”(old-shcool)网站常常会这么做。例如,互联网工程工作组(Internet Engineering Task Force,IETF)网站就存储了 IETF 发表过的所有文档,蕴含 HTML、PDF 和纯文本格式(例如 https://datatracker.ietf.org/doc/html/rfc4437.txt)。大多数浏览器都能够很好的显示纯文本文件,采集这些纯文本文件的网站不会遇到什么问题。

上面一个 Python 读取纯文本示例,展现了如何读取 https://image.pdflibr.com/cra… 地址的纯文本文件。

from requests import Session


class ReadDocument(object):
    def __init__(self):
        self._text_url = 'https://image.pdflibr.com/crawler/blog/tencent_cloud_ip_range.txt'

    def read_text_document(self):
        init_session = Session()
        response = init_session.get(url=self._text_url)
        response.encoding = 'utf-8'
        print(response.text)


if __name__ == '__main__':
    ReadDocument().read_text_document()

这段 Python 代码,咱们间接读取文本内容,并对文本从新编码,如果应用原来的编码方式,显示为乱码。一旦纯文本被读取成字符串,你就只能用一般的 Python 字符串办法剖析他了。当然这没做有个毛病,就是你不能对字符串应用 HTML 标签,去定位那些你真正须要的文字,避开那些你不须要的文字。如果你当初须要在纯文本外面找到你须要的信息还是有艰难的。

文本编码和寰球互联网

记得我后面说过,如果你想正确的读取一个文件,晓得它的扩展名就能够了。不过十分奇怪的是,这条规定不能利用到最根本的文档格局:.txt 文件。

大多数时候后面的办法读取纯文本文件都没有问题。然而,护粮网上的文本文件会比较复杂。上面介绍一些英文和非英文编码的基础知识,包含 ASCII、Unicode 和 ISO 编码,以及应答的解决办法。

编码类型简介

20 世纪 90 年代,一个叫 Unicode 联盟(The Unicode Consortium)的非盈利组织尝试将地球所有的用于书写的符号经行对立编码。其指标包含拉丁字母、斯拉夫字母、中国象形文字(象形)、数字和逻辑符号,甚至表情和“杂项”(misellaneous)符号,比方生化危机标记(☣)和战争符号(☮)等。

UTF-8(8-bit Unicode Transformation Format) 是一种针对 Unicode 的可变长度字符编码,也是一种前缀码。它能够用一至四个字节对 Unicode 字符集中的所有无效编码点进行编码,属于 U nicode 规范的一部分,最后由肯·汤普逊和罗布·派克提出。

一个最常见的谬误就是 UTF-8 把所有的字符都存储成 8 位。其实“8 位”显示一个字符所须要的最小位数,而不是最大位数。(如果 UTF-8 的每个字符都是 8 位,,那一共只能存储 2^8 个字符,这对于中文和其余字符显然不够。)

真实情况是,UTF- 8 每个字符结尾都有一个标记示意“这个字符只用一个字节”或“那个字符须要两个字节”,一个字符最多能够是四个字节。因为这四个字节外面还蕴含一部分设置信息,用来决定多少字节用来做字符编码,所以全副的 32 位(32 位 = 4 字节 x8 位 / 字节)并不都会用,其实最多应用 21 位,也就是总共 2097152 种可能外面能够有 1114112 个字符。

尽管对很多程序来说,Unicode 都是上帝的礼物(godsend), 然而有很多习惯都很难扭转,ASCII 仍然是许多英文用户的次要抉择。

ASCII 是 20 世纪 60 年代开始应用的文字编码标准,每个字符 7 位,一共 2^7,即 128 个字符。这个对于拉丁字母(包含大小写)、标点符号和英文键盘上的所有符号,都是够用的。

在 20 世纪 60 年代,存储的文件用 7 位编码和用 8 位编码之间的差别是微小的,因为内存十分低廉。过后,计算机科学家们为了须要减少一位取得一个丑陋的二进制数(用 8 位),还是在文件里用更少的位数(7 位)费尽心机。最终,7 位编码胜利了。然而,在旧式计算形式中,每个 7 位码后面都补充(pad)了一个“0”,留给咱们最坏的后果是,文件大了 14%(编码由 7 为变成 8 位,体积减少了 14%),并且因为只有 128 个字符,不足灵活性。

在 UTF-8 设计过程中,设计师决定利用 ASCII 文档里的“填充位”,让所有“0”结尾的字节示意这个字符自用 1 个字节,从而把 ASCII 和 UTF-8 编码完满的联合在一起。因而,上面的字符在 ASCII 和 UTF-8 两种编码方式中都是无效的:

01000001 - A
01000010 - B
01000011 - C

除了 UTF-8,还有其余 UTF 规范,像 UTF-16、UTF-24、UTF-32,不过很少用这些编码标准对文件经行编码,所以在此不做过多介绍。

Python 编码示例

在下面的实例中咱们通过 Python 的 requests 库读取了近程的文档内容,然而显示的是乱码,无奈浏览,咱们对文档内容从新设置编码,使其失常显示,示例如下:

from requests import Session


class ReadDocument(object):
    def __init__(self):
        self._text_url = 'https://image.pdflibr.com/crawler/blog/tencent_cloud_ip_range.txt'

    def read_text_document(self):
        init_session = Session()
        response = init_session.get(url=self._text_url)
        # 显示原来文本的编码方式
        print(response.encoding)
        # 将文本设置成 utf-8 的编码方式
        response.encoding = 'utf-8'
        print(response.text)
        # 显示扭转编码后的编码方式
        print(response.encoding)


if __name__ == '__main__':
    ReadDocument().read_text_document()

下面的代码首先打印出了原来文档采纳的编码方式,之后将文档重设成 UTF-8 的编码方式,之后再次打印文档内容,再次显示被编码后的文档编码。

你可能打算当前应用网络爬虫全副采纳 UTF-8 编码读取内容,毕竟 UTF-8 也能够完满的解决 ASCII 编码。然而,要记住还有 9% 的网站应用 ISO 编码格局。所以在解决纯文本文档的时候,想用一种编码搞定所有文档是不可能的。有一些库能够查看文档的编码,或是对文档编码经行预计,不过成果并不是很好。

解决 HTML 的时候,网站其实会在 <head> 局部显示页面应用的编码格局。大多数网站,尤其是英文网站,都会带上这样的标签:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

如果你要做很多网络数据采集工作,尤其是面对国内网站时,倡议先看看 meta 标签的内容,用网站举荐的形式读取页面内容。

正文完
 0