1、认识scrapy
scripy是一个爬取网站数据,提取结构性数据而编写的应用框架。它使用Twisted这个异步网络库来处理网络通讯,包含了各种中间件接口。
优点:
利用scrapy的设计实现了非阻塞的异步操作。相比于传统的阻塞式请求,极大的提高了CPU的利用率,大大提改了爬取效率;
配置简单,只需少量代码即可完成任务;
拓展性强、插件丰富,比如scrapy + redis 、爬虫可视化文件;
解析数据方便,scrapy封装了css、xpath、正则表达式等解析器,提供了更方便高级的selector构造器,可以高效处理爬取下来的数据。
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、创建项目
3.1 下载scrapy
pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
3.2 查看指令
scrapy --help
3.3 创建项目
# myspider为项目名称
scrapy startproject myspider
3.3 查看生成文件
执行创建新项目的文件后,创建了一个文件夹,在这个文件夹的同名文件夹下生成了许多文件,这些文件就是scrapy的组件。
4、创建爬虫
4.1 打开创建文件夹
4.2 执行命令
# scrapy genspider 爬虫名 爬取域名
scrapy genspider douban movie.douban.com
5、爬取并解析数据
- douban.py
import scrapy
from scrapy import Selector
from myspider.items import MovieItem
class DoubanSpider(scrapy.Spider):
name = "douban"
allowed_domains = ["movie.douban.com"]
start_urls = ["https://movie.douban.com/top250"] # 修改起始爬取url为TOP250
def 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
import scrapy
# 将获取到的数据组装为Item对象
class MovieItem(scrapy.Item):
title = scrapy.Field()
subject = scrapy.Field()
rating_num = scrapy.Field()
detail = scrapy.Field()
- settings.py
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"
- 运行命令
# 爬取并将数据储存在douban.csv文件中
scrapy crawl douban -o douban.csv
经上面的步骤即可完成简单的爬取,虽然看起来复杂,但在实际上,我们只需在现有的框架上进行简单修改即可。