当前位置:   article > 正文

干货!一份详实的 Scrapy 爬虫教程,值得收藏!

python scrapy教程

30cc1c639b207c9807b72991cf911395.png

大家好,我是菜鸟哥!

之前分享了很多 requestsselenium 的 Python 爬虫文章,本文将从原理到实战带领大家入门另一个强大的框架 Scrapy。如果对Scrapy感兴趣的话,不妨跟随本文动手做一遍!

1a6a57beab52cca6c3ae555d021397eb.png

一、Scrapy框架简介

Scrapy是:由Python语言开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据,只需要实现少量的代码,就能够快速的抓取。

二、运行原理

Scrapy框架的运行原理看下面一张图就够了(事实上原理是比较复杂的,也不是三言两语能够说清楚的,因此感兴趣的读者可以进一步阅读更多的相关文章来了解,本文不做过多讲解e087e408167d7f91e1e43f5b4c158285.png

Scrapy主要包括了以下组件:

  • 引擎(Scrapy Engine)

  • Item 项目

  • 调度器(Scheduler)

  • 下载器(Downloader)

  • 爬虫(Spiders)

  • 项目管道(Pipeline)

  • 下载器中间件(Downloader Middlewares)

  • 爬虫中间件(Spider Middlewares)

  • 调度中间件(Scheduler Middewares)

三. 入门

3.1安装

第一种:在命令行模式下使用pip命令即可安装:

$ pip install scrapy

第二种:首先下载,然后再安装:

  1. $ pip download scrapy -d ./
  2. # 通过指定国内镜像源下载 
  3. $pip download  -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy -d ./

进入下载目录后执行下面命令安装:

$ pip install Scrapy-1.5.0-py2.py3-none-any.whl

3.2使用

使用大概分为下面四步 1 创建一个scrapy项目

scrapy startproject mySpider

2 生成一个爬虫

scrapy genspider demo "demo.cn"

3 提取数据

完善spider 使用xpath等

4 保存数据

pipeline中保存数据
3.3 程序运行

在命令中运行爬虫

scrapy crawl qb     # qb爬虫的名字

在pycharm中运行爬虫

  1. from scrapy import cmdline
  2. cmdline.execute("scrapy crawl qb".split())

四、基本步骤

Scrapy 爬虫框架的具体使用步骤如下:

  1. 选择目标网站

  2. 定义要抓取的数据(通过Scrapy Items来完成的)

  3. 编写提取数据的spider

  4. 执行spider,获取数据

  5. 数据存储

五. 目录文件说明

当我们创建了一个scrapy项目后,继续创建了一个spider,目录结构是这样的:

9b1153e0e9d4abe25b0ffe853a28bd17.png

下面来简单介绍一下各个主要文件的作用:

scrapy.cfg :项目的配置文件

mySpider/ :项目的Python模块,将会从这里引用代码

mySpider/items.py :项目的目标文件

mySpider/pipelines.py :项目的管道文件

mySpider/settings.py :项目的设置文件

mySpider/spiders/ :存储爬虫代码目录

5.1 scrapy.cfg文件

项目配置文件。这个是文件的内容:

  1. # Automatically created by: scrapy startproject
  2. #
  3. # For more information about the [deploy] section see:
  4. # https://scrapyd.readthedocs.io/en/latest/deploy.html
  5. [settings]
  6. default = mySpider.settings
  7. [deploy]
  8. #url = http://localhost:6800/
  9. project = mySpider

5.2 mySpider**/**

项目的Python模块,将会从这里引用代码

5.3 mySpider/items.py

项目的目标文件

  1. # Define here the models for your scraped items
  2. #
  3. # See documentation in:
  4. # https://docs.scrapy.org/en/latest/topics/items.html
  5. import scrapy
  6. class MyspiderItem(scrapy.Item):
  7.     # define the fields for your item here like:
  8.     # name = scrapy.Field()
  9.     pass

定义scrapy items的模块,示例: name = scrapy.Field()

5.4 mySpider/pipelines.py

项目的管道文件

  1. # Define your item pipelines here
  2. #
  3. # Don't forget to add your pipeline to the ITEM_PIPELINES setting
  4. # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
  5. # useful for handling different item types with a single interface
  6. from itemadapter import ItemAdapter
  7. class MyspiderPipeline:
  8.     def process_item(self, item, spider):
  9.         return item

这个文件也就是我们说的管道,当Item在Spider中被收集之后,它将会被传递到Item Pipeline(管道),这些Item Pipeline组件按定义的顺序处理Item。每个Item Pipeline都是实现了简单方法的Python类,比如决定此Item是丢弃而存储。以下是item pipeline的一些典型应用:

  • 验证爬取的数据(检查item包含某些字段,比如说name字段)

  • 查重(并丢弃)

  • 将爬取结果保存到文件或者数据库中

5.5 mySpider/settings.py

项目的设置文件

  1. # Scrapy settings for mySpider project
  2. ...
  3. BOT_NAME = 'mySpider' # scrapy项目名
  4. SPIDER_MODULES = ['mySpider.spiders']
  5. NEWSPIDER_MODULE = 'mySpider.spiders'
  6. .......
  7. # Obey robots.txt rules
  8. ROBOTSTXT_OBEY = False # 是否遵守协议,一般给位false,但是创建完项目是是True,我们把它改为False
  9. # Configure maximum concurrent requests performed by Scrapy (default16)
  10. #CONCURRENT_REQUESTS = 32 # 最大并发量 默认16
  11. ......
  12. #DOWNLOAD_DELAY = 3 # 下载延迟 3
  13. # Override the default request headers: # 请求报头,我们打开
  14. DEFAULT_REQUEST_HEADERS = {
  15.   'Accept''text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  16.   'Accept-Language''en',
  17. }
  18. # 爬虫中间件
  19. #SPIDER_MIDDLEWARES = {
  20. #    'mySpider.middlewares.MyspiderSpiderMiddleware'543,
  21. #}
  22. # 下载中间件
  23. #DOWNLOADER_MIDDLEWARES = {
  24. #    'mySpider.middlewares.MyspiderDownloaderMiddleware'543,
  25. #}
  26. ......
  27. # Configure item pipelines
  28. # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
  29. #ITEM_PIPELINES = {
  30. #    'mySpider.pipelines.MyspiderPipeline'300, # 管道
  31. #}
  32. .......

省略号省略代码,一般重要点,给了注释

6.mySpider/spiders/ :存储爬虫代码目录
  1. import scrapy
  2. class DbSpider(scrapy.Spider):
  3.     name = 'db'
  4.     allowed_domains = ['douban.com'] # 可以修改
  5.     start_urls = ['http://douban.com/'] # 开始的url也可以修改
  6.     def parse(self, response):
  7.         # pass

六. Scrapy shell

Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据,但是一般使用的不多。感兴趣的查看官方文档:

官方文档

http://scrapy-chs.readthedocs.io/zh_CN/latest/topics/shell.html

Scrapy Shell根据下载的页面会自动创建一些方便使用的对象,例如 Response 对象,以及 Selector 对象 (对HTML及XML内容)

  • 当shell载入后,将得到一个包含response数据的本地 response 变量,输入 response.body将输出response的包体,输出 response.headers 可以看到response的包头。

  • 输入 response.selector 时, 将获取到一个response 初始化的类 Selector 的对象,此时可以通过使用 response.selector.xpath()response.selector.css() 来对 response 进行查询。

  • Scrapy也提供了一些快捷方式, 例如 response.xpath()response.css()同样可以生效(如之前的案例)。

Selectors选择器

Scrapy Selectors 内置 XPathCSS Selector 表达式机制

Selector有四个基本的方法,最常用的还是xpath:

  • xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表

  • extract(): 序列化该节点为字符串并返回list

  • css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表,语法同 BeautifulSoup4

  • re(): 根据传入的正则表达式对数据进行提取,返回字符串list列表

七、案例实战

本节,我将使用Scrapy爬取站酷数据作为示例

6c1ac1b1606549ade872c039a9a81a24.png

7.1 案例说明

既然已经初步了解了scrapy的工作流程以及原理,我们来做一个入门的小案例,爬取站酷首页推荐的item信息。如下图所示,一个小方框就是一个item信息。我们要提取每一个item的六个组成部分:

  1. imgLink(封面图片链接);

  2. title(标题);

  3. types(类型);

  4. vistor(人气);

  5. comment(评论数);

  6. likes(推荐人数)510d000c23603007bfdfecb35cac4e2a.png

然后只是一个页面的item,我们还要通过翻页实现批量数据采集。

7.2 文件配置

目录结构

在上一篇中我们说明了新建scrapy项目(zcool)spider项目(zc),这里不再赘述,然后得到我们的目录结构如下图所示:

430e6c11d7dc2f7dfba27fc730f36199.png
start.py文件

然后为了方便运行,在zcool目录下新建start文件。并进行初始化设置。

  1. from scrapy import cmdline
  2. cmdline.execute('scrapy crawl zc'.split())
settings.py文件

在这个文件里我们需要做几样设置

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/764236
推荐阅读