【Python爬虫】Python3.8分布式爬虫scrapy-redis的搭建与运行(较为全面)

本文详细介绍了scrapy-redis框架的概念、分布式原理以及在Windows和Linux上搭建master和slave节点的具体步骤,包括Python安装、pip包管理、Scrapy配置和Redis的设置,旨在帮助读者实现高效分布式爬取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、scrapy-redis概念

(一)、何为scrapy-redis框架?

(二)、分布式原理

 (三)、分布式爬虫实现的流程

二、分布式爬虫搭建

(一)、Windows(master节点)上要做的事情

1.安装python

2.下载相应的python包

 3.创建你的爬虫项目

 4.配置你项目中的settings文件

5. Windows上redis的配置(重要)

(二)、Linux(slave节点)要做的事情

1.配置网络

2.关闭防火墙

3.配置域名映射

4.配置ssh免密

5.安装python3所需要的环境

6.针对现在Urllib3放弃对 OpenSSL<1.1.1 的支持

7.下载Python安装包解压

8.编译及安装python:

 9.配置环境变量

10.验证pip

 11.升级pip,安装scrapy,scrapy-redis

12.运行爬虫项目


一、scrapy-redis概念

(一)、何为scrapy-redis框架?

一个三方的基于redis的分布式爬虫框架,配合scrapy使用,让爬虫具有了分布式爬取的功能。

(二)、分布式原理

这样的意思是:

scrapy-redis实现分布式,其实从原理上来说很简单,这里为描述方便,我们把自己的核心服务器称为master,而把用于跑爬虫程序的机器称为slave。

我们知道,采用scrapy框架抓取网页,我们需要首先给定它一些start_urls,爬虫首先访问start_urls里面的url,再根据我们的具体逻辑,对里面的元素、或者是其他的二级、三级页面进行抓取。而要实现分布式,我们只需要在这个starts_urls里面做文章就行了

