PHP +语言。最佳远端测试框架硒=爬行动物(上)

最后,在网络爬虫结束这一块的感觉露骨进入冰鉴科技发展爬行动物做有半年多了,我们已经开发维护几经爬行动物。在很多坑的中间步骤,同时也爬行动物的许多细节有自己的理解,所以今天希望能分享一些经验,爬行动物。虽然爬行动物不能说的很多东西太细,因为其他人说,这是太小了有针对性的反爬行动物,和大量的技术和产业无用的通用解决方案的(即使有人做出来也不太愿意分享) ,被我慢慢摸索出来。但我认为,行业之间的适当的技术交流/友商是必要的,不是闭门造车,我非常期待行业/越私人深入交流的朋友,从每个人都学会做更多的努力才能取得进展好。我最近研究了应用程序反编译的爬行动物有关的,所以这是特别感兴趣的。个人博客:

为什么PHP

事实上,业内人士,车轮蟒蛇下的爬行动物是最大的,大部分学生都参加过我们的工厂与蟒蛇爬行动物。事实证明我的Web后端使用PHP PHP中更多的生态和第三方库什么是熟悉的,在工厂中使用的语言没有硬性规定,所以我用了最拿手的PHP的开。有些学生可能会觉得在PHP履带式的车轮看上去很小,甚至有些谁使用需要完成任务的爬行动物也拿起蟒蛇当是学生的一个PHP的背景下,PHP是它不适合从事爬行动物?我认为恰恰相反,PHP已经积累了大量成熟油田的第三方库的网络,其强大的内容处理能力,使琐碎的任务,需要治疗的鸭子爬行动物。从运行时间爬虫大致可以分为两种类型:1,实时爬行动物:给我一个请求,要求打开一个爬虫爬取本爬虫外国直接API的结果提供了一般; 2,长期爬行动物:该爬行动物一般将运行或周期性地运行,以更新数据仓库。一般这两种爬行动物需要更频繁的维护更新,PHP部署为一个简单的脚本语言,可以实现热更新爬虫的代码,很方便。

使用第三方库

爬行动物用PHP搞,请使用第三方库在一个良好的耍大牌。PHP已经积累了大量的第三方库的网络成熟的领域,基本上你能想到的可以在GitHub上的库中找到,如果你没有第三方库,那么你就必须放弃PHP一在网络领域的巨大优势。与我使用更多的第三方库PHP爬行动物:

1,狂饮:HttpClient的功能非常完善,具有异步并发功能,其他脚本语言不能找到这样的好HttpClient的

2,GOUTTE:上symfony的和简单的包CSS-选择DOM的履带,也可以直接使用symfony的CSS选择器提取的DOM元素的html

3时,symfony /过程:symfony的PHP开放过程中产生的库(包proc_open),与Windows兼容的,你知道PTL扩展不支持Windows

4,PHP-的webdriver:在PHP客户硒的Facebook的官方维修

前一段时间有一个“爬行动物一天,我”偷“知道近百万用户,只为了证明PHP是世界上最好的语言”,所以一直很受欢迎,在回购维修。我还研究什么他的代码,质量非常高,但有一个缺点,即不存在现有的第三方库,并选择适合自己的套餐使用。我们应该利用各种第三方库的把精力花在对爬行动物的业务,而不是从车轮一个新的创造,我通常直接无脑现有波塞尔下。我从四月是今年,进入到在八个月只写了三种爬虫(除了爬虫业务,分布式调度履带Redis的为主,单机多爬虫并发,报警监控+ +参数控制,硒多浏览器匹配+自定义属性,自定义代理政策等)定了下来,所有的加起来只有6000行代码的PHP代码。已经有一个现成的第三方库不成熟和稳定,使车轮本身是值得期待。

多线程,多进程和异步

并发爬虫不能说,因为爬行动物IO密集型的,而不是CPU密集型任务,受到良好的爬行动物复杂应满足:1,(较高的下载带宽,更多的数据攀登)可以尝试下载一个高带宽; 2,CPU和内存消耗的最小的可能消耗尽可能小。 多线程似乎是实现并发的好方法,人们常说的“PHP是不是多线程”,让广大PHPer直不起腰。随着网络后端PHP时不能使用多线程,但作为一个命令行运行,那么PHP是支持多线程。我们知道,PHP分为线程安全(ZTS)和非线程安全版本(NTS),这实际上是赢得ISAPI IIS,下兼容这也迫使非线程和线程安全的扩展在PHP基本上提供安全版。在命令行理论,多线程的PHP是真正的多线程,吡啶或Ruby不喜欢那样的全局锁(在同一时间运行实际上只有一个线程),但实际上PHP是不是多线程的命令行稳定的(毕竟,它是不是多线程的设计,为PHP-CLI),所以我建议使用命令行应用程序或多个进程同时做。 而重要的方法是异步并发,大多数爬行动物的情况是由于需要,我认为在同一时间爬多个URL复杂,这种情况下没有它在一个单一的过程中使用多进程/多线程,异步直接使用。例如,PHP狂饮异步支持是非常容易使用,狂饮默认是异步的几个功能curl_multi包的卷曲做,如果你想异步事件库的更好的性能,可以设置适配器狂饮反应,狂饮,PSR7(当然,你必须安装扩展PECL异步事件等)。我个人觉得,审判狂饮到足以使用默认的异步,并发的HTTP请求运行在几十上百的小管的单一过程,是没有问题的,CPU和内存消耗还是很小。总之,PHP异步多进程和在一起,实现良好的并发性不成问题。

