• scrapy-redis实现全站分布式数据爬取


    需求

    • scrapy+redis分布式爬取58同城北京全站二手房数据

    环境

    • win10
    • pycharm2019.2
    • python3.7
    • scrapy模块| scrapy_redis模块|redis数据库

    需求

    • 基于Spider或者CrawlSpider进行二手房信息的爬取
    • 本机搭建分布式环境对二手房信息进行爬取
    • 搭建多台机器的分布式环境,多台机器同时进行二手房数据爬取

    编码流程

    step1:创建项目工程,在终端输入如下指令

    Copyscrapy startproject bj58Pro
    

    step2:进入工程,创建基于CrawlSpider的爬虫文件

    Copycd bj58Pro
    scrapy genspider -t crawl bj2sh www.xxx.com
    Copy# items.py
    import scrapy
    
    class Bj58ProItem(scrapy.Item):
        title = scrapy.Field()		# 二手房信息标题
        desc = scrapy.Field()		# 详细信息描述
        addr = scrapy.Field()		# 地址
        price = scrapy.Field()		# 价格
    

    step4:在bj2sf.py文件中解析数据

    • a 导包 from scrapy_redis.spiders import RedisCrawlSpider
    • b 修改Bj2sfSpider的父类为RedisCrawlSpider
    • c 注释allowed_domains和start_urls
    • d 定义redis_key = 'bj2sf'
    • e rules中定义解析全站数据爬取的链接提取器 link = LinkExtractor(allow=r'/ershoufang/pnd+')
    • f parse_item()方法定定义数据解析规则
    Copy# bj2sf.py
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    from scrapy_redis.spiders import RedisCrawlSpider
    from bj58Pro.items import Bj58ProItem
    
    class Bj2sfSpider(RedisCrawlSpider):
        name = 'bj2sf'
        # allowed_domains = ['www.xxx.com']
        # start_urls = ['https://bj.58.com/ershoufang/']
        redis_key = 'bj2sf'
    	link = LinkExtractor(allow=r'/ershoufang/pnd+')
        rules = (
            Rule(link, callback='parse_item', follow=True),
        )
    
        def parse_item(self, response):
            item = Bj58ProItem()
            li_list = response.xpath('/html/body/div[5]/div[5]/div[1]/ul/li')
            for li in li_list:
                item["title"] = li.xpath('./div[2]/h2/a/text()').get()
                item["desc"] = li.xpath('./div[2]/p[1]/span/text()').getall()
                item["addr"] = li.xpath('./div[2]/p[2]/span/a/text()').getall()
                item["price"] = li.xpath('./div[3]/p//text()').getall()
                yield item
    

    step5:配置文件设置scrapy_redis分布式爬虫的参数

    Copy# settings.py
    
    BOT_NAME = 'bj58Pro'
    SPIDER_MODULES = ['bj58Pro.spiders']
    NEWSPIDER_MODULE = 'bj58Pro.spiders'
    
    USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
    
    # Obey robots.txt rules
    ROBOTSTXT_OBEY = False
    # LOG_LEVEL = 'ERROR'
    
    ITEM_PIPELINES = {
        'scrapy_redis.pipelines.RedisPipeline': 400,
    }
    #增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    #使用scrapy-redis组件自己的调度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    #配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
    SCHEDULER_PERSIST = True
    
    # 指定redis数据库的连接参数
    REDIS_HOST = '127.0.0.1'
    REDIS_PORT = 6379
    REDIS_ENCODING = "utf-8"
    

    step6:开启Redis服务器的服务端和客户端

    step7:运行项目,进入spiders目录下,终端输入如下指令

    Copyscrapy runspider bj2sf.py
    

    step8:找到任意redis客户端,输入:lpush redis_key 起始url

    Copylpush bj2sf https://bj.58.com/ershoufang/
    

    参考https://www.cnblogs.com/liuxu2019/p/12112728.html

  • 相关阅读:
    ie不支持 event.stopPropagation 的解决方式
    jquery 获取 元素.text( ) 里面的值 需要进行去空格去换行符操作
    使用插件实现某元素展示特定行文字,超出显示...
    css文字超出显示省略号
    纯css实现各种三角形图案
    jQuery判断鼠标是否在某个元素内
    z-tree相关设置
    js提取字符串中的汉字
    扩展ie中不兼容的startsWith,endsWith方法
    获取浏览器URL携带过来的参数/获取url中"?"符后的字串
  • 原文地址:https://www.cnblogs.com/hanfe1/p/12692515.html
Copyright © 2020-2023  润新知