美文网首页python爬虫日记本python学习我爱编程
一篇文章告诉你python爬虫原理,知其然更知其所以然,从此爬虫

一篇文章告诉你python爬虫原理,知其然更知其所以然,从此爬虫

作者: Python学习 | 来源:发表于2018-05-25 12:47 被阅读92次

    Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象、直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法非常简捷和清晰,与其它大多数程序设计语言不一样,它使用缩进来定义语句。

    Python支持命令式程序设计、面向对象程序设计、函数式编程、面向切面编程、泛型编程多种编程范式。与Scheme、Ruby、Perl、Tcl等动态语言一样,Python具备垃圾回收功能,能够自动管理存储器使用。它经常被当作脚本语言用于处理系统管理任务和网络程序编写,然而它也非常适合完成各种高级任务。Python虚拟机本身几乎可以在所有的作业系统中运行。使用一些诸如py2exe、PyPy、PyInstaller之类的工具可以将Python源代码转换成可以脱离Python解释器运行的程序。

    最近看过不少讲爬虫的教程[1][2],基本都是一个模式:

    00001. 开始先来拿正则、lxml、jquery/pyquery等等教大家从页面上抠出一个一个的值来

    00002. 然后深入一些在讲讲http 协议,讲讲怎么拿出 cookie 来模拟登录之类的,讲讲基本的反爬虫和反反爬虫的方法

    00003. 最后在上一个 简单地 scrapy 教程,似乎就皆大欢喜了。

    具体地采集一个一个的数据的确让人产生成就感,然而这些教程却都忽略了爬虫最核心的逻辑抽象,也就是「爬虫应该采取什么样的策略遍历网页」。其实也很简单,只需要两个队列和一个集合,Scrapy 等框架拆开来看也是如此,本文参照 Scrapy 实现一个最基础的通用爬虫。

    万维网是由一个一个的页面构成的,而每个页面和页面之间是由链接来联系的,并且这些链接都是具有方向性的。对应到数据结构的话,我们可以把每一个页面都看作一个节点,而每一个链接都是一个有向边,也就是整个万维网其实是一个巨大的「有向图」[3]。说到这里,可能有的同学已经明白了,可以用广度优先或者深度优先的算法来遍历这个图。当然,这个图是在太巨大了,我们不可能遍历整个图,而是加一些限定条件,只去访问其中很小一部分我们感兴趣的节点,比如某个域名下的网页。

    广度优先和深度优先都可以使用递归或者辅助的队列(queue/lifo_queue)来实现。然而如果你的爬虫是用 python 写的话,很遗憾不能使用递归来实现了,原因很简单,我们要访问的网页可能成千上万,如果采用递归来实现,那么爬虫每向前访问一个节点,系统的调用栈就会 +1,而 python 中至今没有尾递归优化,默认的堆栈深度为1000,也就是很可能你访问了1000个网页之后就抛出异常了。所以我们这里使用队列实现对网页的遍历访问。这里还是要推荐下小编的Python学习裙:【五 八 八,零 九 零,九 四 二】不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2018最新的Python资料和0基础入门教程,欢迎初学和进阶中的小伙伴。在不忙的时间我会给大家解惑。

    理论知识说了这么多,下面以一个例子来说明一下如何爬取数据:爬取煎蛋网的妹子图我们获得了所有通向上一页下一页的链接。你可以在第二页和第三页上验证一下。

    这时候,你可能想到了另一个问题,第一页的下一页和第三页的上一页都是同一个页面——第二页。如果不加处理的话,我们就会重复多次访问一个页面,浪费资源不说,还有可能导致爬虫迷路,在几个页面之间循环访问。这时候我们就需要一个集合,把访问过得页面放入。从而避免重复访问。

    好了,既然我们可以遍历需要爬取得页面了,下一步我们开始考虑从页面抽取需要的数据了。我们依然请出我们的老朋友xpath了。在需要的元素上点击右键,编写对应的表达式就可以了。在这个例子里,我们需要获取的是图片,对于图片的下载也是一件很耗时的任务,如果能在另一个线程里进行就好了,所以这里我们引入第二个队列,存放抽取出来的数据。

    把 run_request 和 run_item 两个函数放到不同的线程中,就可以同时遍历网页和下载图片了。

    好了,到这里我们的煎蛋妹子图爬虫就写好了,实际上所有的爬虫框架不管多么复杂,使用的异步等等不同的多任务模式也好,本质上都是一样的。 Scrapy 也是采用了类似的方式,不同的地方时,scrapy 才使用的是 Lifo Queue,也就是栈,所以 scrapy 默认是深度优先便利的,而我们上面的爬虫是广度优先遍历的。scrapy 没有采用线程,而是使用了 Twisted 提供的 Actor Model 实现多任务同时运行。

    如果再多些几个爬虫之后,可能你就会发现,其实每次需要改动的地方无外乎是查找几个 xpath 表达式,这样我们可以把上面的逻辑抽象成为一个框架,通过编写配置文件来爬取目标数据。

    比如,上面的代码只需要如下命令:

    python miniscrapy.py --spider ooxx.yml

    在爬虫运行过程中,会遇到各种各样的封锁,封锁 User-Agent, 封锁 IP,封锁 Cookie,但是这些封锁都是在下载过程中遇到的,和爬虫的整体逻辑是无关的。本文中的逻辑可以一直复用。对于遇到的各种各样的封锁,需要各种灵活多变的方式应对,这时候采用 pipeline 的方式是一个很好的选择。这里还是要推荐下小编的Python学习裙:【五 八 八,零 九 零,九 四 二】不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2018最新的Python资料和0基础入门教程,欢迎初学和进阶中的小伙伴。在不忙的时间我会给大家解惑。

    Python可以做什么?

    web开发和 爬虫是比较适合 零基础的

    自动化运维 运维开发 和 自动化测试 是适合 已经在做运维和测试的人员

    大数据 数据分析 这方面 是很需要专业的 专业性相对而言比较强

    科学计算 一般都是科研人员 在用

    机器学习 和 人工智能 首先 学历 要求高 其次 高数要求高 难度很大

    相关文章

      网友评论

        本文标题:一篇文章告诉你python爬虫原理,知其然更知其所以然,从此爬虫

        本文链接:https://www.haomeiwen.com/subject/blwyjftx.html