关于爬虫框架

开箱不是封装履带架银子弹。我也开始学习一些java和PY的较为知名的框架,学习第一帧,然后试图融入他们的爬行动物的任务,但后来发现很难做到。这是事实,变化基本上是爬行动物骨架的两行可以运行起来,并为爬虫简单的任务非常好。但也有人用定制的框架包装会导致爬行动物的恶化(爬行动物需要知道的灵活性以应付各种情况),但我们知道爬行动物的本质是开放的HttpClient检索HTML DOM和提取数据,如果加上就完了(并发用多进程管理),它是需要被包装在一个复杂系统的框架,并不一定适用于所有情况的简单任务,尽可能以满足大家。一旦有人出上V2EX问题的说我直接请求很简单啊,哪里是它的优势scrapy?我的理解是,该框架的优点是,爬行动物爬行动物的并发调度就完成了,我们直接的过程写一个字,只能爬行动物是爬行动物没有一个单一的过程中并发调度。事实上,爬行动物并发多进程调度并不复杂,不需要太复杂了,我说说我的PHP爬虫是怎么做的并发调度(蟒蛇在同样的事情)。

爬行动物多进程调度

我的PHP爬虫多进程调度比较简单粗暴,爬行动物和负责管理的过程变成主爬虫爬行工作进程特定的业务流程,并负责爬行动物和爬行动物的显示状态控制的Redis。

例如,我有一个爬爬虫任务一个网站,我发展好爬行动物工作者来说,我可以设置节点1我开了两个工人一个在Redis的,而master1过程攀上节点1会去Redis的经常阅读的控制参数的服务器上,然后如果工人一个流程节点1小于两个发现将补充新开工的过程。当然,你可以自定义需要包括,例如控制参数,我定制每个节点的工人上限,代理策略中使用,是否禁止加载图片,自定义浏览器的功能,等等。工作进程的主进程,在两种方式打开,一种是通过类EXEC(在主控这样proc_open(“PHP的工作进程。PHP BALABALA”,$ descriptorspec,$管道)左右)调用打开一个新的命令行工作进程PHP的,另一种是由叉机制来完成。我曾经在课堂上的方法给exec(事实上,symfony中/过程库,它封装了proc_open函数打开进程)打开工作进程(如果你想命令行参数传递给工作进程注意使用base64编码它,因为命令行可以将过滤的某些参数),这样做的好处是解耦。应当指出,现在工作进程的子进程硕士的过程中,工人师傅进程退出,那么所有的进程将退出,所以要注意掌握异常捕获,特别是Redis的,数据库的过程中,和其他地方有网络IO。如果你想工作进程damonize然后按方法这篇文章(下PHP是一样的,但不兼容Windows)。 我不建议师父过程是由过程IPC机制控制的,因为这样做,一下子让师父过程和耦合的过程中,主线程应该简单地只负责开工作进程。该过程的工人控制可以通过Redis的来完成,也就是工作进程从时间到时间(它可以完成一个http请求,或每隔几秒钟)的Redis可以去读取的控制参数(如果需要的话,也可以去关于自己的状态,参数多,那么使用Redis的一个很好的管道)的报告,这种方法效果很好的实践。 我的PHP爬虫都采用了这种简单粗暴的解决方案,我认为它的好处有四个:

1,并且它依赖于分布参数控制+状态直接由单个节点报告redis的简支。我建议你使用一个很好的GUI工具来管理的Redis redis的,用于Redis的5忠数据结构爬虫爬行状态显示参数控制+非常方便

2,万事达工作进程和去耦的过程中,和内存泄漏问题是可以解决的爬行动物的发生率较高(工人完成该过程退出)时,热也可以更新代码

3,爬行动物可以通过主Redis的抢占实时推送的过程要求做的名单,和主爬行动物的补充过程的长期任务后立即工作进程意外退出,能适应各种爬行动物任务

4,只花了编写工作进程确定,便于开发爬行动物的发展,不关心调度问题

当然,缺点是你需要一个机制来写自己的,高度可定制的支付自己。

总结一下

我的PHP下的爬行动物经验的几个方面拿出的一点而言,由于空间有限硒留相关经验,下一次的说。

以上


https://开头segmentfault。COM / P / 1210000007651673

本文链接:php 的爬虫经验分享

您可能也会喜欢

友情链接:

经文 心经唱诵 大悲咒注音