【6.0】爬虫之scrapy框架

发布时间 2023-08-22 09:24:01作者: Chimengmeng

【一】Scrapy框架基本介绍

【1】Scrapy一个开源和协作的框架

  • 其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,
  • 使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。
  • 但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。
  • Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。
  • 因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发。
  • Scrapy框架类似于Django框架

【2】整体架构大致如下

Components:

  • 1、引擎(EGINE)
    • 引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。
  • 2、调度器(SCHEDULER)
    • 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回.
    • 可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
  • 3、下载器(DOWLOADER)
    • 用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的
  • 4、爬虫(SPIDERS)
    • SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求
  • 5、项目管道(ITEM PIPLINES)
    • 在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作
    • 下载器中间件(Downloader Middlewares)位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的响应response,
  • 6、爬虫中间件(Spider Middlewares)
    • 位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)

【3】官网链接

【二】安装

【1】Windows平台

(1)安装wheel文件

  • 在 Windows 平台上安装 Scrapy 之前
    • 首先需要安装 wheel 文件。wheel 文件是一种 Python 包的分发格式,可以方便地进行安装。
    • 可以通过以下命令来安装 wheel
pip3 install wheel

(2)安装 lxml 解析器

  • Scrapy 使用 lxml 解析器来进行 HTML 和 XML 的解析工作。
  • 要安装 lxml,可以执行以下命令:
pip3 install lxml

(3)安装 pyopenssl

  • Scrapy 在进行 HTTPS 请求时,需要使用 pyopenssl 模块来提供 SSL/TLS 支持。
  • 安装 pyopenssl 可以使用以下命令:
pip3 install pyopenssl

(4)下载并安装pywin32

(5)下载twisted的wheel文件

(6)安装twisted

  • 下载完成 twistedwheel 文件后,可以使用以下命令安装 twisted
pip3 install 下载目录\Twisted-17.9.0-cp36-cp36m-win_amd**.whl
  • 下载目录 替换为您实际下载 twisted wheel 文件所在的目录
  • 并根据您的 Python 环境选择正确的文件名进行替换。

(7)安装scrapy(可以优先尝试这个命令,报错再按照上述安装对应的依赖)

  • 当上述依赖项都安装完成后,可以使用以下命令来安装 Scrapy:
pip3 install scrapy

【2】Linux平台

  • 在 Linux 平台上安装 Scrapy,可以通过以下命令进行安装:
pip3 install scrapy

【三】命令行工具

【1】查看帮助

scrapy -h
scrapy <command> -h
  • 第一个命令用于查看全部可用命令的帮助信息
  • 第二个命令用于查看特定命令的帮助信息

【2】全局命令(Global commands)和项目命令(Project-only commands)

  • 其中Project-only必须切到项目文件夹下才能执行,而Global的命令则不需要
Global commands:
startproject #创建项目
genspider    #创建爬虫程序
settings     #如果是在项目目录下,则得到的是该项目的配置
runspider    #运行一个独立的python文件,不必创建项目
shell        #scrapy shell url地址  在交互式调试,如选择器规则正确与否
fetch        #独立于程单纯地爬取一个页面,可以拿到请求头
view         #下载完毕后直接弹出浏览器,以此可以分辨出哪些数据是ajax请求
version      #scrapy version 查看scrapy的版本,scrapy version -v查看scrapy依赖库的版本
Project-only commands:
crawl        #运行爬虫,必须创建项目才行,确保配置文件中ROBOTSTXT_OBEY = False
check        #检测项目中有无语法错误
list         #列出项目中所包含的爬虫名
parse        #scrapy parse url地址 --callback 回调函数  #以此可以验证我们的回调函数是否正确
bench        #scrapy bentch压力测试

全局命令(Global commands):

  • startproject:创建一个新的 Scrapy 项目。
  • genspider:创建一个新的爬虫程序。
  • settings:显示一个 Scrapy 项目的配置信息。
  • runspider:运行一个独立的 Python 文件作为爬虫,不需要创建项目。
  • shell:进入 Scrapy 的交互式调试环境,可以检查选择器规则是否正确。
  • fetch:单独请求一个页面,并获取响应结果。
  • view:下载指定页面并在浏览器中打开,用于检查通过哪些请求获取数据。
  • version:查看当前安装的 Scrapy 版本号。

项目命令(Project-only commands):

  • crawl:运行一个 Scrapy 爬虫,必须在项目目录下执行且确保配置文件中的 ROBOTSTXT_OBEY 设置为 False
  • check:检查项目中是否存在语法错误。
  • list:列出项目中包含的所有爬虫名称。
  • parse:使用回调函数解析给定的 URL,用于验证回调函数是否正确。
  • bench:用于对 Scrapy 进行压力测试。

【3】官网链接

【四】创建项目

【1】创建步骤

  • 创建项目命令:
scrapy startproject 项目名
  • 进入爬虫项目文件
cd NewsPro
  • 创建spider项目
scrapy genspider wangyi news.163.com
scrapy genspider huanqiu huanqiu.com

【2】目录结构

├── NewsPro 						# 项目名
│   ├── __init__.py
│   ├── items.py					# 类似于django的 models表模型,一个个模型类
│   ├── middlewares.py				# 中间件
│   ├── pipelines.py 				# 管道---》写持久化
│   ├── settings.py					# 项目配置文件
│   └── spiders						# 里面放了自定义的爬虫,类似于app
│       ├── __init__.py
│       ├── huanqiu.py				# 自定义爬虫
│       └── wangyi.py				# 自定义爬虫
└── scrapy.cfg						# 项目上线配置

  • 文件说明:
    • scrapy.cfg
      • 项目的主配置信息,用来部署scrapy时使用,爬虫相关的配置信息在settings.py文件中。
    • items.py
      • 设置数据存储模板,用于结构化数据
      • 如:Django的Model
    • pipelines
      • 数据处理行为
      • 如:一般结构化的数据持久化
    • settings.py
      • 配置文件
      • 如:递归的层数、并发数,延迟下载等。强调:配置文件的选项必须大写否则视为无效,正确写法USER_AGENT='xxxx'
    • spiders
      • 爬虫目录
      • 如:创建文件,编写爬虫规则

【3】简单使用

  • wangyi.py
import scrapy


class WangyiSpider(scrapy.Spider):
    name = "wangyi"
    allowed_domains = ["news.163.com"]
    start_urls = ["http://news.163.com/"]

    def parse(self, response):
        print("response:::", response.text)

【4】启动爬虫程序

scrapy crawl wangyi

【5】优化启动程序

  • 每一次终端启动和麻烦,我们可以在项目根目录下新建启动文件
  • bin.py:
from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'wangyi', "--nolog"])