Scrapy从青铜到王者第一篇:Scrapy理解

Posted J哥。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scrapy从青铜到王者第一篇:Scrapy理解相关的知识,希望对你有一定的参考价值。

什么是框架:就是一个集成了很多功能,并且具有很强的通用性的一个项目模板

如何学习框架: 专门学习框架封装的各种功能的详细用法

什么是scrapy :爬虫中封装好的一个明星框架。

功能: 学习计划.高性能持久化存储,异步的数据下载,高性能的数据解析,分布式

scrapy 框架的基本使用 :环境安装:-mac或者linux  pip install scrapy
                                -win  pip install wheel
                                -下载twisted:
                                -安装twisted:
                                -pip install pywin32
                                -pip install pywin32
                                测试 : 终端 输入 scrapy 没报错 说明安装成功
                    -创建一个工程: scrapy startproject 工程的名称
                    -cd 工程名称
                    再 scrapy genspider  爬虫文件名字随便写  + url  例如:scrapy genspider first www.xxx.com

                    scrapy.cfg 配置文件  目前用不到   spiders 爬虫文件夹或者为爬虫目录      里面一定要放入一个 爬虫源文件
                    pipelines.py 配置  settings.py工程的配置文件 经常使用

                    - 在spiders子目录 建立py文件  在里面写爬虫代码  :
                     再 scrapy genspider  爬虫文件名字随便写  + url  例如:scrapy genspider first www.xxx.com
                        - spiders  genspider  spiderName(就是py文件的名称随便起的) +起始的url
                    - 执行工程:
                        scrapy crawl py文件名称                                          clear清屏幕

                    干扰数据清除 : scrapy crawl py文件名称 --nolog

-- 数据解析  :糗百案例yiubaiPro

-- 持久化存储:
        --基于终端指令:scrapy crawl py名字 -o 自定义保存的文件名  例如:scrapy crawl qiubai0 -o qiubai.csv
            - 要求:只可以将parse方法的返回值存储到本地的文件中  不可以存到数据库  parse就是def parse(self, response)
            - 注意: 持久化对应的文本文件类型只能是:('json', 'jsonlines', 'jl', 'csv', 'xml', 'marshal', 'pickle')
            - 指令: scrapy crawl py名字 -o 自定义保存的文件名  例如:scrapy crawl qiubai -o qiubai.csv
            - 好处: 简洁 高效 便捷
            - 缺点: 局限性比较强(数据只能保存到指定文件格式中)
   重 要点  --基于管道:
                     - 编码流程:
                         - 数据解析
                         - 在item类中定义相关属性
                         - 将解析的数据封装存储到item类型的对象中
                         - 将item类型的对象提交给管道进行持久化存储的操作    pipelines.py 翻译就是管道的意思
                         - 在管道类的process_item中要将其接收到的item对象中存储的数据进行持久化存储操作
                         - 在配置文件中开启管道
                         - 优点 : 通用性强。 存数据库什么的

# 基于终端存储 方式
import scrapy


class QiubaiSpider(scrapy.Spider):
    name = 'qiubai'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['https://www.qiushibaike.com/text/']

    def parse(self, response):
        # 解析:作者的名称+段子内容
        div_list = response.xpath('//div[@class="col1 old-style-col1"]/div')
        for div in div_list:
            # author  content 不是返回值 是局部变量
            all_data = []  # 存储所有解析到的数据
            # author = div.xpath('./div[学习计划]/a[2]/h2/text()')[0].extract()  # [0] 列表长度
            author = div.xpath('./div[学习计划]/a[2]/h2/text()').extract_first()
            # [0] 列表长度  一定要确定 该列表中只有一个列表元素才可以用extract_first() 将列表中第0个元素变成字符串

            # 所有 xpath取回的都是列表 , 但是列表一定是Selector类型对象
            # extract 可以将Selector 对象中data参数储存的字符串提取出来
            content = div.xpath('./a[学习计划]/div/span//text()').extract()
            # 现在本身就是列表  但是列表也能调用.extract()  但返回的是一个列表
            # 列表调用.extract()之后,则表示将列表中每个Selector对象中的data对应的字符串提取出来
            content = ''.join(content)  # 列表转成字符串
            # print(author, content)
            dic = {
                'author': author,
                'content': content
            }

            all_data.append(dic)
            return all_data


    - 面试题 :将爬取的数据一份进行存储一份存入数据库,如何实现? 通过管道
            - 将管道文件中一个管道类对应的是将数据存储到一个平台
            - 爬虫文件提交的item只会给管道中的第一个被执行的管道类接收
            - process_item中的reture item表示将item传递给下一个即将被执行的管道类

 - 基于Spider的全站数据爬取 : 全站数据爬取就是:
    - 就是将全网站中某板块下的全部页码对应得页面数据进行爬取
    - 爬取校花网中得照片名称
    - 实现方式:
            - 将所有页面的url添加到 srart_urls列表当中 (不推荐使用)
            - 自行手动进行请求发送(推荐)
                - 手动请求发送 :
                    - yield yield scrapy.Request(url=new_url, callback=self.parse) :callback :专门用于数据解析的

 -- 五大核心组件: 引擎 ,管道 ,引擎 ,下载器 ,spider ---》互联网
    - spider --》引擎--》调度器--》过滤器
    - spider --》引擎--》调度器--》队列

