Scrapy入门:简单爬虫项目梳理整个框架操作流程

1. 准备工作

只需要安装 Scrapy 库即可,我实用的是 Pycharm 软件,安装的话只需要在菜单setting/project/project interpreter中添加第三包,搜索 scrapy 即可进行安装。
在这里插入图片描述
或简单粗暴:

pip install scrapy

2. 准备工作

2.1 创建项目

创建一个 Scrapy 项目,项目文件可以直接实用 scrapy 命令生成:

scrapy startproject 文件名称

这个命令在cmd命令中执行,如果提示权限问题,可以加 sudo 运行该命令。该命令可以直接执行,不管在那个路径下,但是我还是建议放在非系统盘下的指定常用的文件下,便于日后的分类和管理。文件的结构如下:
在这里插入图片描述

2.2 简单解释所创文件的结构

  1. scrapy_test (项目的名字)
  2. items.py (Item的定义,定义爬取的数据结构)
  3. middlewares.py (Middlewares的定义,定义爬取时的中间件)
  4. pipelines.py (Pipelines的定义,定义数据管道)
  5. settings.py (配置文件)
  6. spiders (放置 Spider 的文件夹,里面存放了 Spider 的实例)

3. 创建 Spider

Spider 是自己定义的类,Scrapy 用它来从网页里抓取内容,并解析抓取的结果。这个类提供的Spider类得继承scrapy.Spider,还要定义Spider的名称和起始的请求,以及怎样处理爬取后的结果的方法。

使用命令创建(小技巧,直接用Pycharm打开刚才所创建的项目,在下方的Terminal处执行命令):

scrapy genspider Spider名称 网站域名
# scrapy genspider quotes.toscrape.com

执行后spiders文件夹下多了一个quotes.py,他就是刚刚创建的Spider,内容如下:

import scrapy

class QuotesSpider(scrapy.Spider):
    # 项目名 唯一 用来区分不同的 Spider
    name = 'quotes'
    # 允许爬取的域名 如果初始或后续的请求链接不是这个域名下的,则请求链接会被过滤掉
    allowed_domains = ['quotes.toscrape.com']
    # 包含了 Spider 在启动时爬取的url列表,初始请求是由它来定的
    start_urls = ['http://quotes.toscrape.com/']

    # 被调用时 start_url 里面的链接构成的请求完成下载执行后,返回的响应就会被作为唯一的参数传递给这个函数。
    # 该方法负责解析返回的响应,提取数据或者进一步生成要处理的请求
    def parse(self, response):
    	pass

里面所涉及的变量都有注释解释。

4. 分析目标网页和你所要爬取的内容

该网页用的是书中给出的网址

url = 'http://quotes.toscrape.com/'

该网页没有任何的反爬限制,即使你不更换请求头也可以进行源码的爬取,如下是网页的源码:
在这里插入图片描述
在这里插入图片描述
如源码所示,所要爬取的信息都封装在 class=“quote” 的 span 标签中,看其中具体的,我们所要提取便是 text,author,tag三个信息,源码过于简单,不再多的叙述…

5. 创建 Item

Item是保存爬取数据的容器,它的使用方法和字典类似。不过相比字典,Item多了额外的保护机制,可以避免拼写错误或者定义字段错误。

创建Item需要继承 scrapy.Item 类,并且定义类型为 scrapy.Field 的字段。由上分析源码得知爬取的内容有 text、author、tags。

定义Item:
在这里插入图片描述

6. 使用Item,重写Spider中parse()方法

在这里插入图片描述

7. 构造请求,使用回调函数实现连续抓取

上面的操作只能实现对初始请求队列的抓取,那么下一页的内容该如何抓取呢?分析网页源码:
在这里插入图片描述
可以看到,在网页的最下端有 Next 按钮,而它的源码便是下一页的网页链接,便通过这个按钮来构造下一个请求。

构造请求时要用到 scrapy.Request 。所需要传递两个参数时 url 和 callback

  1. url:请求链接
  2. callback:回调函数。回调函数 指定了该回调函数的请求完成之后,获取到响应后,引擎会将该响应作为参数传递给这个回调函数。其进行解析生成下一个请求

由于下一页的网页结构和第一页的相同,便可以接着使用 parse()函数进行解析,在 parse() 方法后追加如下代码便可实现回调函数,爬虫的循环,直至把该网站所有网页爬取完:

next = response.xpath('//li[@class="next"]/a/@href').extract_first()
        url = response.urljoin(next)
        # 两个参数 url 和 callback
        # url : 请求链接
        # callback : 回调函数 指定了该回调函数的请求完成之后,获取到响应后,引擎会将该响应作为参数传递给这个回调函数。其进行解析生成下一个请求
        yield scrapy.Request(url=url,callback=self.parse)

8. 最终的 Spider

在这里插入图片描述

9. 运行整体架构

在下方的Terminal处执行命令:

scrapy crawl quotes

接下来就可看到运行的结果了(过长,只放两张截图):
在这里插入图片描述
在这里插入图片描述

10. 保存到文件

执行命令:

scrapy crawl -o quotes.json
# 保存为 json 文件格式
'''
更多的文件格式
				quotes.jsonline
				quotes.csv
				quotes.xml
				quotes.pickle
				quotes.marshal
				ftp://user:[email protected]/path/to/quotes.csv
'''

11. 使用 Item Pipeline 进行数据的清洗

当然要将数据保存如数据库当中也得在这个文件中进行方法的重写。

'''
Item Pipeline 项目管道。当 Spider 中的Item对象生成后,会被自动送到 Item Pipeline 中进行处理
其作用:清理 HTML 数据;
        验证爬取数据,检查爬取字段;
        查重并丢弃重复的结果;
        将爬取的结果保存到数据库。
实现 process_item() 方法,两个参数 item 和 spider (spider 实例)
'''

在 pipeline.py 中进行方法的重写:
在这里插入图片描述

以上就是Scrapy框架,从项目的创建到数据的爬取清洗的整个流程。

继续努力,加油!

猜你喜欢

转载自blog.csdn.net/zc666ying/article/details/106557228
今日推荐