PYTHON 爬虫笔记十一:Scrapy框架的基本使用

Scrapy框架详解及其基本使用

  • scrapy框架原理

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中。
    其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

    Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下

 

Scrapy主要包括了以下组件:

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

Scrapy运行流程大概如下:

1、从spider中获取到初始url给引擎,告诉引擎帮我给调度器;

2、引擎将初始url给调度器,调度器安排入队列;

3、调度器告诉引擎已经安排好,并把url给引擎,告诉引擎,给下载器进行下载;

4、引擎将url给下载器,下载器下载页面源码;

5、下载器告诉引擎已经下载好了,并把页面源码response给到引擎;

6、引擎拿着response给到spider,spider解析数据、提取数据;

7、spider将提取到的数据给到引擎,告诉引擎,帮我把新的url给到调度器入队列,把信息给到Item Pipelines进行保存;

8、Item Pipelines将提取到的数据保存,保存好后告诉引擎,可以进行下一个url的提取了;

9、循环3-8步,直到调度器中没有url,关闭网站(若url下载失败了,会返回重新下载)。

  • 基本使用

  1. 创建项目的基本过程

    Scrapy:# 创建项目,在当前目录中创建中创建一个项目文件(类似于Django)
        scrapy startproject sp1生成目录如下:sp1- sp1- spiders          目录,放置创建的爬虫应用- middlewares.py    中间件- items.py          格式化,与pipelines.py一同做持久化- pipelines.py      持久化- settings.py       配置文件- scrapy.cfg            配置# 创建爬虫应用
        cd sp1scrapy genspider xiaohuar xiaohuar.com      # 创建了xiaohuar.pyscrapy genspider baidu baidu.com        # 创建了baidu.py# 展示爬虫应用列表
        scrapy list# 执行爬虫,进入project
        scrapy crawl baiduscrapy crawl baidu --nolog

    文件说明:

