您当前的位置:首页 > 计算机 > 编程开发 > Python

爬虫--Scrapy基础、详解

时间:08-16来源:作者:点击数:
城东书院 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
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