python网络爬虫——分布式爬虫

redis分布式部署

- 概念:可以将一组程序执行在多台机器上(分布式机群),使其进行数据的分布爬取。

1.scrapy框架是否可以自己实现分布式?

      其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls列表中的url。(多台机器无法共享同一个调度器)

      其二:多台机器爬取到的数据无法通过同一个管道对数据进行统一的数据持久出存储。(多台机器无法共享同一个管道)

2.基于scrapy-redis组件的分布式爬虫

- scrapy-redis组件中为我们封装好了可以被多台机器共享的调度器和管道,我们可以直接使用并实现分布式数据爬取。

- 实现方式:

1.基于该组件的RedisSpider类

2.基于该组件的RedisCrawlSpider类

3.分布式实现流程:上述两种不同方式的分布式实现流程是统一的

- 3.1 下载scrapy-redis组件:pip install scrapy-redis

- 3.2 redis配置文件的配置:

  - 注释该行:bind 127.0.0.1,表示可以让其他ip访问redis
  - 将yes该为no:protected-mode no,表示可以让其他ip操作redis

3.3 修改爬虫文件中的相关代码:

- 将爬虫类的父类修改成基于RedisSpider或者RedisCrawlSpider。

     注意:如果原始爬虫文件是基于Spider的,则应该将父类修改成RedisSpider,如果原始爬虫文件是基于CrawlSpider的,则应该将其父类修改成RedisCrawlSpider。

- 注释或者删除start_urls列表,切加入redis_key属性,属性值为scrpy-redis组件中调度器队列的名称

3.4 在setting中进行相关配置,开启使用scrapy-redis组件中封装好的管道

    ITEM_PIPELINES = {
          ‘scrapy_redis.pipelines.RedisPipeline‘:400,
          }

3.5 在setting文件中进行相关配置,开启使用scrapy-redis组件中封装好的调度器

    # 使用scrapy-redis组件的去重队列
    # 增加一个去重容器类的配置,作用是用Redis的set集合来存储请求的指纹数据,从而实现请求去重的持久化
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    # 使用scrapy-redis组件自己的调度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    # 配置调度器是否要持久化,也就是当爬虫结束了,要不要清空Redis中请求队列和去重指纹的set。True:表示要持久化存储,不清空数据;False清空数据
    SCHEDULER_PERSIST = True

3.6 在setting文件中进行爬虫程序链接redis的配置:

    REDIS_HOST = ‘redis服务的ip地址‘

    REDIS_PORT = 6379

    REDIS_ENCODING = ‘utf-8’

    REDIS_PARAMS = {‘password’:’123456’}

3.7 开启redis服务器:redis-server 配置文件

     携带配置文件启动redis服务【windows终端切换到redis文件目录】

     redis-server ./redis.windows.conf

3.8 开启redis客户端:【windows终端中输入】

     redis-cli

3.9 运行爬虫文件:scrapy runspider SpiderFile 

    pycharm终端进入spider文件目录,输入【scrapy runspider xxx.py】

3.10 向调度器队列中扔入一个起始url(在redis客户端中操作):lpush redis_key属性值 起始url

    windows终端输入:lpush ts www.xxx.com

  3.11 redis客户端【redis-cli】中显示数据【items:xxx】

实例:阳光热线

# 1.spider文件

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapyRedisPro.items import ScrapyredisproItem
from scrapy_redis.spiders import RedisCrawlSpider

class ScrapyredisSpider(RedisCrawlSpider):
    name = ‘scrapyredis‘

    redis_key = ‘ts‘ # 可以被共享的调度器中的队列名称
    rules = (
        Rule(LinkExtractor(allow=r‘tupe=4&page=\d+‘), callback=‘parse_item‘, follow=True),
    )

    def parse_item(self, response):
        tr_list = response.xpath(‘//*[@id="morelist"]/div/table[2]//tr/td/table//tr‘)
        for tr in tr_list:
            title = tr.xpath(‘./td[2]/a[2]/text()‘).extract_first()
            net_friend = tr.xpath(‘./td[4]/text()‘).extract_first()
            item = SunlinecrawlItem()
            item[‘title‘] = title
            item[‘net_friend‘] = net_friend

            yield item # 提交的item必须保证提交到可以被共享的管道中
----------------------------------------------------------------------------------------
# 2.setting文件

BOT_NAME = ‘scrapyRedisPro‘

SPIDER_MODULES = [‘scrapyRedisPro.spiders‘]
NEWSPIDER_MODULE = ‘scrapyRedisPro.spiders‘

USER_AGENT = ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36‘

ROBOTSTXT_OBEY = False

LOG_LEVEL = ‘ERROR‘

ITEM_PIPELINES = {
    ‘scrapy_redis.pipelines.RedisPipeline‘:400,
}

# 使用scrapy-redis组件的去重队列
# 增加一个去重容器类的配置,作用是用Redis的set集合来存储请求的指纹数据,从而实现请求去重的持久化
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

# 是否允许暂停
# 配置调度器是否要持久化,也就是当爬虫结束了,要不要清空Redis中请求队列和去重指纹的set。True:表示要持久化存储,不清空数据;False清空数据
SCHEDULER_PERSIST = True

# 指定ip和port
REDIS_HOSR = ‘127.0.0.1‘ #【redis服务器ip地址】【真实ip】
REDIS_PORT = 6379

# 当前请求数量【开启32个线程】
CONCURRENT_REQUESTS = 32
----------------------------------------------------------------------------------------
# 3.items文件

import scrapy

class ScrapyredisproItem(scrapy.Item):

    title = scrapy.Field()
    net_friend = scrapy.Field()
对应redis终端指令

  开启redis服务器:redis-server 配置文件
  D:\redis>redis-server.exe ./redis.windows.conf

  开启redis客户端
  D:\redis>redis-cli

  查看redis数据库当前数据

  127.0.0.1:6379> keys *
  (empty list or set)

  向调度器队列中扔入一个起始url(在redis客户端中操作)
  127.0.0.1:6379> lpush ts http://wz.sun0769.com/index.php/question/questionType?type=4&page=

原文地址:https://www.cnblogs.com/bilx/p/11600973.html

时间: 2024-11-06 03:40:54

python网络爬虫——分布式爬虫的相关文章

爬虫--Scrapy-CrawlSpider&分布式爬虫

CrawlSpider CrawlSpider: 问题:如果我们想要对某一个网站的全站数据进行爬取? 解决方案: 1. 手动请求的发送 2. CrawlSpider(推荐) 之前的事基于Spider类 CrawlSpider概念:CrawlSpider其实就是Spider的一个子类.CrawlSpider功能更加强大(链接提取器,规则解析器). 代码: 1. 创建一个基于CrawlSpider的爬虫文件 a) scrapy genspider –t crawl 爬虫名称 起始url ------

