首页 > 其他分享 >scrapy架构介绍、scrapy解析数据、settings相关配置、持久化方案

scrapy架构介绍、scrapy解析数据、settings相关配置、持久化方案

时间:2023-04-17 16:23:26浏览次数:43  
标签:xpath 架构 settings 爬虫 item scrapy article desc

上节回顾

# 1 selenium
	-登录cnblogs,拿到cookie,再打开cnblogs,写入cookie,它就是登录状态
    
    -半自动点赞---》selenium生成的cookie,给requests用
    	-selenium操作浏览器,速度慢
        -requests速度快
        
    -动作链
    -自动登录12306
# 2 打码平台
	-帮我们破解验证码---》超级鹰,云打码
    -验证码图片,发送给破解平台,把结果给你,你输入进去
    -获取到验证码图片
    	-1 截图
        -2 如果图片用base64编码的,直接保存到本地即可
        
        
    -使用打码平台,登录打码平台
    
    
# 3 xpath的使用
	- /
    - //
    -.
    -..
    -标签名字
    -@属性名

    
# 4 scrapy框架

今日内容

  • scrapy架构介绍

  • scrapy解析数据

  • settings相关配置,提高爬取效率

  • 持久化方案

  • 全站爬取cnblogs文章

1 scrapy架构介绍

image-20230411161707800

# 引擎(EGINE)
引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。

# 调度器(SCHEDULER)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址

# 下载器(DOWLOADER)
用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的

# 爬虫(SPIDERS)--->在这里写代码
SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求

# 项目管道(ITEM PIPLINES)
在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作

# 下载器中间件(Downloader Middlewares)

位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的响应response,你可用该中间件做以下几件事:设置请求头,设置cookie,使用代理,集成selenium

# 爬虫中间件(Spider Middlewares)
位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)

1.1 scrapy的一些命令

# 安装完成后,会有scrapy的可执行文件

# 创建项目
	scrapy startproject 项目名字  # 跟创建django一样,pycharm能直接创建django
    
    
# 创建爬虫
	scrapy genspider 名字 域名   # 创建爬虫  django的创建app
    
# pycharm打开scrapy的项目


# 运行爬虫
	scrapy crawl 爬虫名字
    
# 想点击绿色箭头运行爬虫
	新建一个run.py,写入,以后右键执行即可
    from scrapy.cmdline import execute
    execute(['scrapy','crawl','cnblogs','--nolog'])
    
    
    
# 补充:爬虫协议
 http://www.cnblogs.com/robots.txt

1.2 scrapy项目目录结构

firstscrapy 						# 项目名
    firstscrapy            # 文件夹名字,核心代码,都在这里面
    	spiders            # 爬虫的文件,里面有所有的爬虫
        	__init__.py
        	baidu.py      # 百度爬虫 
        	cnblogs.py    #cnblogs爬虫
        items.py # 有很多模型类---》以后存储的数据,都做成模型类的对象,等同于django的models.py
        middlewares.py # 中间件:爬虫中间件,下载中间件都写在这里面
        pipelines.py   #项目管道---》以后写持久化,都在这里面写
        run.py         # 自己写的,运行爬虫
        settings.py    # 配置文件  django的配置文件
   scrapy.cfg          # 项目上线用的,不需要关注

2 scrapy解析数据

1 response对象有css方法和xpath方法
	-css中写css选择器
    -xpath中写xpath选择
    
2 重点1:
	-xpath取文本内容
	'.//a[contains(@class,"link-title")]/text()'
    -xpath取属性
    './/a[contains(@class,"link-title")]/@href'
    -css取文本
    'a.link-title::text'
    -css取属性
    'img.image-scale::attr(src)'
    
3 重点2:
	.extract_first()  取一个
    .extract()        取所有

