Scrapy爬虫框架1-Scrapy认知

193 阅读3分钟

Scrapy了解

Scrapy是一个优秀的开源爬虫框架:

  • 开源:代表整个爬虫框架的源码都进行了公布,所有人均可查看,修改,维护
  • 框架:整个Scrapy由多个常用的爬虫功能组成,只需要填写一些基础的爬虫信息,即可以实现异步爬虫

Scrapy优势

  • Scrapy使用了Twisted模块实现了异步,使我们的爬虫更加稳定,效率更高
  • 配置和功能拓展性都很灵活
  • 有自带的常用功能和组件,可以快速实现开发

Scrapy工作流程

image.png 简易化:

image.png

名称介绍
引擎(engine)scrapy的核⼼,所有模块的衔接,对数据流程进⾏梳理
调度器(scheduler)可以看成是⼀个队列,⾥⾯存放着⼀堆即将发送的请求,它决定了下⼀步要去爬 取哪⼀个url
下载器(downloader)它是⽤来发动请求的⼀个模块,完全可以把它理解成是⼀个requests.get()的功能
爬⾍(spider)这是我们要写的第⼀个部分,负责解析下载器返回的response对象,提取到我们需要的数据
管道(Item pipeline)这是我们要写的第⼆个部分的内容,主要负责数据的存储和各种持久化操作
下载中间件(downloader Middlewares)可以⾃定义的下载扩展,⽐如设置代理,处理引擎与下载器之间的请求与响应
爬⾍中间件(Spider Middlewares)可以⾃定义requests请求和进⾏response过滤

工作流程:

  1. 传⼊我们需要获取的链接列表。
  2. 引擎负责传输给调度器,他的任务是封装请求对象,传⼊队列,将请求对象返回给引擎。
  3. 引擎获取请求对象,给下载器,下载器负责从⽹络下载进⾏请求下载,最终将响应数据返回给引擎。
  4. 引擎将响应数据返回给我们后,可以对其进⾏数据解析,将解析的数据进⾏存储,如果还有新的链 接需要获取可以继续将链接返回给引擎,再次执⾏上述整个流程
  5. 引擎接收到需要存储的数据,将数据给管道进⾏存储,管道可以将数据存储到本地的⽂件或者数据库

我们需要做的 1.给出需要爬取的链接 2.将返回的响应对象进行解析 3.写如何存储

Scrapy安装

# 更新 pip
python -m pip install --upgrade pip
#安装scrapy
pip install -U scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple

Scrapy基础使用

在新的项目中创建一个Scrapy框架

1.进入到需要创建框架的路径

cd 相对路径或者绝对路径
相对路径:cd python  # 表⽰进⼊当前⽬录下的python⽂件夹
绝对路径:cd /d F:/music/  # 表⽰进⼊F盘的music⽂件夹,/d 参数代表切换驱动盘

返回上一级:cd ../  # 代表返回⽬录,如果需要返回多级,则可以在后⾯继续加../

2.创建项目

scrapy startproject baidu  #baidu 为爬虫框架的名称,根据网站名称自定义即可

主要文件介绍

spiders⽂件夹:是我们存放爬⾍的位置

items.py:是数据封装的地⽅,⽤于设定存储时候的字段

middlewares.py:中间件(爬⾍中间件和下载中间件)

pipelines.py:管道,设置如何保存数据

settings.py:Scrapy的配置项,设置⼀些基础信息

**3.创建爬虫

通过cd命令进入到spiders目录
#创建爬虫文件
scrapy genspider baidu baidu.com(或者www.baidu.com)

创建完成之后,我们的spider就出现了

import scrapy


class BaiduSpider(scrapy.Spider):
    name = "baidu"  # 爬⾍的名称
    
    # 爬⾍的域名范围,请求的链接中都需要包含这个域名,如果有新的域名可以添加到列表中
    allowed_domains = ["www.baidu.com"]
    
    # 起始获取的链接,⽹址会⾃动进⾏补全,但是可能补全不对,我们需要进⾏修改
    start_urls = ["https://www.baidu.com"]

    def parse(self, response):
        pass  # ⽤于解析数据

运行爬虫

scrapy crawl baidu  baidu:执⾏的爬⾍程序的名字

可以通过创建文件来启动,例如start.py⽂件执⾏爬⾍项⽬:

from scrapy import cmdline
cmdline.execute("scrapy crawl baidu".split())  #执⾏的命令是⼀个列表,这⾥⽤split进⾏分割
#或者cmdline.execute(["scrapy","crawl","baidu"])