scrapy

作者: 背对背吧 | 来源:发表于2019-01-05 16:09 被阅读0次

    Scrapy

    步骤:
    新建项目 (Project):新建一个新的爬虫项目
    明确目标(Items):明确你想要抓取的目标
    制作爬虫(Spider):制作爬虫开始爬取网页
    存储内容(Pipeline):设计管道存储爬取内容

    Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

    Scratch,是抓取的意思,这个Python的爬虫框架叫Scrapy

    Scrapy 使用了 Twisted异步网络库来处理网络通讯 结构图

    Scrapy主要包括了以下组件:

    1).引擎(Scrapy)
      用来处理整个系统的数据流处理, 触发事务(框架核心)
    
    2).调度器(Scheduler)
    用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
    
    
    3).下载器(Downloader)
    用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
    
    4).爬虫(Spiders)
    爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
    
    5).项目管道(Pipeline)
    负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
    
    6).下载器中间件(Downloader Middlewares)
    位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
    
    7).爬虫中间件(Spider Middlewares)
    介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
    
    8).调度中间件(Scheduler Middewares)
    介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
    

    安装方式

    Ubuntu 安装方式
    通过pip3 安装 Scrapy 框架
    sudo pip3 install scrapy
    如果安装不成功再试着添加这些依赖库:
    安装非Python的依赖
    sudo apt-get install python3-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev

    创建项目

    终端打开
    scrapy startproject + 项目名称
    cd + 项目名称
    cd +项目名称
    cd spider
    scrapy genspider + 项目名称 + 域(如:baidu.com)
    如果有虚拟环境 进入虚拟环境后再操作
    项目创建完毕后,关闭终端

    使用编辑器打开项目

    项目内各文件作用

    spiders 爬虫目录,如:创建文件,编写爬虫规则 存储爬虫的目录

    spider文件下
    项目.py

    # -*- coding: utf-8 -*-
    import scrapy
    from tencent.items import TencentItem
    
    class TencentpositionSpider(scrapy.Spider):
        """
        功能:爬取腾讯社招信息
        """
        # 爬虫名
        name = "tencentPosition"
        # 爬虫作用范围
        allowed_domains = ["tencent.com"]
    
        url = "http://hr.tencent.com/position.php?&start="
        offset = 0
        # 起始url
        start_urls = [url + str(offset)]
    
        def parse(self, response):
            for each in response.xpath("//tr[@class='even'] | //tr[@class='odd']"):
                # 初始化模型对象
                item = TencentItem()
                # 职位名称
                item['positionname'] = each.xpath("./td[1]/a/text()").extract()[0]
                # 详情连接
                item['positionlink'] = each.xpath("./td[1]/a/@href").extract()[0]
                # 职位类别
                item['positionType'] = each.xpath("./td[2]/text()").extract()[0]
                # 招聘人数
                item['peopleNum'] =  each.xpath("./td[3]/text()").extract()[0]
                # 工作地点
                item['workLocation'] = each.xpath("./td[4]/text()").extract()[0]
                # 发布时间
                item['publishTime'] = each.xpath("./td[5]/text()").extract()[0]
    
                yield item
    
            if self.offset < 1680:
                self.offset += 10
    
            # 每次处理完一页的数据之后,重新发送下一页页面请求
            # self.offset自增10,同时拼接为新的url,并调用回调函数self.parse处理Response
            yield scrapy.Request(self.url + str(self.offset), callback = self.parse)
    

    scrapy.cfg 项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)

    items.py 设置数据存储模板,用于结构化数据,如:Django的Model

    在Scrapy中,items是用来加载抓取内容的容器,有点像Python中的Dic,也就是字典,但是提供了一些额外的保护减少错误。

    一般来说,item可以用scrapy.item.Item类来创建,并且用scrapy.item.Field对象来定义属性(可以理解成类似于ORM的映射关系)。

    接下来,开始来构建item模型(model)。

    首先,想要的内容有:

    • 名称(name)
    • 链接(url)
    • 描述(description)
    可以把Item简单的理解成封装好的类对象。
    # -*- coding:utf-8 -*-
    
    import scrapy
    # 导入CrawlSpider类和Rule
    from scrapy.spiders import CrawlSpider, Rule
    # 导入链接规则匹配类,用来提取符合规则的连接
    from scrapy.linkextractors import LinkExtractor
    from TencentSpider.items import TencentItem
    
    class TencentSpider(CrawlSpider):
        name = "tencent"
        allow_domains = ["hr.tencent.com"]
        start_urls = ["http://hr.tencent.com/position.php?&start=0#a"]
    
        # Response里链接的提取规则,返回的符合匹配规则的链接匹配对象的列表
        pagelink = LinkExtractor(allow=("start=\d+"))
    
        rules = [
            # 获取这个列表里的链接,依次发送请求,并且继续跟进,调用指定回调函数处理
            Rule(pagelink, callback = "parseTencent", follow = True)
        ]
    
        # 指定的回调函数
        def parseTencent(self, response):
            for each in response.xpath("//tr[@class='even'] | //tr[@class='odd']"):
                item = TencentItem()
                # 职位名称
                item['positionname'] = each.xpath("./td[1]/a/text()").extract()[0]
                # 详情连接
                item['positionlink'] = each.xpath("./td[1]/a/@href").extract()[0]
                # 职位类别
                item['positionType'] = each.xpath("./td[2]/text()").extract()[0]
                # 招聘人数
                item['peopleNum'] =  each.xpath("./td[3]/text()").extract()[0]
                # 工作地点
                item['workLocation'] = each.xpath("./td[4]/text()").extract()[0]
                # 发布时间
                item['publishTime'] = each.xpath("./td[5]/text()").extract()[0]
    
                yield item
    

    pipelines 存储内容

    保存信息的最简单的方法是通过Feed exports,主要有四种:JSON,JSON lines,CSV,XML。我们将结果用最常用的JSON导出

    数据处理行为,如:一般结构化的数据持久化

    # -*- coding: utf-8 -*-
    import json
    
    class TencentPipeline(object):
      """ 
           功能:保存item数据 
       """
        def __init__(self):
            self.filename = open("tencent.json", "w")
    
        def process_item(self, item, spider):
            text = json.dumps(dict(item), ensure_ascii = False) + ",\n"
            self.filename.write(text.encode("utf-8"))
            return item
    
        def close_spider(self, spider):
            self.filename.close()
    

    settings.py 配置文件,如:递归的层数、并发数,延迟下载等

    True 改成 Flase
    添加 UA

    # 设置请求头部,添加url
    DEFAULT_REQUEST_HEADERS = {
        "User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;",
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
    }
    
    # 设置item——pipelines
    ITEM_PIPELINES = {
        'tencent.pipelines.TencentPipeline': 300,
    }
    

    运行命令

    scrapy crawl + 项目

    parse():解析的方法,调用的时候传入从每一个URL传回的Response对象作为唯一参数,负责解析并匹配抓取的数据(解析为item),跟踪更多的URL

    相关文章

      网友评论

          本文标题:scrapy

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