2.1 解析cnblosg

    # def parse(self, response):
    #     # 解析数据 css解析
    #     article_list = response.css('article.post-item')
    #     for article in article_list:
    #         title = article.css('div.post-item-text>a::text').extract_first()
    #         author_img = article.css('div.post-item-text img::attr(src)').extract_first()
    #         author_name = article.css('footer span::text').extract_first()
    #         desc_old = article.css('p.post-item-summary::text').extract()
    #         desc = desc_old[0].replace('\n', '').replace(' ', '')
    #         if not desc:
    #             desc = desc_old[1].replace('\n', '').replace(' ', '')
    #         url=article.css('div.post-item-text>a::attr(href)').extract_first()
    #         # 文章真正的内容,没拿到,它不在这个页面中,它在下一个页面中
    #         print(title)
    #         print(author_img)
    #         print(author_name)
    #         print(desc)
    #         print(url)

    def parse(self, response):
        # 解析数据 css解析
        article_list = response.xpath('//*[@id="post_list"]/article')
        # article_list = response.xpath('//article[contains(@class,"post-item")]')
        for article in article_list:
            title = article.xpath('.//div/a/text()').extract_first()
            author_img = article.xpath('.//div//img/@src').extract_first()
            author_name = article.xpath('.//footer//span/text()').extract_first()
            desc_old = article.xpath('.//p/text()').extract()
            desc = desc_old[0].replace('\n', '').replace(' ', '')
            if not desc:
                desc = desc_old[1].replace('\n', '').replace(' ', '')
            url = article.xpath('.//div/a/@href').extract_first()
            # 文章真正的内容,没拿到,它不在这个页面中,它在下一个页面中
            print(title)
            print(author_img)
            print(author_name)
            print(desc)
            print(url)

3 settings相关配置,提高爬取效率

# scrapy 项目有项目自己的配置文件,还有内置的

3.1 基础的一些

#1 了解
BOT_NAME = "firstscrapy"  #项目名字,整个爬虫名字
#2 爬虫存放位置    了解
SPIDER_MODULES = ["firstscrapy.spiders"]
NEWSPIDER_MODULE = "firstscrapy.spiders"

#3  记住 是否遵循爬虫协议,一般都设为False
ROBOTSTXT_OBEY = False
# 4 记住
USER_AGENT = "firstscrapy (+http://www.yourdomain.com)"
#5  记住  日志级别
LOG_LEVEL='ERROR'

#6   记住 DEFAULT_REQUEST_HEADERS 默认请求头
DEFAULT_REQUEST_HEADERS = {
   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
   'Accept-Language': 'en',
}

#7 记住 后面学  SPIDER_MIDDLEWARES 爬虫中间件
SPIDER_MIDDLEWARES = {
    'cnblogs.middlewares.CnblogsSpiderMiddleware': 543,
}
#8 后面学 DOWNLOADER_MIDDLEWARES  下载中间件
DOWNLOADER_MIDDLEWARES = {
    'cnblogs.middlewares.CnblogsDownloaderMiddleware': 543,
}

#9 后面学 ITEM_PIPELINES 持久化配置
ITEM_PIPELINES = {
    'cnblogs.pipelines.CnblogsPipeline': 300,
}

3.2 增加爬虫的爬取效率

#1 增加并发:默认16
默认scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改
CONCURRENT_REQUESTS = 100
值为100,并发设置成了为100。
#2 降低日志级别:
在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。在配置文件中编写:
LOG_LEVEL = 'INFO'
# 3 禁止cookie:
如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。在配置文件中编写:
COOKIES_ENABLED = False
# 4 禁止重试:
对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。在配置文件中编写:
RETRY_ENABLED = False
# 5 减少下载超时:
如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。在配置文件中进行编写:
DOWNLOAD_TIMEOUT = 10 超时时间为10s

4 持久化方案

# 方式一:(parse必须有return值,必须是列表套字典形式--->使用命令,可以保存到json格式中,csv中。。。)
scrapy crawl cnblogs -o cnbogs.json

