Scrapy框架学习
转载文章 : 原文链接.
crapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader(下载器): 负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,
Spider(爬虫): 它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),
Item Pipeline(管道): 它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
Downloader Middlewares(下载中间件): 你可以当作是一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件): 你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests
常用的命令
创建项目: scrapy startproject xxx
进入项目: cd xxx #进入某个文件夹下
创建爬虫: scrapy genspider xxx(爬虫名) xxx.com (爬取域)
生成文件: scrapy crawl xxx -o xxx.json (生成某种类型的文件)
运行爬虫: scrapy crawl XXX
列出所有爬虫: scrapy list
获得配置信息: scrapy settings [options]
Scrapy项目下的结构
scrapy.cfg: 项目的配置文件
tutorial/: 该项目的python模块。在此放入代码(核心)
tutorial/items.py: 项目中的item文件.(这是创建容器的地方,爬取的信息分别放到不同容器里)
tutorial/pipelines.py: 项目中的pipelines文件.
tutorial/settings.py: 项目的设置文件.(我用到的设置一下基础参数,比如加个文件头,设置一个编码)
tutorial/spiders/: 放置spider代码的目录. (放爬虫的地方)
1.容器(items)的定义,容器并不是一开始就全部定义好的,可以跟随项目的更新一点点向里面添加
import scrapy
class Dmo(scrapy.Item):#创建一个类,继承scrapy.item类
<缩进>title = scrapy.Field()#需要哪些内容,就创建那些容器
<缩进>link = scrapy.Field()
<缩进>…
2.使用’创建爬虫’命令创建相应的py文件,并编写代码
import scrapy
#继承Spider类
class DemoSpider(scrapy.Spider):
name = 'demo'#爬虫的唯一标识,不能重复,启动爬虫时要用
allowed_domains = ['baidu.com']#限定域名,只爬取该域名下的网页
start_urls = ['http://baidu.com/']#开始爬取的链接
def parse(self, response):
#获取url,用"/"分段,获取倒数第二个字段
filename = response.url.split("/")[-2]
with open(filename, 'a') as f:
#将访问的得到的网页源代码写入文件
f.write(response.body)
#里面的parse方法,这个方法有两个作用
#1.负责解析start_url下载下来的Response对象,根据item提取数据(解析item数据的前提时parse里全部
# request请求都被加入了爬取队列)
#2.如果有新的url则加入爬取队列,负责进一步处理,URL的Request对象
#
#以上两点就是编写爬虫的主要部分
3.使用scrapy crawl 你的爬虫名字(我这里使用的demo),启动爬虫
Scrapy为Spider的start_urls属性中的每个url创建了Request对象,并将parse方法作为回调函数(callback)赋值给了request,而request对象经过调度器的调度,执行是生成response对象并送回给parse()方法进行解析,所以请求链接的改变是靠回调函数实现的
yield scrapy.Request(self.url, callback=self.parse)
Scrapy框架的整体执行流程
1.spider的yeild将request发送给engine
2.engine对request不做任何处理发送给scheduler
3.scheduler,生成request交给engine
4.engine拿到request,通过middleware发送给downloader
5.downloader在\获取到response之后,又经过middleware发送给engine
6.engine获取到response之后,返回给spider,spider的parse()方法对获取到的response进行处理,解析出items 或者requests
7.将解析出来的items或者requests发送给engine
8.engine获取到items或者requests,将items发送给ItemPipeline,将requests发送给scheduler(ps,只有调度器 中不存在request时,程序才停止,及时请求失败scrapy也会重新进行请求)
一些使用时的注意事项
1.Scrapy中print打印不出来内容(Print无效): 在settings.py中把ROBOTSTXT_OBEY设置为false
通俗来说, robots.txt 是遵循 Robot协议 的一个文件,它保存在网站的服务器中,它的作用是,告诉搜索引擎爬虫,本网站哪些目录下的网页 不希望 你进行爬取收录。在Scrapy启动后,会在第一时间访问网站的 robots.txt 文件,然后决定该网站的爬取范围。