scrapy_redis 和 docker 实现简单分布式爬虫

简介

在使用 scrapy 爬取 IT桔子公司 信息,用来进行分析,了解 IT 创业公司的一切情况,之前使用 scrapy 写了一个默认线程是10的单个实例,为了防止被 ban IP 设置了下载的速度,3万多个公司信息爬了1天多才完成,现在想到使用分布式爬虫来提高效率。

技术工具: Python3.5 scrapy scrapy_redis redis docker1.12 docker-compose Kitematic mysql SQLAlchemy

准备工作

安装 Docker 点这里 去了解、安装;

pip install scrapy scrapy_redis ;

代码编写 代码位置

分析页面信息:

我需要获取的是每一个「公司」的详情页面链接 和 分页按钮链接;

统一存储获取到的链接,提供给多个 spider 爬取;

多个 spider 共享一个 redis list 中的链接;

目录结构图:


juzi_spider.py

# coding:utf-8

from bs4 import BeautifulSoup
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

from scrapy_redis.spiders import RedisCrawlSpider
from itjuzi_dis.items import CompanyItem

class ITjuziSpider(RedisCrawlSpider):
    name = 'itjuzi_dis'
    allowed_domains = ['itjuzi.com']
    # start_urls = ['http://www.itjuzi.com/company/157']
    redis_key = 'itjuziCrawler:start_urls'
    rules = [
        # 获取每一页的链接
        Rule(link_extractor=LinkExtractor(allow=('/company\?page=\d+'))),
        # 获取每一个公司的详情
        Rule(link_extractor=LinkExtractor(allow=('/company/\d+')), callback='parse_item')
    ]

    def parse_item(self, response):
        soup = BeautifulSoup(response.body, 'lxml')

         .
         .省略一些处理代码
         .
        return item
说明:

class 继承了 RedisCrawlSpider 而不是 CrawlSpider

start_urls 改为一个自定义的 itjuziCrawler:start_urls ,这里的 itjuziCrawler:start_urls 就是作为所有链接存储到 redis 中的 key , scrapy_redis 里也是通过 redis 的 lpop 方法弹出并删除链接的;

db_util.py

使用 SQLAlchemy 作为 ORM 工具,当表结构不存在时,自动创建表结构

middlewares.py

增加了很多 User-Agent ,每一个请求随机使用一个,防止防止网站通过 User-Agent 屏蔽爬虫

settings.py

配置 middlewares.py scrapy_redis redis 链接相关信息

部署

在上面的「目录结构图」中有, Dockerfile 和 docker-compose.yml

Dockerfile

FROM python:3.5
ENV PATH /usr/local/bin:$PATH
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
COPY spiders.py /usr/local/lib/python3.5/site-packages/scrapy_redis
CMD /usr/local/bin/scrapy crawl itjuzi_dis
说明:

使用 python3.5 作为基础镜像

将 /usr/local/bin 设置环境变量

映射 host 和 container 的目录

安装 requirements.txt

特别要说明的是 COPY spiders.py /usr/local/lib/python3.5/site-packages/scrapy_redis ,将 host 中的 spiders.py 拷贝到 container 中的 scrapy_redis 安装目录中,因为 lpop 获取 redis 的值在 python2 中是 str 类型,而在 python3 中是 bytes 类型,这个问题在 scrapy_reids 中需要修复, spiders.py 第84行需要修改;

启动后立即执行爬行命令 scrapy crawl itjuzi_dis

docker-compose.yml

version: '2'
services:
  spider:
    build: .
    volumes:
     - .:/code
    links:
     - redis
    depends_on:
     - redis
  redis:
    image: redis
    ports:
    - "6379:6379"
说明:

使用第2版本的 compose 描述语言

定义了 spider 和 redis 两个 service

spider 默认使用当前目录的 Dockerfile 来创建, redis 使用 redis:latest 镜像创建,并都映射6379端口

开始部署

启动 container

docker-compose up #从 docker-compose.yml 中创建 `container` 们
docker-compose scale spider=4 #将 spider 这一个服务扩展到4个,还是同一个 redis
可以在 Kitematic GUI 工具中观察创建和运行情况;


在没有设置 start_urls 时,4个 container 中的爬虫都处于饥渴的等待状态


现在给 redis 中放入 start_urls :

lpush itjuziCrawler:start_urls http://www.itjuzi.com/company
4个爬虫都动起来了,一直爬到 start_urls 为空


以上!

时间: 2024-09-30 13:10:05

scrapy_redis 和 docker 实现简单分布式爬虫的相关文章

众推平台架构——分布式爬虫

