爬虫框架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 ...
随机推荐
- appium 滑动封装
#获得机器屏幕大小x,y def getSize(): x = dr.get_window_size()['width'] y = dr.get_window_size()['heig ...
- C++四种强制转换
C++的四种强制类型转换,所以C++不是类型安全的.分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast 为什么使用C风格的强制 ...
- md5加密(3)---org.apache.commons.codec.digest.DigestUtils.md5Hex(input)
import org.apache.commons.codec.digest.DigestUtils;String sig = DigestUtils.md5Hex("str")
- 给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组
Array.prototype.removeCount=function(){ var that=this; var arr=[]; for(var i=0;i<that.length;i++) ...
- Mongo db change datadir
To change the location used by MongoDB to store its data, you need to: Edit /etc/mongodb.conf and ch ...
- std::thread函数传参拷贝次数
c++11的thread库大大方便了开发,但是目前网络上少有深入分析的资料和使用例程.特别是在线程函数传参这一块,一般止步于使用std::ref传引用. 这次写服务器遇到个BUG,线程函数参数是智能指 ...
- AndroidManifest.xml中声明权限——各种permission含义摘录
android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序 android. ...
- win10 IIS 10.0 无法安装 URL Rewrite Module 重写模块
打开注册表 win+R 输入 regidit在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp位置 修改注册表 把MajorVersion的值改为9 安装 ...
- UGUI 学习
1. Grid Layout Group(网格布局) Hierachy: Game: 属性和功能: 2. 根据鼠标位置旋转界面实现: public class TiltWindow : MonoBeh ...
- pid文件的作用
pid文件的作用 一.pid文件的作用 1.pid文件的内容用cat命令查看,可以看到内容只有一行,记录了该进程的ID 2.pid文件的作用防止启动多个进程副本 3.pid文件的原理进程运行后会给.p ...