分布式爬虫过程

(3) 2024-05-14 21:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说分布式爬虫过程,希望能够帮助你!!!。

一、redis数据库实现RedisCrawlSpider分布式操作

redis的准备工作:
  1.对redis配置文件进行配置:

- 注释该行:bind 127.0.0.1,表示可以让其他ip访问redis
    - 将yes改为no:protected-mode no,表示可以让其他ip操作redis
  2.启动redis:
    mac/linux: redis-server redis.conf 进客户端可以查看info Server
    windows: redis-server.exe redis-windows.conf
 redis-cli -h 192.168.1.2 -p 6379 远程连接数据看
bind 0.0.0.0

实现分布式爬虫的操作步骤:
  1. 将redis数据库的配置文件进行改动: .修改值 protected-mode no .注释 bind 127.0.0.1

2. 下载scrapy-redis
  pip3 install scraps-redis

3. 创建工程 scrapy startproject 工程名
  scrapy startproject 工程名

4. 创建基于scrawlSpider的爬虫文件
  cd 工程名
  scrapy genspider -t crawl 项目名

5. 导入RedisCrawlSpider类
  from scrapy_redis.spiders import RedisCrawlSpider

6. 在现有代码的基础上进行连接提取和解析操作
  class RidesdemoSpider(RedisCrawlSpider):
  redis_key = “redisQueue”
  
  7. 将解析的数据值封装到item中,然后将item对象提交到scrapy-redis组件中的管道里(自建项目的管道没什么用了,可以直接删除了,用的是组件封装好的scrapy_redis.pipelines中)
  ITEM_PIPELINES = {

   ‘scrapy_redis.pipelines.RedisPipeline’: 400,
  }
  8管道会将数据值写入到指定的redis数据库中(在配置文件中进行指定redis数据库ip的编写)  REDIS_HOST = ‘192.168.12.2’ #你的主redis的服务端IP
REDIS_PORT = 6379
REDIS_ENCODING = ‘utf-8’
# REDIS_PARAMS = {‘password’:’123456’} ##requirepass test123 设置redis密码
9. 在当前工程中使用scrapy-redis封装好的调度器(在配置文件中进行配置)
seeting.py配置总结

ITEM_PIPELINES = { 
   
    'scrapy_redis.pipelines.RedisPipeline': 400,
}
REDIS_HOST = '192.168.12.2'
REDIS_PORT = 6379
REDIS_ENCODING = 'utf-8'
# REDIS_PARAMS = {‘password’:’123456’}


# 使用scrapy-redis组件的去重队列
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 是否允许暂停
SCHEDULER_PERSIST = True


 \##是否在关闭的时候保留数据REDIS_PARAMS
# SCHEDULER_FLUSH_ON_START = True # 是否在开始之前清空 调度器和去重记录,True=清空,False=不清空 

二、redis数据库实现RedisSpider分布式操作

1.要将一个scrapy的项目变成scrapy_redis.spiders.RedisSpider 或者是从scrapy.CrawlSpider 变成scrapy_redis.spider.RedisCrawlSpdier
2.将爬虫中的start_urls删掉。增加一个redis_key=“xxx”,这个redis_key是为了以后在 redis中控制爬虫启动的。爬虫的第一个url,就是在redis 中通过这个发送出去的。

如redis_key = “cnbeta:start_urls”,只要自己记得住就行,可以随便写,如图所示
分布式爬虫过程_https://bianchenghao6.com/blog__第1张

3.配置,上面说的在settings中配置

4.在爬虫服务器上 进入所有在爬虫文件的路径 然后输入命令:
在多个服务器打开爬虫文件的路径,都输入这个命令

scrapy runspider [爬虫文件名字.py]

5.在redis服务器上,推入一个开始的url链接:

redis-cli
lpush [redis_key] start_url 开始爬取  start_url是你要起始爬取的链接。

之后多个服务器都在进行爬取数据,并且互不重复,配置文件已经自动去重了

附加redis的一些命令:

清空 redis FLUSHALL 

1.删除指定索引的值:del key

2.清空整个 Redis 服务器的数据:flushall 

3.清空当前库中的所有 key:flushdb 

4.查看键的类型 type keyname

数据存入数据库

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import pymysql


class AspiderPipelines(object):
    def __init__(self):
        dbparams = {
            'host': '127.0.0.1
            'port': 3306,
            'user': 'root',
            'password': 'root',
            'database': 'demo',
            'charset': 'utf8',
        }
        self.conn = pymysql.connect(**dbparams)
        self.cursor = self.conn.cursor()
        self._sql = None

    def process_item(self, item, spider):
        self.cursor.execute(self.sql,(item['title'],item['content']))
        self.conn.commit()
        return item

    @property
    def sql(self):
        if not self._sql:
            self._sql = """
            insert into article(id,title,content) values (null,%s,%s)"""
            return self._sql
        return self._sql

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复