注意:一般创建爬虫文件时,以网站域名命名

  • 项目实战

  1. 实战目标:对目标站点所有语录,作者,标签进行爬取并存如MongoDB中

  2. 目标站点分析:Quates to scrape

  3. 流程框架:

  4. 爬虫实战

    1. 明确目标--->items.py(明确想要抓取的目标,定义需要爬取的信息(字段))

      # -*- coding: utf-8 -*-import scrapy
      class QuoteItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()text = scrapy.Field() #语录内容author = scrapy.Field() #作者tags = scrapy.Field() #标签
    2. 制作爬虫--->quotes.py(解析数据,并提取信息和新的url)

      # -*- coding: utf-8 -*-
      import scrapyfrom quotetutorial.items import QuoteItemclass QuotesSpider(scrapy.Spider):name = 'quotes'allowed_domains = ['quotes.toscrape.com']start_urls = ['http://quotes.toscrape.com/']def parse(self, response):#print(response.text)quotes = response.css('.quote')     #获取每行的全部信息for quote in quotes:item = QuoteItem()                #创建获取对象text = quote.css('.text::text').extract_first()     #*::text 用于获取文本信息,axtract_first() 用于获得第一个文本信息*author = quote.css('.author::text').extract_first()tags = quote.css('.tags .tag::text').extract()      #没有指定获取第一个--->获取所有满足条件的item['text'] = textitem['author'] = authoritem['tags'] = tagsyield itemnext = response.css('.pager .next a::attr(href)').extract_first()        #获取元素属性信息url = response.urljoin(next)        #把连接拼接起来yield scrapy.Request(url=url,callback=self.parse)        #回调函数
    3. 存储内容--->pipelines.py(设计管道存储内容。当spider收集好Item后,会将Item(由字典组成的列表)传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item)

      # -*- coding: utf-8 -*-
      import pymongofrom scrapy.exceptions import DropItemclass TextPipeline(object):        #对语录进行处理,当长度超过50时,截断然后在后面加*...*def __init__(self):self.limit =50def process_item(self, item, spider):if item['text']:if len(item['text']) > self.limit:item['text'] = item['text'][0:self.limit].rstrip() + '...'return itemelse:return DropItem('Miss Text')class MongoPipeline(object):        #链接数据库def __init__(self ,mongo_uri, mongo_db):self.mongo_uri = mongo_uriself.mongo_db = mongo_db@classmethoddef from_crawler(cls, crawler):        #从ettings中拿到需要的配置信息(类方法)return cls(mongo_uri=crawler.settings.get('MONGO_URI'),mongo_db=crawler.settings.get('MONGO_DB'))def open_spider(self,spider):       #初始化数据库self.client = pymongo.MongoClient(self.mongo_uri)self.db = self.client[self.mongo_db]def process_item(self, item ,spider): #向数据库插入数据name = item.__class__.__name__self.db[name].insert(dict(item))return itemdef close_spider(self ,spider):self.client.close()
    4. 相关配置--->settings.py(为了启动Item Pipelines组件,必须将类添加到settings.py的ITEM_PIPELINES中,此处只有一个pipeline类,因此找到ITEM_PIPELINES,打开代码)

      # -*- coding: utf-8 -*-# Scrapy settings for quotetutorial project
      #
      # For simplicity, this file contains only settings considered important or
      # commonly used. You can find more settings consulting the documentation:
      #
      #     https://doc.scrapy.org/en/latest/topics/settings.html
      #     https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
      #     https://doc.scrapy.org/en/latest/topics/spider-middleware.html
      
      BOT_NAME = 'quotetutorial'SPIDER_MODULES = ['quotetutorial.spiders']
      NEWSPIDER_MODULE = 'quotetutorial.spiders'MONGO_URI = 'localhost'
      MONGO_DB = 'quotestutorial'# Crawl responsibly by identifying yourself (and your website) on the user-agent
      #USER_AGENT = 'quotetutorial (+http://www.yourdomain.com)'# Obey robots.txt rules
      ROBOTSTXT_OBEY = True# Configure maximum concurrent requests performed by Scrapy (default: 16)
      #CONCURRENT_REQUESTS = 32# Configure a delay for requests for the same website (default: 0)
      # See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay
      # See also autothrottle settings and docs
      #DOWNLOAD_DELAY = 3
      # The download delay setting will honor only one of:
      #CONCURRENT_REQUESTS_PER_DOMAIN = 16
      #CONCURRENT_REQUESTS_PER_IP = 16# Disable cookies (enabled by default)
      #COOKIES_ENABLED = False# Disable Telnet Console (enabled by default)
      #TELNETCONSOLE_ENABLED = False# Override the default request headers:
      #DEFAULT_REQUEST_HEADERS = {
      #   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
      #   'Accept-Language': 'en',
      #}# Enable or disable spider middlewares
      # See https://doc.scrapy.org/en/latest/topics/spider-middleware.html
      #SPIDER_MIDDLEWARES = {
      #    'quotetutorial.middlewares.QuotetutorialSpiderMiddleware': 543,
      #}# Enable or disable downloader middlewares
      # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
      #DOWNLOADER_MIDDLEWARES = {
      #    'quotetutorial.middlewares.QuotetutorialDownloaderMiddleware': 543,
      #}# Enable or disable extensions
      # See https://doc.scrapy.org/en/latest/topics/extensions.html
      #EXTENSIONS = {
      #    'scrapy.extensions.telnet.TelnetConsole': None,
      #}# Configure item pipelines
      # See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
      ITEM_PIPELINES = {'quotetutorial.pipelines.TextPipeline': 300,'quotetutorial.pipelines.MongoPipeline': 400,
      }# Enable and configure the AutoThrottle extension (disabled by default)
      # See https://doc.scrapy.org/en/latest/topics/autothrottle.html
      #AUTOTHROTTLE_ENABLED = True
      # The initial download delay
      #AUTOTHROTTLE_START_DELAY = 5
      # The maximum download delay to be set in case of high latencies
      #AUTOTHROTTLE_MAX_DELAY = 60
      # The average number of requests Scrapy should be sending in parallel to
      # each remote server
      #AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
      # Enable showing throttling stats for every response received:
      #AUTOTHROTTLE_DEBUG = False# Enable and configure HTTP caching (disabled by default)
      # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
      #HTTPCACHE_ENABLED = True
      #HTTPCACHE_EXPIRATION_SECS = 0
      #HTTPCACHE_DIR = 'httpcache'
      #HTTPCACHE_IGNORE_HTTP_CODES = []
      #HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

      注意:如果有多个item pipelines的话(多种保存方式),需要在ITEM_PIPELINES中配置类,后面的“300”随意设置。

           分配给每个类的整型值,确定了它们的运行顺序。数值越低,组件的优先级越高,运行顺序越靠前。

    5. 启动项目:

      scrapy crawl quotes
    6. 把获得的内容保存

      scrapy crawl quotes -o quotes.{json | jl | csv | xml | pickle | marshal}

       

 

转载于:https://www.cnblogs.com/darwinli/p/9485505.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器返回值 解释 ajax提交方式 后台数据刷进前端

转载于:https://www.cnblogs.com/liuliang389897172/p/9120715.html

no typehandler found for property XXXX 解决

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. ssm框架下 启动服务报错如题。 2. 原因: 我的情况是,代码中实体属性映射书写和数据库字段名字不一致。 数据…

shell中sed -i特殊字符

可参考文献: Linux生产环境上,最常用的一套“sed“技巧 看懂shell中的各种语句

