• 爬虫框架Scrapy


    爬虫框架Scrapy

    一.scrapy概述

    Scrapy使用了Twisted异步网络框架来处理网络通信,该网络框架可以加快下载速度,并且包含了各种中间件接口,可以灵活地完成各种需求

    Scrapy功能强大,它支持自定义ItemPipline数据管道;支持在Spider中指定(网页域范围)以及对应的Rule(爬取规则);支持XPathDOM的解析等.而且Scrapy还有自己的shell,可以方便地调试爬虫项目和查看爬虫运行结果

    二.scrapy框架架构

    from IPython.display import Image
    Image("./data/10_1.png",width=500)
    

    output_5_0.png

    Scrapy框架主要包含了以下组件:

    1. Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等
    2. Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎
    3. Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理
    4. Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)
    5. Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方
    6. Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件
    7. Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

    三.scrapy框架的运作流程

    scrapy的运作流程由引擎控制,其控制如下:

    1. 引擎向Spiders请求第一个要爬取的URL
    2. 引擎从Spiders中获取到第一个要爬取的URL,封装成Request并交给调度器
    3. 引擎向调度器请求下一个要爬取的Request
    4. 调度器返回下一个要爬取的Request给引擎,引擎将Request通过下载中间件转发给下载器
    5. 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件发送给引擎
    6. 引擎从下载器中接收到Response并通过Spider中间件发送给Spider处理
    7. Spider处理Response并返回爬取到的Item及新的Request给引擎
    8. 引擎将爬取到的Item给Item Pipeline,将Request给调度器
    9. 开始重复第2步,直到调度器中没有更多的Request

    四.scrapy框架的操作

    使用scrapy框架制作爬虫一般需要以下4个步骤:

    1. 新建项目(scrapy startproject xx):创建一个新的爬虫项目
    2. 明确目标(编写items.py):明确想要爬取的目标
    3. 制作爬虫(spiders/xxspider.py):制作爬虫,开始爬取网页
    4. 存储数据(piplines.py):存储爬取内容(一般通过管道进行)

    1.新建scrapy项目

    scrapy startproject 项目名称
    
    from IPython.display import Image
    Image("./data/10_2.png",width=500)
    

    output_13_0.png

    项目目录

    Image("./data/10_3.png",width=500)
    

    output_15_0.png

    各个文件的作用:

    1. scrapy.cfg:配置文件,用于存储项目的配置信息
    2. myspider:项目的python模块
    3. items.py:实体文件,用于定义项目的目标实体
    4. middlewares.py:中间件文件,用于定义Spider中间件
    5. pipelines.py:管道文件,用于定义项目使用的管道
    6. settings.py:设置文件,用于存储项目的设置信息
    7. spiders:存储爬虫代码的目录

    2.明确爬取目标

    页面的网址:http://www.itcast.cn/channel/teacher.shtml;爬取讲师的姓名,级别和个人信息

    scrapy框架提供了基类scrapy.Item用来表示实体数据.scrapy使用Item实体来表示要爬取的数据.Item定义结构化数据字段,类似于python中的字典dict

    Image("./data/10_4.png",width=500)
    

    output_20_0.png

    import scrapy
    
    class MyspiderItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
    
         # 姓名
        name=scrapy.Field()
        # 级别
        title=scrapy.Field()
        # 个人信息
        info=scrapy.Field()
    

    3.制作Spiders

    制作Spiders分为3个步骤实现,分别是创建爬虫,运行爬虫以爬取网页和提取数据

    创建爬虫

    scrapy genspider 爬虫名称 "爬取域"
    
    Image(filename="./data/10_5.png",width=500)
    

    output_26_0.png

    Image(filename="./data/10_6.png",width=500)
    

    output_27_0.png

    首先修改start_urls的值为爬取的第一个URL,然后修改parse()方法,将响应信息转换成文本,保存在teacher.html

    Image(filename="./data/10_7.png",width=500)
    

    output_29_0.png

    运行爬虫,爬取网页

    命令格式:scrapy crawl 爬虫名称;此命令在爬虫名称.py所在的目录下执行

    scrapy crawl itcast
    

    提取数据

    重新编辑parse()方法,完整itcast.py文件如下

    # -*- coding: utf-8 -*-
    import scrapy
    from myspider.items import MyspiderItem
    
    class ItcastSpider(scrapy.Spider):
        name = 'itcast'
        allowed_domains = ['itcast.cn']
        start_urls = ('http://www.itcast.cn/channel/teacher.shtml',)
    
        def parse(self, response):
    
            """
            with open("teacher.html","w",encoding="utf-8") as file:
                file.write(response.text)
            pass
            """
            items=[]
            for each in response.xpath("//div[@class='li_txt']"):
                item=MyspiderItem()
    
                # 使用extract()方法返回的都是Unicode字符串
                name=each.xpath("h3/text()").extract()
                title=each.xpath("h4/text()").extract()
                info=each.xpath("p/text()").extract()
    
                # xpath返回的是包含一个元素的列表
                item["name"]=name[0]
                item["title"]=title[0]
                item["info"]=info[0]
    
                items.append(item)
    
            return items
    

    重新执行:scrapy crawl itcast

    注意:使用文件内容来运行scrapy爬虫.打开项目,在项目中新建一个start.py文件,内容如下

    from scrapy import cmdline
    
    cmdline.execute("scrapy crawl itcast".split())
    

    然后执行start.py文件即可

    4.存储数据

    # 输出JSON格式,默认为Unicode编码
    scrapy crawl itcast -o teachers.json
    # 输出JSON Lines格式,默认为Unicode编码
    scrapy crawl itcast -o teachers.jsonl
    # 输出CSV格式
    scrapy crawl itcast -o teachers.csv
    # 输出XML格式
    scrapy crawl itcast -o teachers.xml
    
    Image(filename="./data/10_8.png",width=500)
    

    output_40_0.png

  • 相关阅读:
    软件工程(2019)第二次作业
    软件工程(2019)第一次作业
    【Java基础】字面量相加的类型转换
    测试之合作篇
    功能测试之难以重现的bug
    功能测试知识之Web输入框验证
    如何编写有效的测试用例?
    Java:switch语句例子
    【转】成功的概念
    Java里的if else嵌套语句例子
  • 原文地址:https://www.cnblogs.com/LQ6H/p/12940566.html
Copyright © 2020-2023  润新知