当前位置 博文首页 > Laity-J哥:【Scrapy从青铜到王者】第一篇:Scrapy理解

    Laity-J哥:【Scrapy从青铜到王者】第一篇:Scrapy理解

    作者:[db:作者] 时间:2021-08-25 15:46

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

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

    什么是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.让链接提取器提取详情页的链接? (用两次)

    cs