一."5+2"结构
SPIDERS(入口,需要用户编写):1.提供最初始的访问链接 2.解析Downloader返回的响应,返回想要的内容和额外的爬取请求
Spider Midderware:
ITEM PIPELINES:(出口,用户编写):清理,检验和查看,存储数据
DOWNLOADER:(已有实现):下载网页
SCHEDULER:(已有实现):对所有请求进行调度处理(相当于队列,有序提供url)
ENGINE(已有实现):控制模块之间的数据流,根据条件触发时间
Downloader Middleware:(用户可编写)实施ENGINE.Scheduler和Download之前进行用户可配置的控制
流程:
SPIDERS将url请求列表通过中间件传递给SCHEDURER
SCHEDULER处理后通过ENGINE传递给DOWNLOAD
DOWNLOAD下载相关网页后通过ENGINE把数据传递给SPIDERS
SPIDERS解析数据,将想要的数据分为两部分:(ITEMS/REQUESTS)
ITEM PIPELINES接收数据并进行数据清理
二.缺点
和request库相同,都没有提供处理js,提交表单,应对验证码等功能的实现
三.常用命令
startproject:创建一个新工程
genspider:创建一个爬虫
setting:获得爬虫的所有信息
crawer:运行一个爬虫
list:列出工程中所有爬虫
shell:启动url调试命令行
四.第一个实例
步骤:
1.建立爬虫工程
scrapy startproject scrapy_demo
scapy.cfg:部署Scrapy爬虫的配置文件
scrapy_demo:用户自定义python代码
2.创建一个爬虫
scrapy genspider demo scrapy_demo 会在Spider文件夹下创建一个demo.py文件,代码如下
# -*- coding: utf-8 -*- import scrapy class DemoSpider(scrapy.Spider): name = 'demo' #只能在该域中爬去网页 allowed_domains = ['scrapy_demo'] start_urls = ['http://scrapy_demo/'] #用于处理响应,解析内容形成字典,发现新的url爬虫请求 def parse(self, response): pass
3.配置产生的spider爬虫(修改demo文件)
class DemoSpider(scrapy.Spider): name = 'demo' #只能在该域中爬去网页 # allowed_domains = ['scrapy_demo'] start_urls = ['https://python123.io/ws/demo.html'] #用于处理响应,解析内容形成字典,发现新的url爬虫请求 def parse(self, response): #将爬取的url名的后半部分作为文件名 fname=response.url.split('/')[-1] with open(fname,'wb') as wf: wf.write(response.body) self.log('保存%s文件成功'%fname) pass
4.运行爬虫,获取网页
scrapy crawl demo
可以看到在当前目录下生成了demo.html文件