-- 请求传参:应用的非常广
        --使用场景: 如果爬取解析的数据不在同一张页面中。(深度爬取)
        --需求 :爬取boos的直聘的岗位名称和岗位描述
        --我们爬取的解析数据不在同一个页面 就要用 请求传参

--图片爬取之ImagesPipeline   这是一个管道类  专门用于图片数据爬取  之前学的 都是用于字符串爬取 
    - 基于scrapy爬取字符串类型的数据爬取和爬取图片类型的数据区别:
        - 字符串:只需要基于xpath进行解析 且提交管道进行持久化存储
        - 图片类型:我们只可以通过xpath解析图片src的属性值.单独的对图片地址发起请求获取图片二进制类型的数据
    - ImagesPipeline :
        - 只需要将img的 属性值 src进行解析,提交给管道,管道就会对图片的src进行请求发送获取图片的二进制类型数据,且还会帮我们持久化存储
    - 需求: 爬取站长素材中的高清图片
    - 使用流程:
        - 数据解析: 图片的地址
        - 将存储图片地址的item提交到制定的管道类
        - 在管道文件中制定一个基于ImagesPipeline的一个管道类
            - get_media_resquest()
            _ file_path()
            - item_completed


        - 在配置文件中操作:
            - 制定图片存放目录: IMAGES_STORE = './img_Jg'
            - 制定开启的管道:自定制的管道类

- 中间件:--->引擎和下载器之间:  middlewares(中间件py文件)
                - 位置: 下载中间件
                - 作用: 批量拦截到整个工程中所有的请求和对象
                - 拦截请求:
                    - 进行UA伪装(与配置文件中的不同):写在:process_request
                    - 代理ip的设定  :写在:process_exception :return request
                - 拦截响应:
                    - 篡改响应数据,响应对象
                    - 需求: 爬取网易新闻中的新闻数据(爬取新闻的标题和新闻的内容)
                    = 1.通过网易新闻的首页解析出五大板块对应的详情页的url (没有动态加载)
                    - 2.每一个板块对应的新闻标题都是动态加载出来的(动态加载)
                    - 3.通过解析出每一条新闻详情页的url获取详情页的页面源码,解析出新闻内容
        --->引擎和spider之间:爬虫中间件(应用场景太少)

- CrawlSpider:类,Spider的子类 继承父类所有的功能并且派生出自己的功能
        - 全站数据爬取的方式:
            - spider:手动请求发送
            - 基于CrawlSpider:已经封装好全站爬取的包
    - CrawlSpider的具体使用:
        - 创建一个工程:
        - 创建的爬虫文件(CrawlSpider):
            创建指令: - scrapy genspider -t crawl 名称  加url  例如:sunPro>scrapy genspider -t crawl sun www.xxx.com
             - 链接提取器:
                     - 作用:根据指定的规则(allow=r'正则表达式')进行连接的提取
             - 规则解析器:
                     - 作用: 将链接提取器取到的链接进行指定规则(callback='parse_item')的解析


            - 需求 :
                - 爬取sun网站中的编号、新闻标题、新闻的内容、编号
                - 分析: 爬取的数据不在同一张页面中。
                - 1.使用链接提取器提取出页面所有链接
                - 2.让链接提取器提取详情页的链接  (用两次)

以上是关于Scrapy从青铜到王者第一篇:Scrapy理解的主要内容,如果未能解决你的问题,请参考以下文章

Linux从青铜到王者第十一篇:Linux进程间信号第一篇

Linux从青铜到王者第五篇:Linux进程概念第一篇

Linux从青铜到王者第九篇:Linux进程间通信第一篇

Numpy从青铜到王者第一篇

C++从青铜到王者第一篇:C++入门

Linux从青铜到王者第一篇:Linux常见指令