• Scrapy框架之Spider模板 转


     

    一、安装scrapy

    首先安装依赖库Twisted
    
        pip install (依赖库的路径)
    
        在这个网址http://www.lfd.uci.edu/~gohlke/pythonlibs#twisted 下面去寻找符合你的python版本和系统版本的Twisted
    
    然后在安装scrapy框架
    
        pip install scrapy
    
        【注意】路径名不能有中文,不能用管理员进入cmd,电脑系统用户路径不能是中文
    
    

    二、框架简介

    该框架是一个第三方的框架,许多功能已经被封装好(比如:下载功能)

     
    流程原理图
    由五部分构成:
    
    引擎、下载器、爬虫、调度器、管道(item和pipeline)
    
    以上五部分我们只需要关系其中的两部分:爬虫和管道
    
    spiders:蜘蛛或爬虫,我们分析网页的地方,我们主要的代码写在这里
    
    管道:包括item和pipeline,用于处理数据
    
    引擎:用来处理整个系统的数据流,触发各种事务(框架的核心)
    
    下载器:用于下载网页内容,并且返回给蜘蛛(下载器基于Twisted的高效异步模型)
    
    调度器:用来接收引擎发过来的请求,压入队列中等处理任务
    

    三、使用

    • 创建项目指令
    scrapy startproject 项目名
    
    • 项目目录结构
    firstSpider     项目名称
            firstSpider
                spiders           爬虫目录(写代码位置)
                    __init__.py
                    myspider.py       爬虫文件,以后的爬虫代码写在这里
                __init__.py
                items.py              定义数据结构地方
                middlewares.py    中间件(了解)
                pipelines.py      管道文件
                settings.py       项目配置文件
            scrapy.cfg
    
    • 创建爬虫指令
    scrapy genspider 爬虫名 域名
    
    • 运行爬虫指令
    scrapy crawl 爬虫名
    scrapy crawl 爬虫名 -o xxx.csvjsonxml
    

    四、执行流程

    1输入scrapy crawl '项目名称'
    2读取setting.py配置信息
    3执行spiders目录下的爬虫程序,执行_init_()方法和parse()方法
    4在parse方法里解析html,返回一个item实4按照配置顺序执行pipelines.py(可多个)执行逻辑,一般是存储。
    5程序结束。
    

    五、管道包含 items and pipline

    • 作用

    1、清理HTML数据。

    2、验证爬取数据,检查爬取字段。

    3、查重并丢弃重复内容。

    4、将爬取结果保存到数据库。

    • 几个核心的方法

    创建一个项目的时候都会自带pipeline其中就实现了process_item(item, spider)方法

    1、open_spider(spider)就是打开spider时候调用的,常用于初始化操作(常见开启数据库连接,打开文件)
    2、close_spider(spider)关闭spider时候调用,常用于关闭数据库连接
    3、from_crawler(cls, crawler)是一个类方法(需要使用@classmethod装饰器标识),一般用来从settings.py中获取常量的
    
    4、process_item(item, spider)是必须实现的,别的都是选用的!
    -   参数
            item是要处理的item对象
            spider当前要处理的spider对象
    
    -   返回值
            返回item就会继续给优先级低的item pipeline二次处理
            如果直接抛出DropItem的异常就直接丢弃该item
    
    • piplines.py

    进行数据存储

    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    
    import csv
    import pymysql
    # 写入csv表格
    class InterestingPipeline(object):
    
        # 开启爬虫
        def open_spider(self,spider):
            self.csv_file = open("u148.csv",'w',encoding='utf-8')
            # 创建一个列表用于整合csv数据
            self.csv_items = []
    
        def process_item(self, item, spider):
            # 整合csv数据
            # 把item字典转化成列表
            csv_item =[]
            csv_item.append(item['title'])
            csv_item.append(item['author'])
            csv_item.append(item['intro'])
            csv_item.append(item['img'])
            csv_item.append(item['type'])
            csv_item.append(item['date'])
    
            self.csv_items.append(csv_item)
    
            # 【注意】这里每遍历一个item以后一定要把他返回出去,如果不返回,其它优先级比这个管道低的就无法获取到其它item
            return item
    
        def close_spider(self,spider):
    
            # 把前面整合完成的数据写入csv文件
            writer = csv.writer(self.csv_file)
            # 写表头
            writer.writerow(['title','author','intro','img','type','date'])
            # 写内容
            writer.writerows(self.csv_items)
            self.csv_file.close()
    
    
    
    # 定义一个管道类,用于写入数据库
    class MysqlPipeline(object):
    
        def open_spider(self,spider):
            self.db =pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123456',db='u148',charset='utf8')
            self.cursor =self.db.cursor()
            # self.db.begin()
    
    
        def process_item(self,item,spider):
            # 定义sql语句
            sql = "INSERT INTO music VALUES(NULL,'%s','%s','%s','%s','%s','%s')"%(item['title'],item['author'],item['img'],item['intro'],item['type'],item['date'])
            self.cursor.execute(sql)
            self.db.commit()
            return  item
    
        def close_spider(self,spider):
            self.cursor.close()
            self.db.close()
    
    • items.py
    import scrapy
    # 主要是对待爬取的数据进行模型化,并且对接需求分析
    
    class InterestingItem(scrapy.Item):
        # 本质是一个字典对象,
    
    
        # define the fields for your item here like:
        # name = scrapy.Field()
        # 网页里面需要爬取那些内容
        # title
        title = scrapy.Field()
        # 图片
        img = scrapy.Field()
    
        # 简介
        intro = scrapy.Field()
        # 作者
        author = scrapy.Field()
        # 类型
        type = scrapy.Field()
        # 日期
        date = scrapy.Field()
    
    

    五、settings配置

    • 代理设置
    USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
    
    • 是否遵循robots协议
    ROBOTSTXT_OBEY = False
    
    • 下载延时
    # 单位:秒
    DOWNLOAD_DELAY = 2
    
    • 默认请求头
    DEFAULT_REQUEST_HEADERS = {
        'Accept': '*/*',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Connection': 'keep-alive',
        # 'Host': 'passport.weibo.cn',
        'Origin': 'https://passport.weibo.cn',
        'Referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&r=https%3A%2F%2Fweibo.cn%2F%3Fluicode%3D20000174&backTitle=%CE%A2%B2%A9&vt='
    
    }
    
    • 开启管道
    ITEM_PIPELINES = {
        #300表示优先级,范围(0-1000),越小级别越高
       'Weibo.pipelines.WeiboPipeline': 300,
    }
    
     
  • 相关阅读:
    [AX2012 R3]在SSRS报表中使用QR二维码
    [AX2012 R3]关于Alerts
    [AX2012 R3]关于Named user license report
    [AX2012]Report data provider调试
    [AX2012]Claims user
    [AX2012]发送广播邮件
    [AX 2012] Woker user request
    AX2012 R3升级CU8的一些错误
    消失的银行 读后感
    Openstack实践(1)部署使用实例及neutron网络
  • 原文地址:https://www.cnblogs.com/brady-wang/p/11039777.html
Copyright © 2020-2023  润新知