# 方式二:我们用的,使用pipline存储---》可以存到多个位置
	-第一步:在item.py中写一个类
        class FirstscrapyItem(scrapy.Item):
            title = scrapy.Field()
            author_img = scrapy.Field()
            author_name = scrapy.Field()
            desc = scrapy.Field()
            url = scrapy.Field()
            # 博客文章内容,但是暂时没有
            content = scrapy.Field()
            
    -第二步:在pipline.py中写代码,写一个类:open_spide,close_spider,process_item
    	-open_spide:开启爬虫会触发
    	-close_spider:爬完会触发
        -process_ite:每次要保存一个对象会触发
        class FirstscrapyFilePipeline:
            def open_spider(self, spider):
                print('我开了')
                self.f=open('a.txt','w',encoding='utf-8')
            def close_spider(self, spider):
                print('我关了')
                self.f.close()
            # 这个很重要
            def process_item(self, item, spider):
                self.f.write(item['title']+'\n')
                return item
    -第三步:配置文件配置
    	ITEM_PIPELINES = {
           "firstscrapy.pipelines.FirstscrapyFilePipeline": 300,  # 数字越小,优先级越高
        }
        
    -第四步:在解析方法parse中yield item对象
   

5 全站爬取cnblogs文章

5.1 request和response对象传递参数

# Request创建:在parse中,for循环中,创建Request对象时,传入meta
	yield Request(url=url, callback=self.detail_parse,meta={'item':item})
    
# Response对象:detail_parse中,通过response取出meta取出item,把文章详情写入
	yield item

5.2 解析下一页并继续爬取

import scrapy
from bs4 import BeautifulSoup
from firstscrapy.items import FirstscrapyItem
from scrapy.http.request import Request

class CnblogsSpider(scrapy.Spider):
    name = "cnblogs"
    allowed_domains = ["www.cnblogs.com"]
    start_urls = ["http://www.cnblogs.com/"]

    # 解析出下一页地址,继续爬取
    def parse(self, response):
        article_list = response.xpath('//*[@id="post_list"]/article')
        # article_list = response.xpath('//article[contains(@class,"post-item")]')
        # l=[]
        for article in article_list:
            item = FirstscrapyItem()
            title = article.xpath('.//div/a/text()').extract_first()
            item['title'] = title
            author_img = article.xpath('.//div//img/@src').extract_first()
            item['author_img'] = author_img
            author_name = article.xpath('.//footer//span/text()').extract_first()
            item['author_name'] = author_name
            desc_old = article.xpath('.//p/text()').extract()
            desc = desc_old[0].replace('\n', '').replace(' ', '')
            if not desc:
                desc = desc_old[1].replace('\n', '').replace(' ', '')
            item['desc'] = desc
            url = article.xpath('.//div/a/@href').extract_first()
            item['url'] = url
            # print(title)
            # yield item对象 不完整,缺文章的content,而文章的content在下一个页面中,而此处要yield一个Request对象
            # yield item
            yield Request(url=url,callback=self.parser_detail,meta={'item':item}) # 爬完后执行的解析方法


        next='https://www.cnblogs.com'+response.css('div.pager>a:last-child::attr(href)').extract_first()
        print(next) # 继续爬取
        yield Request(url=next,callback=self.parse)



    # 解析详情的方法
    def parser_detail(self,response):
        # print(response.status)
        # 解析出文章内容
        content=response.css('#cnblogs_post_body').extract_first()
        # print(str(content))
        # 如何放到item中
        item=response.meta.get('item')
        if content:
            item['content']=content
        else:
            item['content'] = '没查到'
        yield item

标签:xpath,架构,settings,爬虫,item,scrapy,article,desc
From: https://www.cnblogs.com/super-xz/p/17326223.html