我们在master上搭建一个redis数据库`(注意这个数据库只用作url的存储),并对每一个需要爬取的网站类型,都开辟一个单独的列表字段。通过设置slave上scrapy-redis获取url的地址为master地址。这样的结果就是,尽管有多个slave,然而大家获取url的地方只有一个,那就是服务器master上的redis数据库。

并且,由于scrapy-redis自身的队列机制,slave获取的链接不会相互冲突。这样各个slave在完成抓取任务之后,再把获取的结果汇总到服务器上。

 好处:

程序移植性强,只要处理好路径问题,把slave上的程序移植到另一台机器上运行,基本上就是复制粘贴的事情

 (三)、分布式爬虫实现的流程

  1. 使用三台机器,一台是win11(windows),两台是centos,分别在两台机器上部署scrapy来进行分布式抓取一个网站。

  2. windows的ip地址为实际IP,用来作为redis的master端,centos的机器作为slave。

  3. master的爬虫运行时会把提取到的url封装成request放到redis中的数据。库:“dmoz:requests”,并且从该数据库中提取request后下载网页,再把网页的内容存放到redis的另一个数据库中“dmoz:items”。

  4. slave从master的redis中取出待抓取的request,下载完网页之后就把网页的内容发送回master的redis。

  5. 重复上面的3和4,直到master的redis中的“dmoz:requests”数据库为空,再把master的redis中的“dmoz:items”数据库写入到想要存储的数据库中。

  6. master里的reids还有一个数据“dmoz:dupefilter”是用来存储抓取过的url的指纹(使用哈希函数将url运算后的结果),是防止重复抓取的。

使scrapy的工作流程变成这样:

好了,原理了解了,实现是关键!!!

二、分布式爬虫搭建

(一)、Windows(master节点)上要做的事情

1.安装python

官网:https://www.python.org/downloads/

下载安装完成后,务必配置环境变量

2.下载相应的python包

pip install lxml

pip install scrapy

pip install scrapy-redis

 3.创建你的爬虫项目

scrapy startproject 项目名

scrapy genspider 爬虫名 域名

 4.配置你项目中的settings文件

github地址:https://github.com/darkrho/scrapy-redis

在settings文件中输入以下代码

这是实现分布式的关键:

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True

 另外还有一些次要但也是重要的:

 ROBOTSTXT_OBEY = False # robots协议

USER_AGENT = '' # 可以写死一个User-Agent,亦可动态实现

 对redis的配置,同样是settings文件中

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

REDIS_HOST = ''  # windows机器的IP
REDIS_PORT = 6379  # Redis端口号

爬虫文件需要自行定义,这里我就不多说了。

5. Windows上redis的配置(重要)

①安装redis和图形化工具

安装包:https://wwql.lanzout.com/b052o0lmf,密码:3rsj

链接中包含redis压缩包和redis图形化工具

②修改redis.windows.conf和redis.windows.service.conf两个配置文件以达成使虚拟机的ip亦可访问本地redis数据库。具体可访问以下链接:

【Python爬虫】解决Redis无法使用ip访问(127.0.0.1可以访问)的情况-优快云博客

③ 在redis.windows.conf这个配置文件中,修改以下

stop-writes-on-bgsave-error no (默认值为yes)
即当bgsave快照操作出错时停止写数据到磁盘,这样后面写错做均会失败,为了不影响后续写操作,故需将该项值改为no

至此,Windows端(master节点)配置完毕!

(二)、Linux(slave节点)要做的事情

注:这里采用的使CentOS7作为镜像源。

1.配置网络

vi /etc/sysconfig/network-scripts/ifcfg-ens33  # 配置ip,网关,dns等等。

service network restart  # 重启网络服务

2.关闭防火墙

systemctl disable firewalld  # 永久关闭

3.配置域名映射

vi /etc/hosts  # 新增slave节点(两台)的映射,格式为 ip 主机名

4.配置ssh免密

cd ~

ssh-keygen -t rsa  # 一路确定

cd ~/.ssh

cp id_rsa.pub authorized_keys

chomd 600 authorized_keys

配置完成后 ssh localhost,ssh 主机名,ssh 0.0.0.0输入yes之后不需要密码即可。

5.安装python3所需要的环境

# 安装编译相关工具

yum -y groupinstall "Development tools"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
yum install libffi-devel -y

6.针对现在Urllib3放弃对 OpenSSL<1.1.1 的支持

GitHub地址:Drop support for OpenSSL<1.1.1 · Issue #2168 · urllib3/urllib3 · GitHub

参考:【Python爬虫】ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the ‘ssl‘ module is comp-优快云博客

编译安装openSSL1.1.1n

# 若没有wegt ,使用yum install -y wget
wget https://www.openssl.org/source/openssl-1.1.1n.tar.gz --no-check-certificate

tar zxf openssl-1.1.1n.tar.gz -C 指定目录

cd openssl-1.1.1n/

./config --prefix=/usr/local/openssl 设置安装目录 可以自定义 但是要记住,后面会用到

make -j && make install 编译并安装

/usr/local/openssl/lib 路径添加到系统动态库查找路径中,在 etc 目录下的 profile文件最后面添加下面这一行

export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATH

source /etc/profile     # 使其生效

7.下载Python安装包解压

①官网:

Python Release Python 3.8.2 | Python.org

下载如图所示,点击下载

将该压缩包拖拽或者发送到虚拟机中

cd 指定目录

tar -zxvf Python-3.8.2.tgz -C 指定目录

② 

wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz

8.编译及安装python:

mkdir /usr/local/python3  # 创建编译安装目录

cd python安装目录

./configure --prefix=/usr/local/python3 --with-openssl=/usr/local/openssl --with-ssl-default-suites=openssl --with-system-ffi

make -j && make install

 9.配置环境变量

vi /etc/profile

export PATH=$PATH:/usr/local/python3/bin/ # 配置环境变量

source /etc/profile        # 使其生效

10.验证pip

pip3 -V

 11.升级pip,安装scrapy,scrapy-redis

pip3 install --upgrade pip -i https://pypi.douban.com/simple/
pip3 install scrapy -i https://pypi.douban.com/simple/

pip3 install scrapy-redis -i https://pypi.douban.com/simple/

12.运行爬虫项目

scrapy crawl 爬虫名

至此,运行完成!!!

如果有不对的地方,或者有很好的见解,欢迎在评论区指出和发表,谢谢!

<think>嗯,用户想了解CRC32校验算法的实现和使用方法。我需要先回顾一下CRC32的基本原理,然后考虑如何用简单易懂的中文解释清楚。首先,CRC32是基于循环冗余校验的一种算法,主要用于检测数据传输或存储中的错误。用户可能希望知道它的具体步骤,比如如何初始化、处理数据、异或操作以及最终得到校验值。 根据提供的引用资料,CRC32的核心是多项式除法,但实际中通过查表法优化速度。需要解释生成多项式,比如常见的0xEDB88320,以及初始值、输入输出是否反转这些参数。用户提供的代码片段中有两个版本,一个是逐位计算,另一个是查表法,这可能需要在回答中对比说明,突出查表法的效率优势。 接下来,用户可能关心具体怎么使用这个算法,比如在C语言中的实现步骤,或者如何应用到实际项目中,比如文件校验或网络传输。要分步骤讲解,从初始化到处理每个字节,再到最终计算,可能需要示例代码来辅助说明。同时,注意用户要求行内数学表达式用$...$,比如多项式应该写成$0xEDB88320$这样的格式。 另外,用户的问题里提到生成相关问题,我需要考虑相关的问题可能涉及性能优化、不同生成多项式的影响,或者CRC32其他校验算法的比较。这些可以作为相关问题放在最后,帮助用户进一步探索。 需要确保回答结构清晰,先讲原理,再讲实现步骤,然后使用方法,最后附上相关问题。同时,引用提供的资料,比如引用[^1]和[^2]来支持解释。要避免技术术语过于复杂,保持语言通俗易懂,同时满足LaTeX格式要求,比如多项式用$符号包裹。检查是否有遗漏的步骤,比如输入反转和输出反转的处理,这在代码示例中有所体现,需要解释清楚这些参数的作用。</think>### CRC32校验算法实现及使用方法 #### 一、CRC32基本原理 CRC32通过多项式除法生成32位校验值,用于检测数据传输或存储中的错误。其核心是生成多项式$G(x)$,常用标准为$0xEDB88320$(反向多项式形式)[^1]。算法流程如下: 1. **初始化**:设置32位寄存器初值为$0xFFFFFFFF$ 2. **数据输入**:逐字节寄存器异或运算 3. **位移处理**:根据多项式进行循环移位和异或操作 4. **结果取反**:最终值$0xFFFFFFFF$异或 #### 二、算法实现(C语言) ```c // 查表法实现(高效) uint32_t crc32_table[256]; void init_crc32_table() { for (int i = 0; i < 256; i++) { uint32_t crc = i; for (int j = 0; j < 8; j++) { crc = (crc >> 1) ^ ((crc & 1) ? 0xEDB88320 : 0); } crc32_table[i] = crc; } } uint32_t calc_crc32(uint8_t *data, size_t len) { uint32_t crc = 0xFFFFFFFF; while (len--) { crc = (crc >> 8) ^ crc32_table[(crc ^ *data++) & 0xFF]; } return crc ^ 0xFFFFFFFF; } ``` 此实现通过预先生成的256元素查找表,将时间复杂度从$O(n \cdot 8)$优化到$O(n)$。 #### 三、使用场景及方法 1. **文件校验**:计算文件CRC32值验证完整性 ```bash $ crc32 filename.txt ``` 2. **网络传输**:在数据帧尾部附加4字节校验码 3. **存储系统**:RAID、ZFS等文件系统使用CRC32校验数据块 #### 四、参数配置 | 参数 | 说明 | 标准值 | |---------------|---------------------------|-----------------| | 初始值 | 寄存器初始状态 | 0xFFFFFFFF | | 多项式 | 生成多项式 | 0xEDB88320 | | 输入/输出反转 | 字节处理顺序 | 通常需要反转 |
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值