Nginx 启动报错 “/var/run/nginx/nginx.pid failed”

问题: 重启虚拟机后,再次重启nginx会报错: open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory) 解决方法: (1)进入 cd /usr/local/nginx/conf/ 目录,编辑配置…

eclipse关闭讨厌的菜单

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 不知道动哪了,开启了这个菜单: 2. 很感谢群友帮我找到关闭方法,点击 如下 按钮: 然后就…

SSL加密工作原理RSA免密登录原理

SSL 是一个安全协议,它提供使用 TCP/IP 的通信应用程序间的隐私与完整性。因特网的 超文本传输协议(HTTP)使用 SSL 来实现安全的通信。 在客户端与服务器间传输的数据是通过使用对称算法(如 DES 或 RC4)进行加密的。…

我不知道的事——深克隆和浅克隆

推荐一部好电影《致命魔术》。(此处为植入广告) 推荐理由:涉及人性。画面不错,剧情跌宕,亦魔亦幻(此处的”魔“为魔术的”魔“)。虽然女猪脚不尽如人意,但是男猪脚比较帅。而…

服务器搭建

2019独角兽企业重金招聘Python工程师标准>>> 最近弄了个阿里云的服务器,想在上面搞点东西,故要搭建一套环境。登录linux,在终端输入 uname -a 即列出linux的内核版本号。(服务器网址:http://101.132.235.56…

mybatis内部类映射写法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. B类是A类中的内部类。 2.  映射写法: com.XXX.A$B , 注意A类和B类之间用 $ 表示内外关系,而不是常用的 …

Linux bash总结(一) 基础部分(适合初学者学习和非初学者参考)

第一部分 bash简介 —— 对bash进行简要介绍 第二部分 bash示例和书写流程 —— 以一个简单的bash为例,说明书写、执行bash的流程 第三部分 bash基础语法 —— 本章内容比较多,主要介绍if...else...条件判断,for循环等等。对于有编…

解决报错:java.util.UnknownFormatConversionException: Conversion = ‘p‘

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. ssm框架下 报错如题 2. 错误原因:我的情况是,代码中实体属性映射书写和数据库字段名字不一致。 选中位置数据…

TOAD连接Oracle数据库失败:OCI_INVALID_HANDLE解决

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. toad 连接Oracle数据库连接失败如图: 2. 导致这个情况的前因:toad运行情况下,突然断电。 3. 解决…

python-访问者模式

源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 访问者模式的基本想法是,软件系统中拥有一个由许多对象构成的、比较稳定的对象结构,这些对象的类都拥有一个 accept 方法用来接受访问者对象的访问。访问者是一个接口&am…

git commit -m和git commit -am

字面解释的话,git commit -m用于提交暂存区的文件;git commit -am用于提交跟踪过的文件 要理解它们的区别,首先要明白git的文件状态变化周期,如下图所示 工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪。已…

磁盘结构简介

这里讲的主要是网上所谓的老式磁盘,它是由一个个盘片组成的,我们先从个盘片结构讲起。如图1所示,图中的一圈圈灰色同心圆为一条条磁道,从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称…

end to end testing

概念 https://www.softwaretestinghelp.com/what-is-end-to-end-testing/ What is “End to End Testing”? Term “End to End testing” is defined as a testing method which determines whether the performance of an application is as per the requirement or not. It…

Linux目录架构详解

Linux和Windows操作系统的显著区别之一就是目录架构的不同。Linux操作系统的目录架构遵循文件系统层级结构标准。不知你是否使用ls命令浏览过Linux的根目录“/”,亲爱的读者,您都了解这些目录的含义吗? ls -l / 遍历文件系统(点击…

Linux的学习:

查看端口: netstat -anop | grep 80 netstat -ntlp 先看看不带n的 再看看带n的 我们发现在local address 即主机地址这一栏中,如果没有带n选项,会将套接字所对应的域名解析出来,如果加上n选项,那么就不会显示&#xff…

Unix 多进程编程

一.多进程程序的特点由于UNIX系统是分时多用户系统, CPU按时间片分配给各个用户使用, 而在实质上应该说CPU按时间片分配给各个进程使用, 每个进程都有自己的运行环境以使得在CPU做进程切换时不会"忘记"该进程已计算了一半的"半成品". 以DOS的概念来说, 进程…

IT巨头互掐云存储:Dropbox能否一马当先

随着北京时间4月25日Google Drive横空出世,微软也迫不及待的发布了SkyDrive的大量更新。各大巨头进军云存储市场,激烈角逐的意向已经昭然可见。网友针对此事纷纷发表热议。苹果、微软、谷歌三巨头加上一个Dropbox各出各的云存储高招:微软SkyD…