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