参考:
http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/tutorial.html
https://zhuanlan.zhihu.com/woodenrobot
Scripy的理解:
scripy的整体架构:1.Scrapy Engine 引擎
触发事务,整个系统的数据流处理
理解:
中心,类似于CPU的东西
2.Scheduler 调度器
用来接收引擎发过来的请求,压入队列,引擎再次请求的时候,返回
理解:
初始爬取的url,待爬取的url 都存在这里,等待爬取
调度器可以自动去重
3.Downkiader: 下载器
用于下载网页的内容,先给了引擎,之后引擎将网页的内容返回给蜘蛛
4.Spiders 爬虫,蜘蛛
用它来定制特定的域名或者 网页的解析规则
用于分析响应(response),提取item 或者额外跟进的URL类
每个spider 负责处理一个(或者一些)特定的网站
5.item Pipline 项目管道:
处理数据
蜘蛛爬取数据(项目), 清晰,存储,验证数据
理解;
爬虫爬取的数据存入Item--->item存入项目管道(Pipline)
--->数据的处理--->存入本地文件,或者存入数据库..
6.Downloader Middlewares:
下载中间件
位于Scrapy引擎和下载器之间的钩子框架
用于处理Scrapy引擎和下载器之间的请求和响应
理解:
常用于爬虫自动更换user-agent,IP等功能
7.Spider 中间件
1..Spider Middlewares 蜘蛛中间件
Scrapy引擎和蜘蛛之间的钩子框架
用于处理蜘蛛的响应输入和请求输出...
2..Scheduler Middlewares 调度中间件:
介于Scripy 引擎和调度之间的中间件
从Scrapy引擎发送到调度的请求和响应...
3.作用:
Spider中间件是在引擎及Spider之间的特定钩子(specific hook),
处理spider的输入(response)和输出(items及requests)。
其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。
8.数据流 DataFlow:
1.引擎打开一个网站,找到处理该网站的Spider
并且向该spider请求,第一个需要爬取的URL(s);
2.引擎从Spider获取到的第一个 要爬取的URL,并在调度器(Scheduler)
以request调度.
3.引擎向调度器请求下一个需要爬取的URL
4.调度器返回下一个需要爬取的URL,给引擎
引擎将URL 通过下载中间件(请求request方向),转发给下载器
5.一旦页面下载完毕,下载器生成一个该页面的response,
并通过下载中间件(reponse方向),发送给引擎
6.引擎下载器接收到response并,通过 Spider中间件,发送给
spider处理
7.Spider 处理response,并返回爬取到的Item 及 新的request给引擎
8.引擎将 Spider返回的,爬取到的item数据 给了ItemPipline,
将Spider返回的request 给调度器
9.重复,直到调度器中没有更多的request,引擎关闭该网站...
创建爬虫项目流程;
1.创建一个项目:
scrapy startproject scrapyspider
2.初始化之后,自动产生的目录:
1.scrapy.cfg
配置文件
2.scrapyspider
该项目的python模块,在这里书写代码
items.py:
项目中的item文件
piplines:
项目中的pipelines文件
settings:
项目设置文件
spider:
放置spider代码的目录
开始编写爬虫;
1.spider:
是一个类
2.继承scrapy.Spider类
定义3个属性:
name:用于区分Spider,唯一的
start_urls:
Spider在启动的时候,需要爬取的url列表
parse:
spider的一个方法
被调用的时候,每个初始url完成下载后,生成的response对象
都会作为唯一的参数,传递给该函数.
该方法,负责解析返回的数据response
提取数据(item),以及生成进一步处理的URL的request对象
3.执行步骤:
1.scrapyspider/spiders目录下的blog_spider.py文件
在这个目录下面,写你的爬虫
爬虫的名字,叫做...woodenrobot
2.在scrapyspider/ 路径下面,运行下面的命令
scrapy crawl woodenrobot
4.原理的理解:
1.定义一个入口页面
2.一个页面,有其他的链接
获取这些链接,放在爬虫的抓取队列中
3.然后,到新的页面上,递归调用
就是深度遍历和广度遍历
类似于,之前的扒网站的方式 ........
4.Python Twisted介绍
https://blog.csdn.net/hanhuili/article/details/9389433
Twisted是一个事件驱动型的网络引擎
介绍一些专有的名词;
Items:
从非结构性的数据源提取结构性数据,例如网页
为了定义常用的输出数据,Scrapy提供了 Item 类
Item 对象是种简单的容器,保存了爬取到得数据。
声明Item:
tem使用简单的class定义语法以及 Field 对象来声明
import scrapy
class Product(scrapy.Item):
name = scrapy.Field()
price = scrapy.Field()
stock = scrapy.Field()
last_updated = scrapy.Field(serializer=str)
那filed又是什么??(就是字典而已)
Field 对象指明了每个字段的元数据(metadata)。
Field:
翻译为领域,属性 ---叫做属性好理解一点的
意义:
Field 仅仅是内置的 dict 类的一个别名,
并没有提供额外的方法或者属性。
换句话说, Field 对象完完全全就是Python字典(dict)
爬取豆瓣的案例:
..........自己看代码.. 参考案例