第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time = datetime.now()获取当前时间 在搜索结束后:end_time = datetime.now()获取当前时间 last_time = (end_time-start_time).total_seconds()结束时间减去开始时间等于用时,转换成秒 from django.shortcu

156个Python网络爬虫资源

本列表包含Python网页抓取和数据处理相关的库. 网络相关 通用 urllib - 网络库(标准库) requests - 网络库 grab - 网络库(基于pycurl) pycurl - 网络库 (与libcurl绑定) urllib3 - 具有线程安全连接池.文件psot支持.高可用的Python HTTP库 httplib2 - 网络库 RoboBrowser - 一个无需独立浏览器即可访问网页的简单.pythonic的库 MechanicalSoup - 能完成自动网站交互的Pyth

Python分布式爬虫原理

转载 permike 原文 Python分布式爬虫原理 首先,我们先来看看,如果是人正常的行为,是如何获取网页内容的. (1)打开浏览器,输入URL,打开源网页 (2)选取我们想要的内容,包括标题,作者,摘要,正文等信息 (3)存储到硬盘中 上面的三个过程,映射到技术层面上,其实就是:网络请求,抓取结构化数据,数据存储. 我们使用Python写一个简单的程序,实现上面的简单抓取功能. [python] view plain copy #!/usr/bin/python #-*- coding: 

纯手工打造简单分布式爬虫(Python)

前言 这次分享的文章是我<Python爬虫开发与项目实战>基础篇 第七章的内容,关于如何手工打造简单分布式爬虫 (如果大家对这本书感兴趣的话,可以看一下 试读样章),下面是文章的具体内容. 本章讲的依旧是实战项目,实战内容是打造分布式爬虫,这对初学者来说,是一个不小的挑战,也是一次有意义的尝试.这次打造的分布式爬虫采用比较简单的主从模式,完全手工打造,不使用成熟框架,基本上涵盖了前六章的主要知识点,其中涉及分布式的知识点是分布式进程和进程间通信的内容,算是对Python爬虫基础篇的总结. 现在

Python分布式爬虫打造搜索引擎网站(价值388元)

未来是什么时代?是数据时代!数据分析服务.互联网金融,数据建模.自然语言处理.医疗病例分析--越来越多的工作会基于数据来做,而爬虫正是快速获取数据最重要的方式,相比其它语言,Python爬虫更简单.高效 ----------------------课程目录------------------------------ 第1章 课程介绍:介绍课程目标.通过课程能学习到的内容.和系统开发前需要具备的知识 第2章 windows下搭建开发环境:介绍项目开发需要安装的开发软件. python虚拟virtu

聚焦Python分布式爬虫必学框架Scrapy 打造搜索引擎

第1章 课程介绍 介绍课程目标.通过课程能学习到的内容.和系统开发前需要具备的知识 1-1 python分布式爬虫打造搜索引擎简介 第2章 windows下搭建开发环境 介绍项目开发需要安装的开发软件. python虚拟virtualenv和 virtualenvwrapper的安装和使用. 最后介绍pycharm和navicat的简单使用 2-1 pycharm的安装和简单使用 2-2 mysql和navicat的安装和使用 2-3 windows和linux下安装python2和python

学习《从零开始学Python网络爬虫》PDF+源代码+《精通Scrapy网络爬虫》PDF

学习网络爬虫,基于python3处理数据,推荐学习<从零开始学Python网络爬虫>和<精通Scrapy网络爬虫>. <从零开始学Python网络爬虫>是基于Python 3的图书,代码挺多,如果是想快速实现功能,这本书是一个蛮好的选择. <精通Scrapy网络爬虫>基于Python3,深入系统地介绍了Python流行框架Scrapy的相关技术及使用技巧. 学习参考: <从零开始学Python网络爬虫>PDF,279页,带目录,文字可复制: 配套

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字段的类型以及相关属性elasticsearch会根据json源数据的基础类型猜测你想要的字段映射,将输入的数据转换成可搜索的索引项,mapping就是我们自己定义的字段数据类型,同时告诉elasticsearch如何索引数据以及是否可以被搜索 作用:会让索引建立的更加细致和完善 类型:静态映射和动态