美文网首页技术文章Python爬虫程序猿
Scrapy 框架基本了解以及Spiders爬虫

Scrapy 框架基本了解以及Spiders爬虫

作者: 博行天下 | 来源:发表于2017-11-28 11:56 被阅读2523次

    Scrapy 框架基本了解以及Spiders爬虫,首先我们先了解下Scrapy 框架基本原理,然后我们用一个简单的案例来介绍Scrapy的使用。

    Scrapy 框架基本了解:
    1、Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。
    2、框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。
    3、Scrapy 使用了 Twisted'twɪstɪd异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。
    4、Scrapy框架流程图

    scrapy_all.png

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

    Scrapy 框架Spiders步骤:
    1、创建一个Scrapy项目scrapy startproject mySpider
    2、定义提取的结构化数据(Item)
    3、编写爬取网站的 Spider 并提取出结构化数据(Item)
    scrapy genspider example example.com

    scrapy.cfg :项目的配置文件
    mySpider/ :项目的Python模块,将会从这里引用代码
    mySpider/items.py :项目的目标文件
    mySpider/pipelines.py :项目的管道文件
    mySpider/settings.py :项目的设置文件
    mySpider/spiders/ :存储爬虫代码目录
    

    4、编写 Item Pipelines 来存储提取到的Item(即结构化数据)

    在mySpider目录下执行:scrapy crawl itcast

    保存数据:
    scrapy保存信息的最简单的方法主要有四种,-o 输出指定格式的文件,命令如下:
    
    # json格式,默认为Unicode编码
    scrapy crawl itcast -o teachers.json
    # json lines格式,默认为Unicode编码
    scrapy crawl itcast -o teachers.jsonl
    # csv 逗号表达式,可用Excel打开
    scrapy crawl itcast -o teachers.csv
    # xml格式
    scrapy crawl itcast -o teachers.xml
    

    5、Spiders爬取某个培训结构老师的信息
    items.py

    模型类
    
    import scrapy
    # Item 定义结构化数据字段,用来保存爬取到的数据
    class TeacherinfoItem(scrapy.Item):
        # 获取名字
        name = scrapy.Field()
        # 职称
        position = scrapy.Field()
        # 个人信息
        info = scrapy.Field()
    

    myteacher.py

    爬虫文件
    
    # -*- coding: utf-8 -*-
    import scrapy
    from teacherInfo.items import TeacherinfoItem
    class MyteacherSpider(scrapy.Spider):
        name = 'myteacher'
        allowed_domains = ['itcast.cn']
        # start_urls = ("http://www.itcast.cn/channel/teacher.shtml",) 元组也可以
        start_urls = ['http://www.itcast.cn/channel/teacher.shtml#ac',
                      'http://www.itcast.cn/channel/teacher.shtml#acloud',
                      'http://www.itcast.cn/channel/teacher.shtml#adesign',
                      'http://www.itcast.cn/channel/teacher.shtml#ads',
                      'http://www.itcast.cn/channel/teacher.shtml#ajavaee',
                      'http://www.itcast.cn/channel/teacher.shtml#anetmarket',
                      'http://www.itcast.cn/channel/teacher.shtml#aphp',
                      'http://www.itcast.cn/channel/teacher.shtml#apm',
                      'http://www.itcast.cn/channel/teacher.shtml#apython',
                      'http://www.itcast.cn/channel/teacher.shtml#astack',
                      'http://www.itcast.cn/channel/teacher.shtml#atest',
                      'http://www.itcast.cn/channel/teacher.shtml#aui',
                      'http://www.itcast.cn/channel/teacher.shtml#auijp',
                      'http://www.itcast.cn/channel/teacher.shtml#aweb']
        # 爬虫的约束区域
        def parse(self, response):
            # 存放老师信息的集合
            items = []
            print(response.body)
            for each in response.xpath("//div[@class='li_txt']"):
                # 将我们得到的数据封装到一个 `ItcastItem` 对象
                item = TeacherinfoItem()
                # extract()方法返回的都是unicode字符串
                name = each.xpath("h3/text()").extract()
                position = each.xpath("h4/text()").extract()
                info = each.xpath("p/text()").extract()
                # xpath返回的是包含一个元素的列表
                item['name'] = name[0]
                item['position'] = position[0]
                item['info'] = info[0]
                items.append(item)
                yield item
            # 直接返回最后数据
            # return items
    

    pipelines.py

    管道
    
    import json
    import codecs
    class TeacherinfoPipeline(object):
        def __init__(self):
            self.filename = codecs.open('teacher.json','wb','utf-8')
        def process_item(self, item, spider):
            print(item)
            html = json.dumps(dict(item),ensure_ascii=False)
            self.filename.write(html + '\n')
            return item
    
        def open_spider(self, spider):
            pass
            # self.filename.close()
    

    settings.py

    基本设置
    
    BOT_NAME = 'teacherInfo'
    SPIDER_MODULES = ['teacherInfo.spiders']
    NEWSPIDER_MODULE = 'teacherInfo.spiders'
    USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:56.0)'
    ROBOTSTXT_OBEY = True
    SPIDER_MIDDLEWARES = {
       'teacherInfo.middlewares.TeacherinfoSpiderMiddleware': 543,
    }
    ITEM_PIPELINES = {
       'teacherInfo.pipelines.TeacherinfoPipeline': 300,
    }
    

    begin.py

    运行和调试文件
    
    from scrapy import cmdline
    cmdline.execute('scrapy crawl myteacher'.split())
    

    配置begin.py文件请移步PyCharm运行和调试Scrapy
    了解这么多,就可以使用Scrapy框架爬虫了,一起学习。

    相关文章

      网友评论

      本文标题:Scrapy 框架基本了解以及Spiders爬虫

      本文链接:https://www.haomeiwen.com/subject/zmeavxtx.html