Skip to main content

分布式爬虫系统.

Project description

分布式爬虫系统

设计文档

  1. 功能概述

  2. 设计思路

    • 爬虫
      • 选择Scrapy作为爬虫框架,针对网站的反爬虫机制,我们在Scrapy中引入了Selenium以模拟用户实际浏览网页的行为,并且在切换页面时设置了必要的阻塞时间,这样既保证了爬虫的运行效率,也避免了被反爬虫机制屏蔽。
      • 在爬虫运行时,使用预先编辑好的XPath规则从网页中提取出特定的数据,因此不同的电商酒店网站,可以提取出相同的结构化的数据。提取的结构化数据通过Django的数据库模块进行ORM映射,存入MySQL数据库中。
      • 针对url去重问题,我们在CrawlWebsite表中设置了字段lock,在爬取前会先进行依次查询,如果lockTrue表示当前已经有相同url的执行任务,则当前任务会直接终止。CrawlWebsite表中有字段lastest_time记录了该url最后一次更新的时间。
    • 分布式策略
      • 选择Celery作为分布式处理模块,每一个爬取任务都是作为一个Task传递给消息中间件broker,这里我们选择Redis作为broker的实现,因此每一个Task生成后都会进入broker的队列中等待被执行
      • 执行Task的是workerworker在消息队列中选择一个任务开始爬取,而worker支持多进程,在其启动时可以指定运行的进程数,默认为机器的cpu数,例如在进程数设置为4时,worker会在队列中选择4个任务并发执行。另外可以在多台机器上添加多个worker,这样添加任务是同一个入口,但是任务在多个机器上分布执行,即使在单个机器上也可以分布式执行。所以无论是升级单台机器的配置进行纵向的分布式扩容,还是添加多台机器监听同一个消息队列实现横向的分布式扩容,都是非常容易的,整个系统的分布式处理能力也非常强。
      • 我们还设置两个消息队列,这里为了方便命名为machine1machine2。用户在选择执行任务时可以选择将任务添加到哪一个消息队列中。在实际应用中,可将其中一个消息队列的权限提升作为一个类似vip的队列,相应的队列的worker并发能力也更强一些。系统支持添加更多的消息队列,只需要添加新的Task并进行简单的设置。该功能可满足实际应用中不同级别处理等应用场景。
      • celery支持对每一个任务状态的监控,因此在任务出现错误时可以自动取消、重试或提醒。celery也支持定时任务,只需要开启beat,定时任务在定期更新爬取网站的数据时非常有用
      • Hadoop
    • 界面
      • 选择Django作为Web框架,用户输入url进行任务分配;查看任务运行状态;添加定时任务、周期性任务;以及查看结构化的数据都在admin界面进行。
      • 整个前台部署在云服务器上,用户可直接在线分配任务、查看编辑任务、查看爬取的结果或在线添加worker
    • 服务器配置
      • Ubuntu-16.04
      • Python 2.7
      • Scrapy 1.3.3
      • django 1.11.1
      • celery 3.1.25
      • redis 3.0.6
      • IP :118.89.203.58
      • machine1machine2两个队列
    • 数据库
      • MySQL
      • host: 118.89.203.58
      • port: 3306
      • username: ubuntu
      • password: FUDAN14ss
      • table: crawl
  3. 添加worker的方法

    • cd到当前路径启动celeryworker,监听machine1队列
      celery -A sentiment_analysis worker --loglevel=info -Q machine1

本地测试

  1. 启动Redis服务

  2. cd到当前路径启动celery beat
    celery -A sentiment_analysis beat

  3. cd到当前路径启动celery的worker,监听machine1队列
    celery -A sentiment_analysis worker --loglevel=info -Q machine1

  4. cd到当前路径启动开发服务器
    python manage.py runserver

    • 打开 http://localhost:8000/admin/
    • 账号: fudan14ss
    • 密码: FUDAN14ss
    • 设置Periodic tasks,其中backend.tasks.crawl_machine1是将任务添加到队列1,backend.tasks.crawl_machine2添加到队列2。在Arguments中添加参数,例如 ["http://hotels.ctrip.com/hotel/2906601.html"]save保存结果
  5. 命令行分配任务

    • 新开终端,cd到当前目录,运行 python manage.py shell
    • from backend.tasks import *
    • from sentiment_analysis.celery import app
    • crawl_machine1.apply_async(args=('http://hotels.ctrip.com/hotel/2906601.html',))

连接到服务器

  1. sentiment_analysis/settings.py中修改CELERY_RESULT_BACKENDBROKER_URLredis://118.89.203.58:6379/0即可连接到服务器
  2. cd到当前路径启动celery的worker,监听machine1队列
    celery -A sentiment_analysis worker --loglevel=info -Q machine1
  3. 打开http://118.89.203.58:8001/admin/添加任务到machine1队列,本地即可处理

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hotel_spider-1.1.5.tar.gz (17.8 kB view hashes)

Uploaded Source

Built Distribution

hotel_spider-1.1.5-py3-none-any.whl (17.0 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page