scrapy框架

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

经上面的步骤即可完成简单的爬取,虽然看起来复杂,但在实际上,我们只需在现有的框架上进行简单修改即可。

相关代码地址:https://gitee.com/justinc666/crawler/tree/master/scrapy

上一篇:计算机视觉(CV)技术的优势和挑战


下一篇:JS进阶 1——作用域、解构、箭头函数