2025年4月12日 星期六 乙巳(蛇)年 正月十三 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

爬虫--Scrapy基础、详解

时间:08-16来源:作者:点击数:46
城东书院 www.cdsy.xyz

Scrapy框架介绍

  • Scrapy是用纯Python实现一个为了爬取网站数据,提取结构性数据而编写应用框架,
  • 用途非常广泛,Scrapy框架:用户只需要定制开发几个模块就可以轻松实现一个爬虫,
  • 用来抓取网页内容以及各种图片,非常之方便
  • Scrapy使用了Twisted(其主要是Tornado)多线程异步网络框架来处理网络通讯,可以
  • 加快我们的下载速度,不用自己实现异步框架,并且包含了各种中间件的接口,可以灵活的
  • 完成各种需求
在这里插入图片描述
  • 引擎(Scrapy)
  • 用来处理整个系统的数据流处理, 触发事务(框架核心)
  • 调度器(Scheduler)
  • 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
  • 下载器(Downloader)
  • 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
  • 爬虫(Spiders)
  • 爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
  • 项目管道(Pipeline)
  • 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
  • 下载器中间件(Downloader Middlewares)
  • 位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
  • 爬虫中间件(Spider Middlewares)
  • 介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
  • 调度中间件(Scheduler Middewares)
  • 介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
  • Scrapy运行流程大概如下:
  • 引擎从调度器中取出一个链接(URL)用于接下来的抓取
  • 引擎把URL封装成一个请求(Request)传给下载器
  • 下载器把资源下载下来,并封装成应答包(Response)
  • 爬虫解析Response
  • 解析出实体(Item),则交给实体管道进行进一步的处理
  • 解析出的是链接(URL),则把URL交给调度器等待抓取

下载安装Scrapy框架

  • 在cmd中下载这个第三方库
  • pip install scrapy -i https://pypi.doubanio.com/simple

使用Scrapy遵循以下步骤

  • 1.创建一个Scrapy项目
  • 2.定义提取item
  • 3.编写爬取网站的spider 并提取 item
  • 4.编写item Pipeline来存储提取到的item(即数据)

使用Scrapy

  • 新建项目(scrapy startproject)
  • 创建一个新的scrapy项目来爬取https://www.meijutt.tv/new100.html中的数据,使用以下命令
  • cmd中命令 scrapy startproject meiju<meiju为文件名>
  • 找到默认路径的meiju项目文件 移动至自定义路径
  • 用pycharm打开(项目工程中自动创建的各个文件的作用如下)
  • meiju
  • spiders --爬虫目录,如:创建文件,编写爬虫规则
  • __init__.py
  • __init__.py
  • items.py --设置数据存储模板,用于结构化数据 如:django的models.py
  • middlewares.py --中间件
  • pipelines.py --数据处理行为,如:一般结构化的数据持久化
  • settings.py --配置未见,如:递归的层数,并发数,延迟下载等.
  • scrapy.cfg --项目的配置信息,只要Scrapy命令行工具提供一个基础的配置信息(settings.py为主配置)
  • 注意:一般创建爬虫文件时,以网站域名命名
  • cd meiju --进入工程目录
  • scrapy genspider meijuSpider meijutt.tv --创建工程(spider下自动生成一个文件)
  • 在meijuSpider.py中:
  • import scrapy
  • #爬虫类:继承scrapy.spider
  • class MeijuspiderSpider(scrapy.Spider):
  • name = 'meijuSpider' #爬虫名:必须唯一性
  • allowed_domains = ['meijutt.tv',] #允许的域名列表(不写为爬取多个)
  • start_urls = ['https://www.meijutt.tv/new100.html',] #第一个爬取的url,如果写多个可以同时爬多个
  • def parse(self, response):
  • '''scrapy内部爬取完成后自动调用并返回响应数据'''
  • pass
  • print(response) #测试
  • 运行爬虫
  • 在meiju-->meiju路径下命令
  • scrapy crawl meijuSpider -- 运行爬虫(控制台会输出配置信息)
  • scrapy crawl meijuSpider --nolog -- 无日志输出结果
  • 输出配置信息详解:
  • 2020-10-07 19:54:30 [scrapy.utils.log] INFO: Scrapy 2.3.0 started (bot: meiju)
  • 2020-10-07 19:54:30 [scrapy.utils.log] INFO: Versions: lxml 4.5.2.0, libxml2 2.9.5, cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0, Tw
  • isted 20.3.0, Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)], pyOpenSSL 19.1.0 (OpenSSL 1.1.1h
  • 22 Sep 2020), cryptography 3.1.1, Platform Windows-7-6.1.7601-SP1 -- 版本信息
  • 2020-10-07 19:54:30 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor --调试
  • 2020-10-07 19:54:30 [scrapy.crawler] INFO: Overridden settings:
  • {'BOT_NAME': 'meiju',
  • 'NEWSPIDER_MODULE': 'meiju.spiders',
  • 'SPIDER_MODULES': ['meiju.spiders']} -- settings中的配置信息
  • 2020-10-07 19:54:30 [scrapy.extensions.telnet] INFO: Telnet Password: e3f88d2754a8c4b7
  • 2020-10-07 19:54:30 [scrapy.middleware] INFO: Enabled extensions:
  • ['scrapy.extensions.corestats.CoreStats',
  • 'scrapy.extensions.telnet.TelnetConsole',
  • 'scrapy.extensions.logstats.LogStats'] -- 扩展信息
  • 2020-10-07 19:54:30 [scrapy.middleware] INFO: Enabled downloader middlewares:
  • ['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware',
  • -- 爬虫协议 在settings中ROBOTSTXT_OBEY = True 改为Flase就可以
  • 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
  • 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
  • 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
  • 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
  • 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
  • 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
  • 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
  • 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
  • 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
  • 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
  • 'scrapy.downloadermiddlewares.stats.DownloaderStats']
  • --http中的协议
  • 2020-10-07 19:54:30 [scrapy.middleware] INFO: Enabled spider middlewares:
  • ['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
  • 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
  • 'scrapy.spidermiddlewares.referer.RefererMiddleware',
  • 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
  • 'scrapy.spidermiddlewares.depth.DepthMiddleware']
  • 2020-10-07 19:54:30 [scrapy.middleware] INFO: Enabled item pipelines:
  • []
  • 2020-10-07 19:54:30 [scrapy.core.engine] INFO: Spider opened
  • 2020-10-07 19:54:30 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
  • 2020-10-07 19:54:30 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
  • 2020-10-07 19:54:31 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.meijutt.tv/new100.html> (referer: None) -- 爬取的网址
  • <200 https://www.meijutt.tv/new100.html> -- 这句话是打印出来的
  • 2020-10-07 19:54:31 [scrapy.core.engine] INFO: Closing spider (finished) -- 关闭爬虫
  • 2020-10-07 19:54:31 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
  • {'downloader/request_bytes': 225,
  • 'downloader/request_count': 1,
  • 'downloader/request_method_count/GET': 1,
  • 'downloader/response_bytes': 7664,
  • 'downloader/response_count': 1,
  • 'downloader/response_status_count/200': 1,
  • 'elapsed_time_seconds': 0.671001,
  • 'finish_reason': 'finished',
  • 'finish_time': datetime.datetime(2020, 10, 7, 11, 54, 31, 273154),
  • 'log_count/DEBUG': 1,
  • 'log_count/INFO': 10,
  • 'response_received_count': 1,
  • 'scheduler/dequeued': 1,
  • 'scheduler/dequeued/memory': 1,
  • 'scheduler/enqueued': 1,
  • 'scheduler/enqueued/memory': 1,
  • 'start_time': datetime.datetime(2020, 10, 7, 11, 54, 30, 602153)}
  • 2020-10-07 19:54:31 [scrapy.core.engine] INFO: Spider closed (finished)
  • 修改meijuSpider.py
  • import scrapy
  • #爬虫类:继承scrapy.spider
  • class MeijuspiderSpider(scrapy.Spider):
  • name = 'meijuSpider' #爬虫名:必须唯一性
  • allowed_domains = ['meijutt.tv',] #允许的域名列表
  • start_urls = ['https://www.meijutt.tv/new100.html',] #第一个爬取的url,如果写多个可以同时爬多个
  • def parse(self, response):
  • '''scrapy内部爬取完成后自动调用并返回响应数据'''
  • pass
  • print(response.text) #这里输出html文件
  • #print(response.body) #这里输出二进制文件(注意个requests中content不同)