分布式爬虫架构 经过新一轮的投票,项目的范围已经基本确定. 大家决定 全力以付,集中攻克"分布式爬虫". 分布式爬虫架构1 使用队列,即生产者,消费都模式. 由于生产者将规则生成到队列,然后由爬虫集群(消费者)到队列中取规则,然后按优先级等规则进行爬取. 分布式爬虫架构2 类似于webmagic,webmagic的是一个无须配置.便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫.webmagic采用完全模块化的设计,功能覆盖整个爬虫的生命周期(链接提取.页面

基于java的分布式爬虫

分类 分布式网络爬虫包含多个爬虫,每个爬虫需要完成的任务和单个的爬行器类似,它们从互联网上下载网页,并把网页保存在本地的磁盘,从中抽取URL并沿着这些URL的指向继续爬行.由于并行爬行器需要分割下载任务,可能爬虫会将自己抽取的URL发送给其他爬虫.这些爬虫可能分布在同一个局域网之中,或者分散在不同的地理位置. 根据爬虫的分散程度不同,可以把分布式爬行器分成以下两大类: 1.基于局域网分布式网络爬虫:这种分布式爬行器的所有爬虫在同一个局域网里运行,通过高速的网络连接相互通信.这些爬虫通过同一个网络

如何设计一个复杂的分布式爬虫系统?

一个复杂的分布式爬虫系统由很多的模块组成,每个模块是一个独立的服务(SOA架构),所有的服务都注册到Zookeeper来统一管理和便于线上扩展.模块之间通过thrift(或是protobuf,或是soup,或是json,等)协议来交互和通讯. Zookeeper负责管理系统中的所有服务,简单的配置信息的同步,同一服务的不同拷贝之间的负载均衡.它还有一个好处是可以实现服务模块的热插拔. URLManager是爬虫系统的核心.负责URL的重要性排序,分发,调度,任务分配.单个的爬虫完成一批URL的爬

使用Kubernetes和Docker进行简单的leader选举

本文讲的是使用Kubernetes和Docker进行简单的leader选举,[编者的话]Kubernetes简化了运行在集群中的服务部署和运维管理,然而,它也简化了这些管理工作的部署.本篇文章将会展示如何在分布式应用系统中使用Kubernetes来简单地运行leader选举. 概述 为了可靠性和伸缩性,分布式系统通常会复制多个服务任务,但往往有必要指定一个副本作为leader负责协调所有的副本. 通常在leader选举中,一组有机会成为leader的候选者都是可以确认的.这些候选者都竞相宣布自己

c c++-求用c编写的一个简单的爬虫程序,高手赐教,不胜感激

问题描述 求用c编写的一个简单的爬虫程序,高手赐教,不胜感激 本人是初学者,要编写一爬虫程序,抓取60多万个网页上的信息,实在是无从下手,请高手给一个能看得懂的简单的爬虫程序学习用,多谢 解决方案 我也要写一个C爬虫,不过遇到了一些问题,比如58这样的网站,用getaddrinfo返回的ip无法连接,已经耽误了我好几天了,别的问题到还没遇到

分布式爬虫技术架构

Spiderman Spiderman 是一个Java开源Web数据抽取工具.它能够收集指定的Web页面并从这些页面中提取有用的数据. Spiderman主要是运用了像XPath.正则.表达式引擎等这些技术来实现数据抽取. 项目结构: 依赖关系如下: webmagic webmagic采用完全模块化的设计,功能覆盖整个爬虫的生命周期(链接提取.页面下载.内容抽取.持久化),支持多线程抓取,分布式抓取,并支持自动重试.自定义UA/cookie等功能. 工程结构: 工程间的关系: 众推 用整体正在进

scrapy-redis 构建分布式爬虫,此片文章有问题。不要用

此篇文章为转载,只供学习,有很多问题,如没有解决分布式去重问题.最好还是用scrapy-redis给出的例子代码 前言 scrapy是Python界出名的一个爬虫框架.Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 虽然scrapy能做的事情很多,但是要做到大规模的分布式应用则捉襟见肘.有能人改变了scrapy的队列调度,将起始的网址从start_urls里分离出来,改为从Redis读取,多个客户端可以同时读

docker+python无头浏览器爬虫

海量数据从哪儿来?世上本无所谓大数据的,爬的多了,自然就有数据了. 为什么使用docker? 这两年网上关于docker的讨论不亚于当年的云计算,现在云计算已经落地生根了.云时代docker被寄予厚望现在也是火的一塌糊涂. 作为一名开发人员,你是否还在因为环境搭不成功而沮丧?你是否经常对于复杂的安装步骤感到反感,因而对新技术望而却步? 作为一名运维人员,你是否经常因为不同操作系统的原因导致部署失败? 那么docker就是为了解决这些痛点而生的.docker不是什么新技术,类似docker的东西早

[Python学习] 简单网络爬虫抓取博客文章及思想介绍

        前面一直强调Python运用到网络爬虫方面非常有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简单介绍下Python是如何爬去网络数据的,文章知识非常简单,但是也分享给大家,就当简单入门吧!同时只分享知识,希望大家不要去做破坏网络的知识或侵犯别人的原创型文章.主要包括:         1.介绍爬取CSDN自己博客文章的简单思想及过程         2.实现Python源码爬取新浪韩寒博客的316篇文章 一.爬虫的简单思想      最近看刘兵