51Testing软件测试论坛

标题: [PySpider] 架构及实际问题 [打印本页]

作者: 测试积点老人    时间: 2018-12-6 14:40
标题: [PySpider] 架构及实际问题
本帖最后由 测试积点老人 于 2018-12-6 14:42 编辑

架构设计:

具体流程

[attach]119871[/attach]

分布式部署
  1. ##### Master
  2. phantomjs --ssl-protocol=any --disk-cache=true /home/video/.jumbo/lib/python2.7/site-packages/pyspider/fetcher/phantomjs_fetcher.js 25555 &

  3. supervise -p "var/run/status/pyspider_js/" -f "bin/pyspider -c etc/pyspider/config.json phantomjs"
  4. supervise -p "var/run/status/pyspider_ui/" -f "bin/pyspider -c etc/pyspider/config.json webui"
  5. supervise -p "var/run/status/pyspider_sc/" -f "bin/pyspider -c etc/pyspider/config.json scheduler"
  6. supervise -p "var/run/status/pyspider_pr/" -f "bin/pyspider -c etc/pyspider/config.json processor"
  7. supervise -p "var/run/status/pyspider_pr/" -f "bin/pyspider -c etc/pyspider/config.json fetcher"
  8. supervise -p "var/run/status/pyspider_fe/" -f "bin/pyspider -c etc/pyspider/config.json --phantomjs-proxy='localhost:25555' fetcher "
  9. supervise -p "var/run/status/pyspider_re/" -f "bin/pyspider -c etc/pyspider/config.json result_worker"

  10. ##### Slave
  11. nohup phantomjs --ssl-protocol=any --disk-cache=true /home/video/.jumbo/lib/python2.7/site-packages/pyspider/fetcher/phantomjs_fetcher.js 25555&
  12. /home/video/.jumbo/bin/python bin/pyspider -c etc/pyspider/config.json processor &
  13. /home/video/.jumbo/bin/python bin/pyspider -c etc/pyspider/config.json fetcher &
  14. /home/video/.jumbo/bin/python bin/pyspider -c etc/pyspider/config.json --phantomjs-proxy="localhost:25555" fetcher &
  15. /home/video/.jumbo/bin/python bin/pyspider -c etc/pyspider/config.json result_worker &
复制代码

webui
scheduler
fetcher


[attach]119872[/attach]

processor

result worker(optional)

架构图

pyspider的架构主要分为:scheduler(调度器)、fetcher(抓取器)、processor(脚本执行)各个组件间使用消息队列连接,除了scheduler是单点的(可以独立修改),fetcher 和 processor 都是可以多实例分布式部署的。任务由 scheduler发起调度,fetcher抓取网页内容, processor执行预先编写的py脚本,输出结果或产生新的提链任务(发往 scheduler),形成闭环。每个脚本被认为是一个project,taskid(默认为url的md5)唯一确定一个任务。通过设置回调函数分别解析不同类型的页面。

实际问题1 如果pyspider上已经部署了100个项目,想让某些项目优先跑,应该怎么办
答:有三种方案:1、调整项目内页面调度的优先级,默认是0,@config(priority=2),priority越高的,越先被处理,按照任务的优先级被调度。2、调整项目的rate/burst,默认是1.0/3.0,rate代表每秒爬取次数,burst代表并发数,把对应速率rate/burst设置大一点。3、在项目内的self.crawl函数里增加priority参数。

2 pyspider的瓶颈在哪?挂掉了咋办?
答:短时间产生海量任务,即new taskid,可能会出现内存不够,主要是redis占用的内存,redis里有个newtask_queue,里面存着所有的new taskid,限制长度小于100,其实就是小于100个数组,每个数组长度限制在1000以内,也就是说最多可以一次性存储100×1000=100000个任务,如果短时间产生的任务超过100000的话,就可能崩掉。想要重启的话,先杀掉pyspider的所有进程,然后关闭一些项目,减少新任务的添加,再启动pyspider。因为数据都存在mysql里,挂掉和重启都不会影响所有项目的运行。

3 pyspider夯住了,日志不滚动咋办?一般有多种原因

如何防止这种情况发生对processor日志监控

4 pyspider重启夯住,为什么,怎么办?
pyspider的taskdb里各个项目的任务太多了,pyspider会把各个项目里的所有task都读取一遍,导致莫名其妙的问题。
pyspider项目已经抓取过的详情页url,如果需要重复抓取,在on_start时候需要清空taskdb对应的project表,这样task_db的数据量就能大幅减小,重启就舒畅了。
5 如何监控模板解析失效?负载均衡,抓取的任务如何均分到每个fetcher,fetcher多机部署,防止被封禁,控制站点压力
调度适合单站点
调度策略: 轮询 随机










欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2