解决方案:使用php+phantomjs构建一只简单爬虫的开发思路

优采云 发布时间: 2022-11-26 06:37

  解决方案:使用php+phantomjs构建一只简单爬虫的开发思路

  唠叨:

  最近,我有

  经常为客户完成采集

功能,由于代码无法发布,我一直想写一篇关于想法的文章

  既然是简单的爬虫,那么一切自然都是基于简单原则,能用的少用的就少用,比如python和Redis这两件法宝都被我省略了

  造这虫子就像樵夫砍柴,还不如磨刀

  距离:

  再见山

  目标站点:蘑菇街、唯品会等国内知名电商平台

  

" />

  变现需求:站点组模式可以根据其他店铺或商品的指定界面采集分发数据,过滤指定关键词和自定义商品价格

  磨刀:

  刀片在手

  1. 安装 = 无头浏览器幻影,

  类似的无头浏览器或衍生品在其基础上有很多东西,但phantomjs基本可以满足需求,用法也很简单,所以这次我选择了它

  2. 安装 = 多线程扩展 pthreads,因为 python 和 Redis 增加了一些 phper 的学习成本(现在不懂 PHP 的人应该很少),因为 phantomjs 从加载到渲染都比较慢,为了提高效率,我们需要使用多线程

  上山:

  山上发生了很多事情

  

" />

  1.随机代理:因为采集是完全自动化的,所以需要不断访问爬网的网站,为了防止被屏蔽,从代理站抢一些IP掩盖是个好办法

  2. URL自动添加:一些网站页面有URL的相对路径,所以必须完成

  3、深度管控:比如在收货时,容易因为相关商品而陷入无休止的挖矿

  4. 任务分发:虽然不使用 Redis,但此集合需要将任务发送到其他站点

  5.内容过滤:现在头疼的是一些商场或商店有水印,暂时无法解决

  劈柴:

  由于此采集

任务已预设为采集

对象,例如按商店采集

,按产品采集

。所以开头的第一步被省略了

  最佳实践:plugin 机制

  对于Plugin机制,在描述之前必须强调一下:

  Plugin可以看作是代理功能的扩展。对于业务系统的监控指标采集,最好不要做成插件,而是将采集脚本放到业务程序发布包中,随着业务代码上线就上线,随着业务代码的升级而升级,更易于管理。

  使用Plugin,步骤如下:

  1.编写采集脚本

  用什么语言写都无所谓,只要目标机器有运行环境,脚本本身必须有可执行权限即可。数据采集​​完成后可以直接打印到stdout,由agent拦截推送到服务器。数据格式为json,例如:

  [root@host01:/path/to/plugins/plugin/sys/ntp]#./600_ntp.py

[{"endpoint": "host01", "tags": "", "timestamp": 1431349763, "metric": "sys.ntp.offset", "value": 0.73699999999999999, "counterType": "GAUGE", "step": 600}]

<p>

" />

</p>

  注意这个json数据是一个列表

  2.上传脚本到git

  插件脚本也是代码,所以最好用git和svn来管理。这里我们使用git管理。如果公司没有搭建gitlab,可以使用gitcafe之类的将写好的脚本推送到git仓库,比如上面例子中的600_ntp.py,暂时放在git仓库的sys/ntp目录下。注意这个脚本在推送到git仓库之前需要添加可执行权限。

  3.检查代理配置

  之前部署agent的时候,大家应该注意到agent的配置文件中配置了一个plugin。现在是时候使用它了。配置git仓库地址,设置enabled为true。注意配置的git仓库地址需要从任意一台机器上拉取,即git://或者开头。如果之前公司所有机器都部署了agent,现在手动改配置可能会有点麻烦。之前说过,使用ops-updater来管理吧~

  4.拉取插件脚本

  agent开了一个http端口1988,我们可以一一curl:1988/plugin/update这个地址会让agent主动git pull插件仓库。为什么不能定时拉这个仓库呢?主要是怕给git服务器造成太大压力。。。请大家轻点,不要让人拉扯挂掉。。。

  

" />

  5.让插件运行

  上一步我们拉取了插件脚本到所有机器上,但是插件并没有执行。哪些机器执行哪些插件脚本是在门户网站上配置的。其实我很想做的,只要把插件拉下来,马上就会执行。但是在实际中,有些插件还是不能在所有机器上运行,所以通过在portal上配置来控制。在入口找到执行插件的HostGroup,点击对应的plugins超链接,直接将sys/ntp绑定到上例中sys/ntp目录下的600_ntp.py即可。sys/ntp 下的所有插件都被执行。

  6.补充

  Portal上配置完成后,不会立即生效。有一个同步过程。最终agent通过调用hbs接口获取,需要一两分钟的时间。在上面的例子中,我们绑定了sys/ntp,其实就是一个目录。该目录下的所有插件都会被执行,那么什么样的文件会被视为插件呢?文件名以带下划线的数字开头。这个数字代表step,也就是跑多长时间,单位是秒。例如,60_a.py 通过命名告诉代理这个插件每 60 秒运行一次。sys/ntp 目录下的子目录和其他命名方式的文件将被忽略。

  7.如何给插件传递参数

  Open-Falcon 添加了对将自定义参数传递给 PR #672 中的插件的支持。在dashboard中,配置HostGroup绑定插件时,可以支持为单个脚本配置参数。

  例如:sys/ntp/30_xx.sh(a, "33 4", 'test.sh f\,d'),表示绑定一个插件脚本sys/ntp/30_xx.sh到hostgroup,并传4 parameters,多个参数用 分隔,每个参数可以用双引号或单引号括起来。如果参数本身收录

逗号,可以使用\, 进行转义。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线