相关文章

  • 爬取的数据存mysql中、加代理,cookie,header,加入selenium、布隆过滤器、scrapy-redis实
    上节回顾#1scrapy架构 -爬虫:写的一个个类-引擎: -调度器:排队,去重-下载器-pipline-下载中间件-爬虫中间件#2命令 -scrapystartproject项目名-scrapygensipder爬虫名网址-scrapycrawl爬虫名字-run.py#......
  • 分布式政企应用如何快速实现云原生的微服务架构改造
    随着数字化时代的快速发展,企业和组织正面临着如何在保持敏捷和灵活的同时,提高业务运营效率和降低成本的巨大挑战。为了应对这些挑战,许多企业开始采用面向服务的架构(SOA)和企业服务总线(ESB)来构建和集成复杂的应用系统。然而,随着云计算和微服务等新技术的出现,SOA/ESB架构也面临着一些......
  • SOA/ESB架构升级之路:从微服务到ServiceMesh,再到Sermant
    SOA/ESB架构是一种常见的企业级应用架构模式,它将应用分为多个服务,通过ESB(企业服务总线)来进行服务间的通信和集成。SOA/ESB架构的优点是可以实现服务的复用、隔离和安全,但是也存在一些问题,如:ESB本身是一个单点故障,如果ESB出现问题,会影响所有的服务ESB的性能和可扩展性受限于其硬件和......
  • 技术分享 | 如何迅速将分布式政企应用转型为云原生微服务架构
    在当今这个快速发展的数字化时代,企业和组织正面临着巨大的挑战,如何在保持敏捷和灵活的同时,提高业务运营效率和降低成本。为了应对这些挑战,许多企业开始采用面向服务的架构(SOA)和企业服务总线(ESB)来构建和集成复杂的应用系统。然而,随着云计算和微服务等新技术的出现,SOA/ESB架构也面临......
  • 架构师之路-开设学习交流群 欢迎加入
    [top]一:架构师之路学习交流群1.目标-用codechangetheworld2.微信联系方式-联系加群"""WX:zll1314520930"""......
  • ClickHouse集群+ZooKeeper集群架构下的ZooKeeper集群迁移
     ClickHouse集群+ZooKeeper集群架构下的ZooKeeper集群迁移 目前测试环境的ck集群+zk集群架构如下:ClickHouseZooKeeper192.168.1.171192.168.1.172192.168.1.173192.168.1.174192.168.1.171192.168.1.172192.168.1.173由于ck和zk混搭在一块,存在较为严重......
  • 支持多模型数据分析探索的存算分离湖仓一体架构解析(上)
    当企业需要建设独立的数据仓库系统来支撑BI和业务分析业务时,有了“数据湖+数据仓库”的混合架构。但混合架构带来了更高的建设成本、管理成本和业务开发成本。随着大数据技术的发展,通过在数据湖层增加分布式事务、元数据管理、极致的SQL性能、SQL和数据API接口能力,企业可以基于统......
  • Python 深度学习架构实用指南:第三、四、五部分
    原文:Hands-OnDeepLearningArchitectureswithPython协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN深度学习译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。不要担心自己的形象,只关心如何实现目标。——《原则》,生活原则2.3.c第3节:序列建模在本节中,我们将学习......
  • 灵活、快捷、低运维成本的数据集成方法:数据联邦架构
    在传统的企业数据运用中,企业使用多种系统,数据散落在各个存储设备中,数据分析需求往往是跨库的,数据入湖入仓在做分析会有安全问题,或影响业务系统性能。企业需要一种灵活、快捷、低运维成本的数据集成方法,就有了数据联邦架构。本文介绍数据联邦架构。  —数据联邦概述—在传......
  • 嵌入式软件架构设计协议定义
    在嵌入式软件架构设计中,协议定义是非常重要的。协议定义规定了通信双方之间的消息格式以及通信方式,保证了系统之间的可靠性、安全性和互操作性。以下是一些常见的嵌入式软件架构设计协议定义:UART协议:UART是一种简单的串行通信协议,适用于低速、短距离的通信。UART不需要外部时钟信号......