定义item

  • item是保存爬取到的数据的容器,其使用方法和python字典类似,虽然我们可以在scrapy中直接使用dict,但是
  • item提供了额外保护机制来避免拼写错误也导致的未定义字段错误;
  • 类似ORM中的Model定义字段,我们可以通过scrapy.item类来定义要爬取的字段

执行爬虫的简易方式

  • 在主项目下创建start.py
  • import scrapy.cmdline
  • #执行scrapy带日志命令
  • #scrapy.cmdline.execute(['scrapy','crawl','meijuSpider'])
  • #执行scrapy不带日志命令
  • scrapy.cmdline.execute('scrapy crawl meijuSpider --nolog'.split())
  • scrapy.cmdline.execute(['scrapy','crawl','meijuSpider','--nolog'])
  • --直接调试这个文件就可以执行程序
  • #json存储
  • #scrapy.cmdline.execute(('scrapy crawl meijuSpider -o meiju.json').split())
  • #csv存储
  • #scrapy.cmdline.execute(('scrapy crawl meijuSpider -o meiju.csv').split())
  • #xml存储
  • #scrapy.cmdline.execute(('scrapy crawl meijuSpider -o meiju.xml').split())

Scrapy整体基础详解

安装Scrapy

  • Scrapy的安装介绍
  • Scrapy框架官方网址:http://doc.scrapy.org/en/latest
  • Scrapy中文维护站点:http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html
  • 安装方式(使用豆瓣源):
  • pip install scrapy -i https://pypi.douban.com/simple
  • '''
  • 如果安装出现错误,可以按照下面的顺序先安装依赖包:
  • 1、安装wheel
  • pip install wheel
  • 2、安装lxml
  • pip install lxml
  • 3、安装pyopenssl
  • pip install pyopenssl
  • 4、安装Twisted
  • 需要我们自己下载Twisted,然后安装。这里有Python的各种依赖包。选择适合自己Python以及系统的Twisted版本:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
  • # 3.6版本(cp后是python版本)
  • pip install Twisted-18.9.0-cp36-cp36m-win_amd64.whl
  • 5、安装pywin32
  • pip install pywin32
  • 6、安装scrapy
  • '''
  • 安装后,只要在命令终端输入scrapy来检测是否安装成功
城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