Scrapy
1.scrapy架构图、核心七组件
Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发。
事件驱动和异步都是通过回调函数实现的。
框架:集成了基础功能的壳子,将基础的可复用轮子造好,让你专注业务逻辑的编写。
例如异步功能已写好,基础流程也写好了,你只需要将每个步骤的核心业务填充就可以运行了。
分成七组件的目的是为了解耦,只有真正的解耦核心业务才能够进行可插拔。
2.详细流程
1.spiders中发出原始Request到Engine中
2.Engine将请求发送至Scheduler进行请求编排及过滤,例如url去重。
3.编排好的url回递给Engine
4.Engine将处理完的Request发送给Downloder,
5.Downloader去真正的请求页面获取响应
6.Engine收到响应后,传递给spiders,因为事件驱动,回调每个request绑定的函数,进行数据解析
7.此时有两种情况
a)解析出详情页或其他页面的url,重复上面的操作,直至没有requests为止。
b)将解析出来的数据封装为Item类
8.无论是哪种结果,Engine都可以通过isInstance()判断出来,如果是Item类,就交给ItemPipelines进行持久化。
中间件:
3.环境搭建
Anaconda:https://www.cnblogs.com/gyxpy/p/11810734.html
安装:conda install scrapy
验证:scrapy -h 查看版本以及是否安装成功。
创建项目:scrapy staryproject scrapy_demo
创建spider: scrapy genspider txvideo www.xxx.com 爬虫源文件壳子创建,进入创建的项目文件夹下执行。
import scrapy class TxvideoSpider(scrapy.Spider): # name属性是爬虫文件的唯一标识,至于类名无所谓,用框架默认生成的即可 name = 'txvideo' # 直接注释掉:约束爬取的url必须在这个域名下,不在的直接被过滤掉了 allowed_domains = ['www.xxx.com'] # 初始url,框架自动循环列表元素封装为Request,并且绑定下面的函数parse为回调函数 # 这些都是框架自动做的 # 你可以连这个也注释掉,自己重写 # 建议全部注释掉,重写 start_urls = ['http://www.xxx.com/'] # 重写此方法,手动发出Request并且绑定回调函数 # 如果只有一个请求,那么就return # 多个请求要么将封装好的request全部封装到一个列表中 # 要么每个请求前加yield改为生成器,反正框架都是for循环遍历 def start_request(self): # 这个请求对象里面有一切请求信息可以封装 yield scrapy.Request(url=self.start_urls[0],callback=self.parse) def parse(self, response): pass
运行爬虫:scrapy crawl txvideo
还可以下面,写一个启动脚本
from scrapy.cmdline import execute execute("scrapy crawl txvideo --nolog".split())
4.目录详情
- scrapy.cfg 项目的主配置信息,用来部署scrapy时使用,爬虫相关的配置信息在settings.py文件中。
- items.py 设置数据存储模板,用于结构化数据,如:Django的Model
- pipelines 数据处理行为,如:一般结构化的数据持久化
- settings.py 配置文件,如:递归的层数、并发数,延迟下载等。强调:配置文件的选项必须大写否则视为无效,正确写法USER_AGENT='xxxx'
- spiders 爬虫目录,如:创建文件,编写爬虫规则