• 08 scrapy框架


    scrapy介绍

    通用的网络爬虫框架

    架构介绍(框架)

    一、scrapy执行流程

    五大组件

    -引擎(EGINE):大总管,负责控制数据的流向
    -调度器(SCHEDULER):由它来决定下一个要抓取的网址是什么,去重
    -下载器(DOWLOADER):用于下载网页内容, 并将网页内
            容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的
    -爬虫(SPIDERS):开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求request
    -项目管道(ITEM PIPLINES):在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作
    

    两大中间件

    -爬虫中间件:位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入和输出(用的很少)
    -下载中间件:引擎和下载器之间,加代理,加头,集成selenium 
    

    二、scrapy的安装

    pip3 install scrapy
    

    三、scrapy创建项目,创建爬虫,运行爬虫

    创建项目

    scrapy startproject 项目名
    scrapy startproject firstscrapy
    # cd到指定目录,再创
    

    创建爬虫

    scrapy genspider 爬虫名 爬虫地址
    scrapy genspider chouti dig.chouti.com
    一执行就会在spider文件夹下创建出一个py文件,名字叫chouti
    

    运行爬虫

    scrapy crawl chouti   # 带运行日志
    scrapy crawl chouti --nolog  # 不带日志
    
    -在项目路径下新建一个main.py,再运行main.py即可
    from scrapy.cmdline import execute
    execute(['scrapy','crawl','chouti','--nolog'])
    

    四、目录介绍

    # 目录介绍
    firstscrapy  # 项目名字
        firstscrapy # 包
            -spiders # 所有的爬虫文件放在里面
                -baidu.py # 一个个的爬虫(以后基本上都在这写东西)
                -chouti.py
            -middlewares.py # 中间件(爬虫,下载中间件都写在这)
            -pipelines.py   # 持久化相关写在这(items.py中类的对象)
            -main.py        # 自己加的,执行爬虫
            -items.py       # 一个一个的类,
            -settings.py    # 配置文件
        scrapy.cfg          # 上线相关
    

    五、settings简单介绍

    1 默认情况,scrapy会去遵循爬虫协议
    2 修改配置文件参数,强行爬取,不遵循协议
    	-ROBOTSTXT_OBEY = False
    3 USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
    4 LOG_LEVEL='ERROR'
    

    六、scrapy的数据解析

    #xpath:
        -response.xpath('//a[contains(@class,"link-title")]/text()').extract()  # 取文本
        -response.xpath('//a[contains(@class,"link-title")]/@href').extract()  #取属性
    #css
        -response.css('.link-title::text').extract()  # 取文本
        -response.css('.link-title::attr(href)').extract_first()  # 取属性
    

    七、持久化储存

    #1 方案一:parser函数必须返回列表套字典的形式(了解)
    	scrapy crawl chouti -o chouti.csv
    #2 方案二:高级,pipline item存储(mysql,redis,文件)
    	-在Items.py中写一个类
        -在spinder中导入,实例化,把数据放进去
        	    item['title']=title
                item['url']=url
                item['photo_url']=photo_url
                yield item
                
        -在setting中配置(数字越小,级别越高)
        	ITEM_PIPELINES = {
       		'firstscrapy.pipelines.ChoutiFilePipeline': 300,
    		}
        -在pipelines.py中写ChoutiFilePipeline
        	-open_spider(开始的时候)
            -close_spider(结束的时候)
            -process_item(在这持久化)
    

    实战:爬取抽屉热点新闻网

    chouti.py
    import scrapy
    from firstscrapy.items import ChoutiItem
    
    class ChoutiSpider(scrapy.Spider):
        name = 'chouti'
        allowed_domains = ['dig.chouti.com']
        start_urls = ['http://dig.chouti.com/']
        
        
        def parse(self, response):
            # 获取div列表
            div_list = response.xpath('//div[contains(@class,"link-item")]')
            for div in div_list:
                # 从item中导入 并实例化(类似于django中的models)
                item = ChoutiItem()
                title = div.css('.link-title::text').extract()[0]  # 由于extract得到的是一个列表
                url = div.css('.link-title::attr(href)').extract()[0]  # 两种方法都可以
                photo_url = div.css('.image-scale::attr(src)').extract_first()
                # 由于有些热点没有图片
                if not photo_url:
                    photo_url = ''
                item['url'] = url
                item['title'] = title
                item['photo_url'] = photo_url
                yield item   
    
    piplines.py
    import pymysql
    
    
    class ChoutiMysqlPipeline:
        def open_spider(self, spider):
            self.conn = pymysql.connect(host='127.0.0.1', user='root', password="123",
                                        database='news', port=3306)
    
        def process_item(self, item, spider):
            cursor = self.conn.cursor()
            sql = 'insert into article (title,url,photo_url)values(%s,%s,%s)'
            cursor.execute(sql, [item['title'], item['url'], item['photo_url']])
            self.conn.commit()
            return item
    
        def close_spider(self, spider):
            self.conn.close()
    
    items.py
    import scrapy
    
    
    class ChoutiItem(scrapy.Item):
        # define the fields for your item here like:
        title = scrapy.Field()
        url = scrapy.Field()
        photo_url = scrapy.Field()
    
  • 相关阅读:
    元宇宙通证
    高性能公链
    区块链不可能三角
    搭建自己的在线API文档系统
    windows 安装python环境
    golang beego项目的正确开启方法
    人生发财靠康波
    蒙代尔不可能三角
    Kubernetes 部署Dashboard UI
    Kubernetes 使用kubeadm创建集群
  • 原文地址:https://www.cnblogs.com/bailongcaptain/p/13446297.html
Copyright © 2020-2023  润新知