爬虫--分布式爬虫(实例+存入Mysql)

安装模块

pip install scrapy scrapy-redis -i https://pypi.doubanio.com/simple

创建分布式爬虫环境

链接:https://pan.baidu.com/s/16aXPHtePiarEIFATwcILbw 提取码:hhhh

复制example_project文件,可自行更改名称

保留自己需要用的爬虫文件(这里留mycrawler_redis.py)

项目目录结构如下

在这里插入图片描述
主机和从机

主机(master) 启动redis-server

从机(salve)保证可以成功连接上主机的redis(从机不需要启动redis,只需要保证可以成功连接)

第一个分布式爬虫(从机)

#在mycrawler_redis.py


from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor
from scrapy_redis.spiders import RedisCrawlSpider

class MyCrawler(RedisCrawlSpider):

    # 爬虫名
    name = 'mycrawler_redis'
    # redis_key: 类似start_url,但是只是redis的一个key
    # 监听redis中的key
    redis_key = 'mycrawler:start_urls'
    # 允许的域名
    allowed_domains = ['baike.baidu.com']

    rules = [
        Rule(LinkExtractor(allow=('item/.*?',)),callback='parse_page',follow=True),
    ]					#定义规则

    def parse_page(self, response):
           # 标题
        title = response.xpath('//dd[@class="lemmaWgt-lemmaTitle-title"]/h1/text()').get()
        print(title)
        
        # item
        item = BaikeItem()
        item['title'] = title
        yield item






#items.py中
from scrapy.item import Item, Field
class BaikeItem(Item):
    title = Field()




#pipelines.py管道中
class ExamplePipeline(object):
    def process_item(self, item, spider):
        return item





#settings.py中

SPIDER_MODULES = ['example.spiders']
NEWSPIDER_MODULE = 'example.spiders'

USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'


# dupefilter: 去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy_redis的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 是否允许暂停
SCHEDULER_PERSIST = True


#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"

ITEM_PIPELINES = {
    'example.pipelines.ExamplePipeline': 300,

    # 使用redis管道:自动存入redis,默认存入本机的redis
    'scrapy_redis.pipelines.RedisPipeline': 400,
}

LOG_LEVEL = 'DEBUG'

DOWNLOAD_DELAY = 1
	
#配置远程连接redis
#方法1
REDIS_URL = "redis://:密码@IP地址:端口"

#方法2
# REDIS_HOST = 'IP地址'
# REDIS_PORT = 6379
#REDIS_PARAMS = {
# 'password': '123456',
# }

执行分布式爬虫(从机)

cd 到爬虫文件路径
scrapy runspider mycrawler_redis.py				--监听主机redis

Redis添加URL(主机)

lpush mycrawler:start_urls https://baike.baidu.com
	注意:需要和爬虫文件中 redis_key 相对应 ,url对应需要爬取的网址即可

(添加成功后,从机开始爬取,因为写的代码是深度爬取,所以爬虫会一直运行)

爬虫运行后Redis中

在Redis中自动产生下面3个key
1) "mybaike:requests"
    要爬取的url请求队列
    
2) "mybaike:items"
    会自动存储到redis中的数据(在爬虫文件中yield的那个item)

3) "mybaike:dupefilter"
    过滤器: 过滤重复的request

存入Mysql

在mysql中创建一个表  id(int ,自增) 和 title(varchar)字段

在主项目中新建py文件夹Redis_to_MySQL.py


import redis
import pymysql
import time
import json

# 连接redis
r = redis.Redis()

# 连接MySQL
db = pymysql.connect(
    host='localhost', port=3306,
    user='root', password='root',
    database='spider88', charset='utf8'
)
cursor = db.cursor()

while True:
    # 1. 从redis中取数据
    #  blpop: 会等待mybaike:items有数据才会执行,否则会暂停一直等待
    keys, values = r.blpop('mycrawler_redis:item')
    # print(keys, values)
    item = json.loads(values.decode())

    # 2.存入MySQL数据库
    sql = 'insert into baike(title1) values("%s")' % item['title']
    cursor.execute(sql)
    db.commit()

    print(f'--- {item["title"]} 存入MySQL成功 ---')

    time.sleep(0.1)
	


#这个文件需要单独执行
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Scrapy是一个功能强大的Python网络爬虫框架,支持分布式爬虫分布式爬虫是将任务分发给多个机器或节点来执行,可以提高爬虫效率和速度,避免单点故障。 一个Scrapy分布式爬虫实例通常由一个爬虫节点(master)和多个工作节点(slave)组成。爬虫节点负责任务分配和调度,每个工作节点则负责实际的网页抓取和数据提取工作。爬虫节点和工作节点之间通过网络通信来协作完成任务。 实现Scrapy的分布式爬虫需要以下步骤: 1. 在settings.py文件中配置分布式相关的参数,如REDIS_URL、SCHEDULER_PERSIST、DUPEFILTER_CLASS、SCHEDULER、ITEM_PIPELINES等。 2. 创建一个爬虫节点和多个工作节点,可以在不同的机器上运行。启动爬虫节点时,通过命令行传入参数`scrapy crawl [spider_name] -s JOBDIR=[job_directory]`来指定任务保存的目录。 3. 在工作节点上启动爬虫,同样需要指定任务目录和节点标识符。命令行参数格式如下:`scrapy runspider [spider_name] -s JOBDIR=[job_directory] -s NODE_ID=[node_id]` 4. 每个工作节点爬取网页后,会把提取到的数据发送给爬虫节点。爬虫节点可以对数据进行去重和存储等操作,也可以把任务分配给其他可用的工作节点。 5. 爬虫节点可以通过web接口实时监控任务状态和进度,也可以在任务完成后生成报告并邮件通知。 Scrapy分布式爬虫可以加速数据抓取、处理和存储,提高效率和可靠性。但是需要注意,分布式爬虫需要配合高速网络和高性能计算机使用,否则可能会出现性能瓶颈和任务阻塞的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样的男人@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值