网站首页 > 论文范文> 文章内容

如何用 Python 爬取网页制作

※发布时间:2018-5-19 20:14:01   ※发布作者:habao   ※出自何处: 

  作者简介:孙亖,软件工程师,长期从事企业信息化系统的研发工作,主要擅长后台业务功能的设计开发。

  本文来自作者在 GitChat 上分享「如何用 Python 爬取网页制作」主题内容。

  有人爬取数据分析黄金周旅游景点,有人爬取数据分析相亲,有数据分析双十一,连小学生写论文都用上了大数据。

  我们每个人每天都在往网上通过微信、微博、淘宝等上传我们的个人信息,现在就连我们的钱都是放在网上,以后到强人工智能,我们连决策都要依靠网络。网上的数据就是资源和宝藏,我们需要一把铲子来挖掘它。

  最近,AI 的兴起让 Python 火了一把。实际上 Python 拥有庞大的第三方支持,生态系统非常完整,可以适用各种场景和行业。

  这次,我们准备通过 Python 学习爬虫的开发,既简单有趣,而且是数据采集重要一环。同时脱离应用谈技术就是耍,通过制作学习数据的收集与整理,即能学到东西又有实用价值。

  我们将通过爬取网页信息这个很小的应用场景来体会数据预处理的思想,并从中学习了解数据处理中抓取、处理、分组、存储等过程的实现。

  Python 语法:通过分享掌握简单的 Python 开发语法和思,侧重于后面爬虫开发的需要用的内容;

  Scrapy 爬虫开发:通过分享了解基本的 Scrapy 开发,并实现从网络爬取数据,使用 Sigil 制作 epub ;

  最后,我希望通过分享,让更多人能够入门并喜欢上 Python 开发,掌握 Scrapy 爬虫开发的思和方法。

  有两个版本,根据需要选择自己的版本,现在越来越多的库开始支持 3,所以下载 3,这里我们以 2 为例。

  目前我所接触过的所有编程语言都只要掌握三个内容就可以了:就是输入、处理、输出。我们已经安装好了 Python,可以来一个最俗套的程序。

  根据我的说法,这个程序的输入就是 Hello World 字符串,处理使系统内部的输出处理,输出结果就是 ‘Hello World’。

  我们说这个不是单纯的秀一下,以前没有用户界面的时候 print 可以作为人机交互用途,现在多数是用于调试,可以在程序运行的时候快速的输出程序结果或者过程结果。

  现在有个很有意思的说法:生数据(原始数据)就是没有处理过的数据,熟数据(Cooked Data)是指原始数据经过加工处理后的数据,处理包括解压缩、组织,或者是分析和提出,以备将来使用。

  这就像做菜生菜是输入,菜谱是程序,洗、切、烹饪等处理是程序执行过程,最后输出的熟菜。但不管生菜、熟菜都是菜,或者都是物质。

  在程序世界里的物质组成就是数据,就像有萝卜白菜等不同的品种一样,数据也有不同的类型。我目前所接触到的数据类型主要有以下几种:

  首先,这个分类不是某种语言特有,目前大多数编程语言都差不多,你理解这个思想就把自己的编程能力扩展了。

  其次,它不需要专门记忆,编程是程序性的知识,运用的知识,是一种技能,你要做什么菜,你来这个分类查查需要什么原材料,再去具体研究,慢慢就会了,不做你记住了也没用。

  用多深,研究多深,不用就别研究浪费时间。比如说,我们一般性应用不会去考虑数据的内存模型,但是涉及到精度、性能或者边界值时我们就需要小心,研究得深一些。

  食材已准备好了,可以下锅,可锅在哪里,你不能放在手里加工。程序里我们用变量、常量来盛各种数据,还有个作用域的问题,严格的厨房红案和白案是分开的,有时候砧板是不能互用的。

  空值:四大皆空,什么也不是,不是 0,不是长度为 0 的字符串,不是 lse,什么都不是;

  Python 或任何一种编程语言都是精深,同时又是一种技能,不可能在使用之前完全掌握,也没必要。

  我们需要知道的是我们想吃什么(程序要输出什么),然后再去菜市场买时才找菜谱(搜索引擎查资料),最后按照我们的需求加工(编程)。

  --程序可以分块编写,这样层次更分明,易于理解和,我们在 pkg.py 中编写一部分功能,作为演示模块。

  我们运行了 hello.py 文件,然后 hello.py 导入了包 pkg;包 pkg 定义了一个方法和一个类,我们在 hello.py 文件里面调用了外部的方法和类。

  虽然我们这里的数据都是从公开的网络获取,但也不能确定其版权问题,因此获取的数据仅用于编程,严禁分享或用于其他用途。

  好了,现在我们找一个在线看书的网站,找一本书把它下载到本地。首先,我们准备下载工具,就是 Python 的爬虫框架 Scrapy。

  安装完 Python 后可以用以下的命令按照 Scrapy,有些版本的 Python 没有带 pip 需要手动安装。

  pip 是 Python 的包管理器,大量的第三方包或者说功能可以通过这个工具来管理,所谓包就是模块化的功能集合,基本的技术参考实践里面的包。

  Scrapy 是 Python 程序,同时也是一套框架,提供了一系列工具来简化开发,因此我们按照 Scrapy 的模式来开发,先新建一个 Scrapy 项目,如下:

  这时,Scrapy 还不知道我们要爬取什么数据,所以我们要用 Scrapy 工具新建一个爬虫,命令如下:

  有个目录页签,点击这个页签可以看见目录,使用浏览器的元素查看工具,我们可以定位到目录和每一章节的相关信息,根据这些信息我们就可以爬取到具体的页面:

  start_urls 就是目录地址,爬虫会自动爬这个地址,然后结果就在下面的 parse 中处理。现在我们就来编写代码处理目录数据,首先爬取小说的主页,获取目录列表:

  获取网页中的 DOM 数据有两种方式,一种是使用 CSS 选择子,另外一种是使用 XML 的 xPath 查询。

  这里我们用 xPath,相关知识请自行学习,看以上代码,首先我们通过 ID 获取目录框,获取类 cf 获取目录列表:

  如果说章节信息爬取使用的 parser 方法,那么我们可以给每一个章节内容的爬取写一个方法,比如:parser_chapter,先看看章节页面的具体情况:

  上一步,我们获取到了一个章节地址,从输出内容来看是相对径,因此我们使用了yield response.follow(url, callback=self.parse_chapter),第二个参数是一个回调函数,用来处理章节页面,爬取到章节页面后我们解析页面和标题保存到文件。

  数据获取了之后是存储,由于我们要的是 html 页面,因此,我们就按标题存储即可,代码如下:

  首先,我们爬取下来的章节页面排序不是很好,如果人工去排需要太多的时间精力;另外,章节内容包含许多额外的东西,阅读体验不好,我们需要优化内容的排版和可读性。

  我们先给章节排个序,因为目录中的章节列表是按顺序排列的,所以只需要给下载页面名称添加一个顺序号就行了。

  可是保存网页的代码是回调函数,顺序只是在处理目录的时候能确定,回调函数怎么能知道顺序呢?因此,我们要告诉回调函数它处理章节的顺序号,我们要给回调函数传参,修改后的代码是这样的:%s%s%(title, content)with open(filename,wb)as f:f.write(cnt.encode(utf-8))pass

  不知道大家注意到没有,前面的分析中目录已经提供了一个data_rid可以作为排序号,我们在目录分析页面获取这个序号,然后通过 request 的 meta 传入parse_chapter。

  在parse_chapter中通过 response 的 meta 获取传入的参数,然后文件名中加入这个顺序好完成了排序。另外,Sigil 找那个通过 H1 标签来生成目录,需要目录的话,我们需要给内容添加一个 h1 标签。

  还有可读性差的问题,也许我们下载的网页可能会包含一些乱七八糟的东西,我们有很多办法,也可以使用 readbility 等第三方库,这里就不深入了。

  ePub(Electronic Publication 的缩写,意为:电子出版),是一个的标准,属于一种可以 “自动重新编排” 的内容;也就是文字内容可以根据阅读设备的特性,以最适于阅读的方式显示。

  输出可以使用阅读软件打开查看,我用的是 Calibre,还可以方便的转换为相应的格式装到 Kindle 中阅读。

  本文来源于ipfs