scrapy_0">1、认识scrapy
scripy是一个爬取网站数据,提取结构性数据而编写的应用框架。它使用Twisted这个异步网络库来处理网络通讯,包含了各种中间件接口。
scrapy_14">2、scrapy架构
2.1 架构流程
-
Spiders将需要发送Requests经由Scrapy Engine交给Scheduler;
-
Requests经Scheduler入队处理后,经过Scrapy Engine,DownloaderMiddlewares(可选,主要有User_Agent, Proxy代理)交给Downloader。
-
Downloader向互联网发送请求,并接收下载response,将response经ScrapyEngine,SpiderMiddlewares(可选)交给Spiders。
-
Spiders处理response,提取数据并将数据经ScrapyEngine交给ItemPipeline保存(可以是本地,可以是数据库)。
-
提取url重新经ScrapyEngine交给Scheduler进行下一个循环。直到无Url请求程序停止结束。
2.2 组件介绍
组件 | 作用 | |
---|---|---|
Scrapy Engine(引擎) | 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等 | 已实现 |
Scheduler(调度器) | 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎 | 已实现 |
Downloader(下载器) | 负责下载(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。 | 已实现 |
Spider(爬虫) | 它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler | 需要手写 |
Item Pipeline(管道) | 它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方 | 需要手写 |
Downloader Middlewares(下载中间件) | 一个可以自定义扩展下载功能的组件。 | 一般不用手写 |
Spider Middlewares(Spider中间件) | 一个可以自定扩展和操作引擎和Spider中间通信的功能组件 | 一般不用手写 |
3、创建项目
scrapy_45">3.1 下载scrapy
python">pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
3.2 查看指令
python">scrapy --help
3.3 创建项目
python"># myspider为项目名称
scrapy startproject myspider
3.3 查看生成文件
执行创建新项目的文件后,创建了一个文件夹,在这个文件夹的同名文件夹下生成了许多文件,这些文件就是scrapy的组件。
4、创建爬虫
4.1 打开创建文件夹
4.2 执行命令
python"># scrapy genspider 爬虫名 爬取域名
scrapy genspider douban movie.douban.com
5、爬取并解析数据
- douban.py
python">import scrapy
from scrapy import Selectorfrom myspider.items import MovieItemclass DoubanSpider(scrapy.Spider):name = "douban"allowed_domains = ["movie.douban.com"]start_urls = ["https://movie.douban.com/top250"] # 修改起始爬取url为TOP250def parse(self, response, **kwargs):selector = Selector(response)movies = selector.xpath("//div[@class='article']/ol/li")for movie in movies:movie_item = MovieItem()movie_item['title'] = movie.css("span.title::text").get()movie_item['subject'] = movie.css("span.inq::text").get()movie_item['rating_num'] = movie.css("span.rating_num::text").get()movie_item['detail'] = movie.css("a::attr(href)").get()yield movie_item
- items.py
python">import scrapy# 将获取到的数据组装为Item对象
class MovieItem(scrapy.Item):title = scrapy.Field()subject = scrapy.Field()rating_num = scrapy.Field()detail = scrapy.Field()
- settings.py
python">USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
- 运行命令
python"># 爬取并将数据储存在douban.csv文件中
scrapy crawl douban -o douban.csv
经上面的步骤即可完成简单的爬取,虽然看起来复杂,但在实际上,我们只需在现有的框架上进行简单修改即可。