爬虫框架scrapy的基本内容
Scrapy介绍
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以帮助用户简单快速的部署一个专业的网络爬虫。如果说前面我们写的定制bs4爬虫是”手动挡“,那Scrapy就相当于”半自动档“的车。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
所谓网络爬虫,就是抓取特定网站网页的HTML数据。抓取网页的一般方法是,定义一个入口页面,然后一般一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然后进入到新页面后再递归的进行上述的操作,其实说来就跟深度遍历或广度遍历一样。
整体架构

- 引擎(Scrapy Engine),用来处理整个系统的数据流处理,触发事务。这个模块相当于整个框架的控制中心,他控制着所有模块的数据流交换,并根据不同的条件触发相对应的事件,同样,这个模块也是不需要我们编写的。
- 调度器(Scheduler),用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。这个模块对所有的爬取请求,进行调度管理,同样也是不需要我们写的模块。通过简单的配置就能达到更加多线程,并发处理等等强大功能。
- 下载器(Downloader),用于下载网页内容,并将网页内容返回给蜘蛛。这个模块,是Scrapy帮我们做好的,不需要我们自己编写,直接拿来用就行,其主要功能就是从网上获取网页内容,类似于我们写的get_html函数,当然,比我们自己写的这个简单的函数要强大很多.
- 蜘蛛(Spiders),蜘蛛是主要干活的,用它来制订特定域名或网页的解析规则。编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。
- 项目管道(Item Pipeline),负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。这个模块是需要我们手动实现的,他的主要功能是将我们爬取筛选完毕的数据写入文本,数据库等等。总之就是一个“本地化”的过程。
- 下载器中间件(Downloader Middlewares),位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
- 蜘蛛中间件(Spider Middlewares),介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。
- 调度中间件(Scheduler Middlewares),介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
爬取流程
上图绿线是数据流向,首先从初始URL开始,Scheduler会将其交给Downloader进行下载,下载之后会交给Spider进行分析,Spider分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回Scheduler;另一种是需要保存的数据,它们则被送到Item Pipeline那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。
数据流
Scrapy中的数据流由执行引擎控制,其过程如下:
- 引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。
- 引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。
- 引擎向调度器请求下一个要爬取的URL。
- 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。
- 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。
- 引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。
- Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。
- 引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。
- (从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。
有关scrapy详细介绍,请查看官方文档,中文文档
下面上一个简单不能再简单的例子,我们以爬取zimuku.net为例,有利于进一步了解scrapy整个操作过程。
├── zimuku #外层目录
│ ├── __init__.py #初始化脚本
│ ├── __pycache__ #Python缓存文件。暂时无视
│ ├── items.py #Items代码模板,继承类自scrapy.Item
│ ├── middlewares.py #Middlewares代码模板(继承类)
│ ├── pipelines.py #Pipelines代码模板(继承类)
│ ├── settings.py #Scrapy爬虫的配置文件
│ └── spiders #Spiders代码模板目录 我们写爬虫的地方
│ ├── __init__.py
│ └── __pycache__
└── scrapy.cfg #部署爬虫的配置文件
第二步:cd zimuku
第三步:我们用命令行创建第一个Spider:scrapy genspider demo zimuku.net(demo可以任意定义,zimuku.net为要爬取到开始url)
我们来看看demo.py
# -*- coding: utf-8 -*-
import scrapy class DemoSpider(scrapy.Spider):
name = "demo"
allowed_domains = ["zimuku.net"]
start_urls = ['http://zimuku.net/']
def parse(self, response):
pass
可以看到Scrapy已经帮我们把爬虫的框架写好了,我们只要在这个框架的基础上进行进一步的定制就可以了。
下面我们定制属于自己到内容:
# -*- coding: utf-8 -*-
import scrapy class DemoSpider(scrapy.Spider):
name = "demo"
allowed_domains = ["zimuku.net"]
start_urls = ['http://zimuku.net/'] def parse(self, response):
'''
parse()函数接收Response参数,就是网页爬取后返回的数据
用于处理响应,他负责解析爬取的内容
生成解析结果的字典,并返回新的需要爬取的请求
'''
name = response.xpath('//b/text()').extract()[1]
items = {'name':name}
with open('name.txt','w') as f:
f.write(str(items))
好了,下面我们在终端运行,scrapy crawl demo
终端出现
INFO: Spider closed (finished)
表示爬取结束,我们打开项目文件夹,可以查看到name.txt文件,打开可以看到里面爬取到内容了。

OK,通过这个super简单的小例子,我们知道了Scrapy框架到底是如何运作的,
大家一定要跟着敲一遍才能更加熟悉哦。
链接:http://www.jianshu.com/p/a8aad3bf4dc4
爬虫框架scrapy的基本内容的更多相关文章
- 教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http://www.xiaohuar.com/,让你体验爬取校花的成就感. Scr ...
- 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...
- 爬虫框架Scrapy
前面十章爬虫笔记陆陆续续记录了一些简单的Python爬虫知识, 用来解决简单的贴吧下载,绩点运算自然不在话下. 不过要想批量下载大量的内容,比如知乎的所有的问答,那便显得游刃不有余了点. 于是乎,爬虫 ...
- 网络爬虫框架Scrapy简介
作者: 黄进(QQ:7149101) 一. 网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本:它是一个自动提取网页的程序,它为搜索引擎从万维 ...
- Linux 安装python爬虫框架 scrapy
Linux 安装python爬虫框架 scrapy http://scrapy.org/ Scrapy是python最好用的一个爬虫框架.要求: python2.7.x. 1. Ubuntu14.04 ...
- Python爬虫框架Scrapy教程(1)—入门
最近实验室的项目中有一个需求是这样的,需要爬取若干个(数目不小)网站发布的文章元数据(标题.时间.正文等).问题是这些网站都很老旧和小众,当然也不可能遵守 Microdata 这类标准.这时候所有网页 ...
- 小白学 Python 爬虫(34):爬虫框架 Scrapy 入门基础(二)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(35):爬虫框架 Scrapy 入门基础(三) Selector 选择器
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(38):爬虫框架 Scrapy 入门基础(六) Item Pipeline
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
随机推荐
- java代码---------再练习ChatAt()的用法
总结: 没有理解方法的含义.瞎用 package com.mmm; //实现字符串中某个字符出现的次数 public class Mo { public static void main(String ...
- temple-html5
ylbtech-HTML5: 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 9.返回顶部 1 ...
- Apache common exec包的相应使用总结
最近在写一个Java工具,其中调用了各种SHELL命令,使用了Runtime.getRuntime().exec(command);这个方法.但是在我调用某个命令执行操作时,程序就卡在那了,但是其 ...
- Druid.io系列(五):查询过程
原文链接: https://blog.csdn.net/njpjsoftdev/article/details/52956194 Druid使用JSON over HTTP 作为底层的查询语言,不过强 ...
- 构建:vue项目配置后端接口服务信息
背景 vue-cli脚手架生成的webpack标准模板项目 HTTP库使用axios 一.开发环境跨域与API接口服务通信 整体思路: 开发环境API接口请求baseURL为本地http://loca ...
- Oracle调优之buffer pool相关
一个oracle block与data buffer中的一个buffer对应.用户进程(server process)负责读取磁盘上的block到data buffer cache中,DEWn进程负责 ...
- 华为交换机S5700 vty 0 4
最佳答案 vty 0 4 代表有5条VTY线路 由0到4 这个要看设备的版本有的设备会有更多条VTY线路比如一些企业版的设备 显示用户界面 进入TELNET 设置模式 user-interface ...
- canvas获取鼠标位置
canvas获取鼠标位置 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- Flask之模板之宏、继承、包含
3.5 宏.继承.包含 类似于python中的函数,宏的作用就是在模板中重复利用代码,避免代码冗余. Jinja2支持宏,还可以导入宏,需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有 ...
- angularjs之向下一个页面传参
原理: 1.在a标签跳转时,连接后增加一个参数值 2.在路由中接收 3.在控制器中接收 实现: 1.<a href="#/list/{{val.id}}"> 2.在js ...