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来检测是否安装成功
-