专栏首页后端技术漫谈[Python爬虫]scrapy-redis快速上手(爬虫分布式改造)

[Python爬虫]scrapy-redis快速上手(爬虫分布式改造)

作者的话

对Python爬虫如何实现大批量爬取感兴趣的读者可以看下scrapy爬虫框架,并且使用本文的scrapy-redis将你的爬虫升级为分布式爬虫。

前言

阅读本文章,您需要:

  • 了解scrapy爬虫框架,知道scrapy的基本使用,最好已经有了可以单机运行的scrapy爬虫。
  • 了解scrapy-redis可以用来干嘛。
  • 已经尝试了一些反反爬措施后仍然觉得爬取效率太低。
  • 已经看了无数scrapy-redis文章,却和我一样不得要领。(自己太笨)
  • 已经看了无数scrapy-redis文章,被辣鸡文章坑的生活不能自理,到现在还没配置好。(可能还是自己太笨)

提示:本文为快速上手文章,有些操作的具体步骤不详细讲,自行百度通用解法,省略的部分我认为你可以自行解决,如果遇到问题,请留言提问

使用scrapy-redis将scrapy改造为分布式

安装需要的python库和数据库

  • 安装scrapy-redis:pip install scrapy-redis
  • 安装redis:可以仅在master(主)端安装
  • 安装其他数据库(可选):mysql,mangoDB,用来保存大量数据,当然也可以选择不安装。用其他方法处理数据。

提示:请注意版本问题,不要过低。

配置redis

  1. master(主)上的redis安装后,需要做以下几件事:
  • 配置redis.conf设置从外网访问:#bind 127.0.0.1
  • 最好设置个密码
  • 取消保护模式 protected-mode no
  1. master启动redis,使用./redis-server redis.conf(改为你的设置文件所在位置)
  2. 尝试从slave(从)连接master的redis,连接成功(盗的图):

image

修改scrapy:setting.py

添加如下代码:

# scrapy-redis
REDIS_URL = 'redis://:yzd@127.0.0.1:6379'  # for master
# REDIS_URL = 'redis://:yzd@10.140.0.2:6379'  # for slave (master's ip)
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

对于itempipeline:你以前怎么存的数据还是怎么存,当然你也可以用redis先存,之后再一起转移出来。像我就直接存到mysql了

ITEM_PIPELINES = {
    # 'JD.pipelines.JdPipeline': 300,
    # 'scrapy_redis.pipelines.RedisPipeline': 400,
    'JD.mysqlpipelines.pipelines.JDPipeline': 300,
}

修改scrapy:spiders/xxxxx.py(自己命名的爬虫文件)

将继承改为继承Redisspider

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import scrapy
from JD.items import JdItem
import logging
from scrapy_redis.spiders import RedisSpider
import time

# class JDcat(scrapy.Spider):
class JDcat(RedisSpider):
    name = "JDcate"
    allowed_domains = ["jd.com"]

    # scrapy-redis
    redis_key = "JDcate:JD_urls"

    def start_requests(self):
        # designed by yourself
        # yield scrapy.Request(url=url, callback=self.parse)
        pass

    def parse(self, response):
        # designed by yourself
        pass

修改slave的存储数据库设置(可选)

如果你想要让slave抓取到的数据直接存入master的数据库,您别忘了修改slave的数据库连接设置

# for master
db_item = pymysql.connect(host="localhost", user="root", password="root",
                          db="pricemonitor", port=3306, charset='utf8')

# for slave
# db_item = pymysql.connect(host="10.140.0.2", user="root", password="root",
#                           db="pricemonitor", port=3306, charset='utf8')

启动分布式爬虫

启动master:scrapy crawl xxxxx 启动slave: crawl xxxxx

image2

上传了个demo源码,供大家修改使用: https://github.com/qqxx6661/scrapy_redis_demo

有问题请留言或邮件yangzd1993@foxmail.com

参考

https://www.cnblogs.com/zjl6/p/6742673.html scrapy-redis官方文档

本文分享自微信公众号 - Rude3Knife(Rude3Knife)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【mysql基础】修改密码

    产生这个问题的原因是执行mysqld -install之前没有执行初始的工作,所以报错。解决这个问题的方法是,重新安装一遍,步骤如下:

    用户5640963
  • Kali Linux Web渗透测试手册(第二版) - 6.3 - 手动识别SQL注入

    大多数现代Web应用程序都实现某种数据库,而SQL是最常用的查询数据库的语言。 在SQL注入(SQLi)攻击中,

    7089bAt@PowerLi
  • Kali Linux Web渗透测试手册(第二版) - 6.5 - 确认并利用SQL盲注漏洞

    我们已经学会了如何找到并利用sql注入漏洞,下面我们将介绍一个同类型的另外一个漏洞,名为sql盲注。它不会有任何回显信息,完全利用两次不同的回显页面造成数据库猜...

    7089bAt@PowerLi
  • MySQL高性能优化规范建议,值得收藏

    •所有数据库对象名称必须使用小写字母并用下划线分割•所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)•数...

    用户1516716
  • Oracle Sequence序列的介绍与使用

    前面因为项目数据导数据,我们介绍过《Oracle通过ODBC连接SQL Server数据库》,在实际导入过程中新的数据表结构里面存在不少ID的列,所以就用到了O...

    Vaccae
  • Table configuration with catalog null, schema null错误的一个原因

    Generation Warnings Occured Table configuration with catalog null, schema nul...

    用户5640963
  • Spring主从数据库的配置和动态数据源切换原理

    在大型应用程序中,配置主从数据库并使用读写分离是常见的设计模式。在Spring应用程序中,要实现读写分离,最好不要对现有代码进行改动,而是在底层透明地支持。

    用户5640963
  • 【sonar错误提示】

    2.1、修改配置文件 可以编辑my.cnf来修改(windows下my.ini),在[mysqld]段或者mysql的server配置段进行修改。 max_...

    用户5640963
  • Kali Linux Web渗透测试手册(第二版) - 6.4 - 基于错误的SQL注入

    在上一个章节中,我们检测到了一个SQLi。 在本文中,我们将利用该漏洞并使用它从数据库中提取信息。

    7089bAt@PowerLi
  • c# 调用Oracle带有游标的存储过程

    我们在写Oracle存储过程时经常会需要返回数据,像这种方式一般都输出游标的方式。我们今天就来做个用C#程序调用Oracle带有游标输出的存储过程并展示出数据。

    Vaccae

扫码关注云+社区

领取腾讯云代金券