Scrapy结构
http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html
scrapy 使用Twisted 这个异步网络库来处理网络通信,使用python写的爬虫框架。
scrapy的构造
Scrapy引擎(Engine): 负责控制数据流在系统的所有组件中流动,并在相应的动作发生时出发事件。
Scheduler 调度器: 从引擎接收Request并将它们入队,以便之后引擎请求request是提供给引擎。
Donwnloader 下载器: 负责获取页面数据并提供给引擎,而后提供给Spider,或额外跟进的URL的类。每个Spider负责处理一个(或一些)特定网站。
Item Pipeline 数据传递管道: 负责处理被Spider提出出来的item。典型的处理有清理验证及持久化(例存储到数据库中)。
Downloader middlewares 下载器中间件: 是一个在引擎和下载器中间的特定钩子(specific hook ),处理Downloader传递给引擎的Response。中间件通过插入自定义代码,扩展Scrapy的功能
Spider middlewares Spider中间件: 是一个在引擎和Spider中间的特定钩子,处理spider的输入(response)和输出(Item及request )
Spider : 包含初始的URL,解析相应的response,提取目标items和requests.
scrapy中的数据流程
1) 引擎打开一个网站,找到该网站的Spider并向该Spider请求第一个要爬取的URL。
2) 引擎从spider中获取初始要爬取的URL ,并传给调度器(sheduler)处理验证筛选URL的规则。
3) 引擎向调度器请求下一个要爬取的URL
4) 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求request 方向)转发给下载器
5) 下载器下载完页面,返回response,通过下载中间件(返回response方向)发送给引擎
6) 引擎从下载器中接收到Response并通过spider中间件(输入方向)发送给spider处理
7)spider处理response并返回提出的item及新的request给引擎
8)引擎 将spider返回的item和request分别发给item pipeline 和调度器sheduler 处理
9)重复第3步,直到调度器中没有更多的request,引擎关闭网站。
在命令行中移动到想创建项目的目录下,输入指令 scrapy startproject cnblogSpider 就可创建一个名为cnblogSpider的项目。创建后会出现如下目录文件
scrapy.cfg:项目部署文件
cnblogSpiders/:该项目的Python模块,之后可在此加入代码
cnblogSpiders/settings.py: 项目的配置文件
cnblogSpider/spiders/:放置spider代码的目录
创建spider类,将脚本放在cnblogSpider/spiders/目录下,命名为cnblogs_spider.py
该类需要继承scrapy.Spider,并定义三个属性 name(爬虫的名字,具有唯一性),start_urls(初始URL列表),parse(response)(解析传入的response,返回提取的目标数据)。
import scrapy
from cnblogSpider.items import CnblogspiderItem
from scrapy.selector import Selector
class CnblogsSpider(scrapy.Spider):
name="cnblogs"
allowed_domains=["cnblogs.com"]
start_urls=["http://www.cnblogs.com/qiyeboy/default.html?page=1"]
def parse(self,response):
papers=response.xpath('//*[@id="mainContent"]/div/div[@class="day"]')
print('*'*15,len(papers),'-'*30)
mm=0
for paper in papers :
mm =mm + 1
print(mm)
url = paper.xpath(".//*[@class='postTitle']/a/@href").extract()[0]
title=paper.xpath(".//*[@class='postTitle']/a/text()").extract()[0]
time=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()[0]
content=paper.xpath(".//*[@class='postCon']/div/text()").extract()[0]
item = CnblogspiderItem(url=url,title=title,time=time,content=content)
yield item
next_page=Selector(response).re(u'<a href="(\S*)">下一页</a>')
if next_page:
yield scrapy.Request(url=next_page[0],callback=self.parse)
选择器Selector ,scrapy自有的数据提取机制构建与lxml库之上,通过特定的xpath,css表达式选择html文件中的某个部分。
创建一个selector对象,a=Selector(response),就可以对其调用方法a.xpath(query),a.css(query),a.extract()(序列化该节点为Unicode字符串并返回list列表),a.re(regex)(regex可以是原始正则表达式或已被re.compile()编译的正则对象,返回Unicode字符串列表) 。 response可直接调用xpath(),css()方法。
在命令行中输入 scrapy
这时在命令行 进入到项目的根目录cnblogSpider/下 输入 scrapy crawl cnblogs ,就可以看到解析的数据了。
通过yield 返回item ,将parse方法打造成一个生成器。
next_page 使页面翻页,获取下一页的URL列表
定义Item cnblogSpider/items.py
import scrapy
class CnblogspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
url=scrapy.Field()
time=scrapy.Field()
title=scrapy.Field()
content = scrapy.Field()
这个类需要继承scrapy.Item,CnblogspiderItem的类实例对象,对其里面的键值对,具有和字典一样的使用方式
创建一个CnblogspiderItem对象,a=CnblogspiderItem(title='python爬虫',content='爬虫开发')
print(a.items(),a.keys(),a['title'],a.get('content','ahsdkahdkabdkabnka'))
print(dict(a))
输出:
ItemsView({'content': '爬虫开发', 'title': 'python爬虫'}) dict_keys(['content', 'title']) python爬虫 爬虫开发
{'content': '爬虫开发', 'title': 'python爬虫'}
构建Item Pipeline cnblogSpider/pipeline.py
实现数据的的持久化存储。一般具有下面几种功能:清理HTML数据,验证爬取数据的合法性(检查item是否包含某些字段),查重并去重,将爬取结果保存到文件或数据库中。
import json
from scrapy.exceptions import DropItem
class CnblogspiderPipeline(object):
def __init__(self):
self.file=open('papers.json','wb')
def process_item(self, item, spider):
if item['title']:
line=json.dumps(dict(item))+'\n'
self.file.write(line.encode())
return item
else:
raise DropItem('Missing title in %s' % item)
此段代码主要是检查了item中是否包含title字段,有就写入json文件,没有就抛出错误。
创建完Item Pipeline后还需在配置文件cnblogSpider/settings.py里将item pipeline的类添加到ITEM_PIPELINES变量中。
ITEM_PIPELINES={'cnblogSpider.pipelines.CnblogspiderPipeline':300,}
ITEM_PIPELINES变量中可配置多个Item Pipeline组件,分配给每个类的整型值确定了它们的运行顺序,item按数字从小到大的
顺序通过 Item Pipeline.通常数字的范围是0~1000.
从程序内启动spider:
在cnblogs_spider.py 中添加如下代码:
if __name__=='__main__':
process=CrawlerProcess({
'USER_AGENT':'Mozilla/4.0 (compatible;MSIE 7.0; Windows NT 5.1)'
})
process.crawl(CnblogsSpider)
process.start()
'''
if __name__=='__main__':
configure_logging({'LOG_FORMAT':'%(levelname)s:%(message)s'})
runner=CrawlerRunner()
d=runner.crawl(CnblogsSpider)
d.addBoth(lambda _:reactor.stop())
reactor.run()
'''
'''
class MySpider1(scrapy.Spider):
#your first spider definition
...
class MySpider2(scrapy.Spider):
#Your second spider definition
...
#在一个进程中启动多个爬虫
#第一种方法
process=CrawlerProcess()
process.crawl(MySpider1)
process.crawl(MySpider2)
process.start()
#第二种方法
configure_logging()
runner=CrawlerRunner()
runner.crawl(MySpider1)
runner.crawl(MySpider2)
d=runner.join()
d.addBoth(lambda _: reactor.stop())
reactor.run()
#第三种方法
configure_logging()
runner=CrawlerRunner()
@defer.inlineCallbacks
def crawl():
yield runner.crawl(MySpider1)
yield runner.crawl(MySpider2)
reactor.stop()
crawl()
reactor.run()
'''
Scrapy结构的更多相关文章
- scrapy结构及各部件介绍
1.总览,数据流图: 2.Engine:引擎负责控制系统所有组件之间的数据流,并在发生某些操作时触发事件. 3.Scheduler:调度程序接收来自引擎的请求,并将它们排入队列,并在之后,当Engin ...
- [转]使用scrapy进行大规模抓取
原文:http://www.yakergong.net/blog/archives/500 使用scrapy有大概半年了,算是有些经验吧,在这里跟大家讨论一下使用scrapy作为爬虫进行大规模抓取可能 ...
- scrapy基础
scrapy Scrapy 是用 Python 实现的一个为了爬取网站数据.提取结构性数据而编写的应用框架. Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. Scrapy ...
- Scrapy爬虫及案例剖析
由于互联网的极速发展,所有现在的信息处于大量堆积的状态,我们既要向外界获取大量数据,又要在大量数据中过滤无用的数据.针对我们有益的数据需要我们进行指定抓取,从而出现了现在的爬虫技术,通过爬虫技术我们可 ...
- Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站
Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...
- Python该怎么入门?Python入门教程(非常详细)
Python要学多久可以学会,达到精通呢? 任何知识都是基础入门比较快,达到通晓的程序是需求时日的,这是一个逐渐激烈的进程. 通晓任何一门编程语言,都需求通过大量的实践来积累经验,解决遇到的各种疑难问 ...
- python爬虫随笔-scrapy框架(1)——scrapy框架的安装和结构介绍
scrapy框架简介 Scrapy,Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试 ...
- scrapy 原理,结构,基本命令,item,spider,selector简述
原理,结构,基本命令,item,spider,selector简述 原理 (1)结构 (2)运行流程 实操 (1) scrapy命令: 注意先把python安装目录的scripts文件夹添加到环境变量 ...
- Scrapy框架——介绍、安装、命令行创建,启动、项目目录结构介绍、Spiders文件夹详解(包括去重规则)、Selectors解析页面、Items、pipelines(自定义pipeline)、下载中间件(Downloader Middleware)、爬虫中间件、信号
一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...
随机推荐
- python cook 2
迭代器 iterator 生成器 generator 1.手动遍历迭代器 2.代理迭代 解释:将迭代操作代理到容器内部的对象上 操作:使用__iter()__, for 循环遍历对象时,会自动调用 ...
- 父子元素select悬浮代码,兼容火狐
//公共切换方法 function SwitchCommon() { //悬浮显示 $(document.body).on("mouseenter", "[hex-eid ...
- CF-822C Hacker, pack your bags! 思维题
题目大意是给若干线段及其费用,每个线段权值即为其长度.要求找出两个不重合线段,令其权值和等于x且费用最少. 解法: 先分析一下题目,要处理不重合的问题,有重合的线段不能组合,其次这是一个选二问题,当枚 ...
- jquery父、子、兄弟节点查找
js var test = document.getElementById("test"); var parent = test.parentNode; // 父节点 var ch ...
- numpy学习:数据预处理
待处理的数据:150*150的灰度图片,除分析目标外,背景已经抹0 需要实现的目标:背景数字0不变,对其余数字做一个归一化处理 对list处理可以用 a=list(set(a)) # 实现了去除重复元 ...
- DFS CCPC2017 南宁I题
The designers have come up with a new simple game called “Rake It In”. Two players, Alice and Bob, i ...
- 精华 selenium_webdriver(python)调用js脚本
#coding=utf-8 from selenium import webdriver import time driver = webdriver.Firefox() driver.get(&qu ...
- Matlab-2:二分法工具箱
function g=dichotomy(f,tol) %this routine uses bisection to find a zero of user-supplied %continuous ...
- python-day74--知识总体总结
1. 课程介绍 - 数据类型 - 函数 - 面向对象三大特性:继承,封装,多态 - socket:本质传输字节:所有网络通信都基于socket ...
- poj-2888-矩阵+polya
Magic Bracelet Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 6195 Accepted: 1969 D ...