栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python 爬虫之scrapy分布式

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python 爬虫之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上的程序移植到另一台机器上运行,基本上就是复制粘贴

redis 的配置 参考:window 中redis 的配置和开启_宠乖仪的博客-CSDN博客

二、scrapy-redis框架的安装

scrapy-redis参考:GitHub - rmax/scrapy-redis: Redis-based components for Scrapy.

pip install scrapy-redis
1、方法一

settings.py

# 指纹  作用:redis数据库中url去重类
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 调度器  启用Redis调度存储请求队列
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 不清除Redis队列、这样可以暂停/恢复  继续 爬取
SCHEDULER_PERSIST = True

ITEM_PIPELINES = {
    # 把数据 放在redis里面
    'scrapy_redis.pipelines.RedisPipeline': 300
}

在window端的settings.py 加入

REDIS_HOST = 'localhost' #master IP

REDIS_PORT = 6379
2、方法二

spider.py

from scrapy_redis.spiders import RedisSpider
import scrapy
class LianjiaSpider(RedisSpider):
    name = 'lianjia'
    allowed_domains = ['lianjia.com']
    page = 2
    # start_urls = ['https://sh.lianjia.com/ershoufang/pg1/']
    # myscrawl 自己随便定义
    redis_key ='myscrawl:start_urls'

    # # 优先获取列表
    # def start_requests(self):
    #     for i in range(1,101):
    #         yield scrapy.Request('https://sh.lianjia.com/ershoufang/pg{i}/')

    def parse(self, response):
        url_list=response.xpath('//div[@]/div[@]/a/@href').getall()
        for url  in url_list:
            yield scrapy.Request(url,callback=self.parse_info)
        if self.page <101:
            yield scrapy.Request(f'https://sh.lianjia.com/ershoufang/pg{self.page}/')

    def parse_info(self, response):
        title = response.xpath('//div[@]/a[1]/text()').get()
        action = response.xpath('string(//div[@]/span[@])').get()
        momey = response.xpath('//div[@]/span').get()
        yield {
            'title':title,
            'action':action,
            'momey':momey
        }
3、方法三
scrapy genspider -t crawl name  allow_domains

spider.py

import scrapy
from scrapy.linkextractors import linkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_redis.spiders import RedisCrawlSpider

class XsSpider(RedisCrawlSpider):
    name = 'xs'
    allowed_domains = ['biquge5200.net']
    start_urls = ['http://www.biquge5200.net/0_111/75039.html']

    rules = (
        Rule(linkExtractor(restrict_xpaths=r'//div[@]/a[4]'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        title= response.xpath('//div[@]/h1/text()').get()
        content = response.xpath('string(//div[@id="content"])').get()
        yield {
            'title':title,
            'content':content
        }
4、方式二和方法三程序运行
scrapy crawl name
# 这个命令是在redis-cli中运行
# redis_key 是 spider.py文件中的redis_key的值
# url 开始爬取地址,不加双引号


lpush (redis_key)  url #括号不用写
5、redis的数据导给monogo

数据库与数据库之间的交互_宠乖仪的博客-CSDN博客

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/323639.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号