Skip to main content

分布式爬虫系统

设计文档

  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队列,本地即可处理

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 details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

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

Uploaded Python 3

File details

Details for the file hotel_spider-1.1.5.tar.gz.

File metadata

  • Download URL: hotel_spider-1.1.5.tar.gz
  • Upload date:
  • Size: 17.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.11.2

File hashes

Hashes for hotel_spider-1.1.5.tar.gz
Algorithm Hash digest
SHA256 4bef0b28f2e640d0d9987ff7d30de72f3b54e4d222ba60d91b8a7ffdc7248b1e
MD5 013ac82f6ee2e4fed12ccb9010987d0d
BLAKE2b-256 1df84f244619a4f81c277fe9dddf8b47a71a9dfdf2b611dde16720e6f05b1e2c

See more details on using hashes here.

File details

Details for the file hotel_spider-1.1.5-py3-none-any.whl.

File metadata

  • Download URL: hotel_spider-1.1.5-py3-none-any.whl
  • Upload date:
  • Size: 17.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.11.2

File hashes

Hashes for hotel_spider-1.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 91c0cf94ea8a5732c9598c20f57a7ec230a9fdbf69c31aa730a45a85ffcc6734
MD5 a981fdf0dcccff01653ca9c65319eced
BLAKE2b-256 6bbdfe6fef5bbbe416b58a74fead808adf270ce642bd259aaa03927bbfe525de

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.1.5 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page