zoukankan      html  css  js  c++  java
  • 14-爬虫之scrapy框架的基本使用01

    scrapy框架

    简介:Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板。对于框架的学习,重点是要学习其框架的特性、各个功能的用法即可。

    • 环境安装:
      • mac、linux:
        • pip install scrapy
      • windows:
        • pip3 install wheel
        • 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
        • 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl
          • Twisted:就是一个异步的架构,被作用在了scrapy中
          • 安装报错:需要更换另一个版本的twisted文件进行安装即可
        • pip3 install pywin32
        • pip3 install scrapy
        • 安装完成后在cmd中输入scrapy回车,如果没有报错就说明安装成功

    scrapy的基本使用

    创建一个爬虫工程:scrapy startproject proName
    进入工程目录创建爬虫源文件:scrapy genspider spiderName www.xxx.com
    执行工程:scrapy crawl spiderName

    创建一个工程

    • scrapy startproject proName
      在这里插入图片描述
      - 目录结构
      • scrapy.cfg 项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中)
      • items.py 设置数据存储模板,用于结构化数据,如:Django的Model
      • pipelines 数据持久化处理
      • settings.py 配置文件,如:递归的层数、并发数,延迟下载等
      • spiders 爬虫目录,如:创建文件,编写爬虫解析规则

    进入工程目录创建爬虫源文件

    • scrapy genspider spiderName www.xxx.com

    在这里插入图片描述

    对爬虫源文件编写相应的代码

    在这里插入图片描述

    执行工程

    • scrapy crawl spiderName
    • 执行工程后,默认会输出工程所有的日志信息
      在这里插入图片描述

    修改工程的配置文件settings.py

    • 我们可以指定类型日志的输出
      • 在settings.py中加入 LOG_LEVEL = ‘ERROR’
      • 禁止robots
      • UA 伪装
        在这里插入图片描述

    爬虫文件spiderName内容阐述:

    import scrapy
    
    
    class GpcSpider(scrapy.Spider):
        # 爬虫文件的名称,当前源文件的唯一标识
        name = 'gpc'
        # allowed_domains表示允许的域名,用来限定start_urls那些url可以发请求那些不能
    #    allowed_domains = ['www.xxx.com'] #我们一般给注释掉
    
        # start_urls起始url列表只可以存储url
        #作用:列表中存储的url都会被进行get请求的发送
        start_urls = ['https://www.baidu.com/','https://www.sogou.com']
    
        # 数据解析
        #parse方法调用的次数取决于start_urls请求的次数
        #参数response:表示的就是服务器返回的响应对象
        def parse(self, response):
            pass
    
    

    scrapy数据解析

    • 使用:response.xpath(“xpath表达式解析数据”)
    • scrapy封装的xpath和etree中的区别
      • scrapy中的xpath直接将定位到的标签中存储的值或者属性值取出,返回的是Selector对象,且相关的数据值是存储在Selector对象的data中,需要调用extract(),extract_first()取出字符串数据

    爬虫源文件代码如下

    import scrapy
    
    
    class GpcSpider(scrapy.Spider):
        # 爬虫文件的名称,当前源文件的唯一标识
        name = 'gpc'
        # allowed_domains表示允许的域名,用来限定start_urls那些url可以发请求那些不能
    #    allowed_domains = ['www.xxx.com'] #我们一般给注释掉
    
        # start_urls起始url列表只可以存储url
        #作用:列表中存储的url都会被进行get请求的发送
        start_urls = ['https://duanziwang.com/category/经典段子/']
    
        # 数据解析
        #parse方法调用的次数取决于start_urls请求的次数
        #参数response:表示的就是服务器返回的响应对象
        def parse(self, response):
            # 数据解析名称和内容
            article_list = response.xpath('//*[@id="35087"]')
            for article in article_list:
                # scrapy的xpath和etree中xpath使用方式不同
                # xpath返回的列表中存储是Selector对象,说明我们想要的字符串数据被存储在了该对象的data属性中
                #extract()就是将data属性值取出
    
                #   调用extract_first() 将列表中第一个列表元素表示的Selector对象中的data值取出
                #title = article.xpath("//div[@class='post-head']/h1[@class='post-title']/a/text()").extract_first()
                #content = article.xpath("//div[@class='post-content']/p/text()").extract_first()
    
                #   直接调用extract(),可以将列表中的每一个列表元素取出
                title = article.xpath("//div[@class='post-head']/h1[@class='post-title']/a/text()").extract()
                content = article.xpath("//div[@class='post-content']/p/text()").extract()
                # 将Selector对象data属性值取出
                print(title,content)
    
    
    
    

    在这里插入图片描述

    持久化存储

    基于终端指令持久化存储

    • 该种方式只可以将parse方法的返回值存储到本地指定后缀的文本文件中

    • 执行指令:scrapy crawl spiderName -o filePath

      • 代码如下:
    import scrapy
    
    
    class GpcSpider(scrapy.Spider):
        # 爬虫文件的名称,当前源文件的唯一标识
        name = 'gpc'
        # allowed_domains表示允许的域名,用来限定start_urls那些url可以发请求那些不能
    #    allowed_domains = ['www.xxx.com'] #我们一般给注释掉
    
        # start_urls起始url列表只可以存储url
        #作用:列表中存储的url都会被进行get请求的发送
        start_urls = ['https://duanziwang.com/category/经典段子/']
    
        # 数据解析
        #parse方法调用的次数取决于start_urls请求的次数
        #参数response:表示的就是服务器返回的响应对象
    
    
        # 基于终端指令的持久化存储
        def parse(self, response):
            all_data = []
            # 数据解析名称和内容
            article_list = response.xpath('//*[@id="35087"]')
            for article in article_list:
                # 我们可以看见解析出来的内容不是字符串数据,说明和etree中xpath使用方式不同
                # xpath返回的列表中存储是Selector对象,说明我们想要的字符串数据被存储在了该对象的data属性中
                #extract()就是将data属性值取出
    
                #   调用extract_first() 将列表中第一个列表元素表示的Selector对象中的data值取出
                #title = article.xpath("//div[@class='post-head']/h1[@class='post-title']/a/text()").extract_first()
                #content = article.xpath("//div[@class='post-content']/p/text()").extract_first()
    
                #   直接调用extract(),可以将列表中的每一个列表元素取出
                title = article.xpath("//div[@class='post-head']/h1[@class='post-title']/a/text()").extract()
                content = article.xpath("//div[@class='post-content']/p/text()").extract()
                # 将Selector对象data属性值取出
                print(title,content)
                dic = {
                    "title":title,
                    "content":content
                }
                all_data.append(dic)
            return all_data
    
    
    
    

    在这里插入图片描述

    基于管道的持久化存储(重点)

    1,在爬虫文件中进行数据解析

    在这里插入图片描述

    2,在items.py中定义相关属性

    在这里插入图片描述

    3,在爬虫文件中将解析到的数据存储封装到 item类型的对象中

    在这里插入图片描述

    4,将item类型的对象提交给管道

    在这里插入图片描述

    5,在管道文件(pipelines.py)中,接受爬虫文件提交过来的item类型对象,且对其进行任意形式的持久化存储

    在这里插入图片描述

    6,在配置文件中开启管道机制

    在这里插入图片描述

    7,展示一(extract_first())

    import scrapy
    from gemoumou.items import GemoumouItem
    
    
    class GpcSpider(scrapy.Spider):
        # 爬虫文件的名称,当前源文件的唯一标识
        name = 'gpc'
        # allowed_domains表示允许的域名,用来限定start_urls那些url可以发请求那些不能
    #    allowed_domains = ['www.xxx.com'] #我们一般给注释掉
    
        # start_urls起始url列表只可以存储url
        #作用:列表中存储的url都会被进行get请求的发送
        start_urls = ['https://duanziwang.com/category/经典段子/']
    
        # 数据解析
        #parse方法调用的次数取决于start_urls请求的次数
        #参数response:表示的就是服务器返回的响应对象
    
        # 基于管道的持久化存储
        def parse(self, response):
            # 数据解析名称和内容
            article_list = response.xpath('//*[@id="35087"]')
            for article in article_list:
                # 我们可以看见解析出来的内容不是字符串数据,说明和etree中xpath使用方式不同
                # xpath返回的列表中存储是Selector对象,说明我们想要的字符串数据被存储在了该对象的data属性中
                # extract()就是将data属性值取出
                #   直接调用extract(),可以将列表中的每一个列表元素取出
                title = article.xpath("//div[@class='post-head']/h1[@class='post-title']/a/text()").extract_first()
                content = article.xpath("//div[@class='post-content']/p/text()").extract_first()
    
                # 实例化一个item类型的对象,将解析到的数据存储到该对象中
                item = GemoumouItem()
                # 不能使用item. 来调用数据
                item['title'] = title
                item['content'] = content
    
                # 将item对象提交给管道
                yield item
    

    8,展示二(extract())

    在这里插入图片描述
    在这里插入图片描述

    import scrapy
    from gemoumou.items import GemoumouItem
    
    
    class GpcSpider(scrapy.Spider):
        # 爬虫文件的名称,当前源文件的唯一标识
        name = 'gpc'
        # allowed_domains表示允许的域名,用来限定start_urls那些url可以发请求那些不能
    #    allowed_domains = ['www.xxx.com'] #我们一般给注释掉
    
        # start_urls起始url列表只可以存储url
        #作用:列表中存储的url都会被进行get请求的发送
        start_urls = ['https://duanziwang.com/category/经典段子/']
    
        # 数据解析
        #parse方法调用的次数取决于start_urls请求的次数
        #参数response:表示的就是服务器返回的响应对象
    
        # 基于管道的持久化存储
        def parse(self, response):
            # 数据解析名称和内容
            article_list = response.xpath('//*[@id="35087"]')
            for article in article_list:
                # 我们可以看见解析出来的内容不是字符串数据,说明和etree中xpath使用方式不同
                # xpath返回的列表中存储是Selector对象,说明我们想要的字符串数据被存储在了该对象的data属性中
                # extract()就是将data属性值取出
                #   直接调用extract(),可以将列表中的每一个列表元素取出
                title_content_list = article.xpath("//div[@class='post-head']/h1[@class='post-title']/a/text()  | //div[@class='post-content']/p/text()").extract()
                # 实例化一个item类型的对象,将解析到的数据存储到该对象中
                item = GemoumouItem()
                for title_content in title_content_list:
                    # 不能使用item. 来调用数据
                    item['title_content'] = title_content
    
                    # 将item对象提交给管道
                    yield item
    

    在这里插入图片描述

  • 相关阅读:
    List遍历时删除与迭代器(Iterator)解惑
    从一次“并发修改字段业务”引出多版本并发控制与InnoDB锁
    RocketMQ存储机制与确认重传机制
    Java中的锁
    jmeter在non-GUI模式下用法
    Java SPI机制简述
    深拷贝、浅拷贝与Cloneable接口
    Java中的小数运算与精度损失
    java中的枚举类
    SpringBoot是如何实现自动配置的
  • 原文地址:https://www.cnblogs.com/gemoumou/p/13635331.html
Copyright © 2011-2022 走看看