欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-19 20:57:24
...

1. 准备工作

只需要安装 Scrapy 库即可,我实用的是 Pycharm 软件,安装的话只需要在菜单setting/project/project interpreter中添加第三包,搜索 scrapy 即可进行安装。
Scrapy入门:简单爬虫项目梳理整个框架操作流程
或简单粗暴:

pip install scrapy

2. 准备工作

2.1 创建项目

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

scrapy startproject 文件名称

这个命令在cmd命令中执行,如果提示权限问题,可以加 sudo 运行该命令。该命令可以直接执行,不管在那个路径下,但是我还是建议放在非系统盘下的指定常用的文件下,便于日后的分类和管理。文件的结构如下:
Scrapy入门:简单爬虫项目梳理整个框架操作流程

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/'

该网页没有任何的反爬限制,即使你不更换请求头也可以进行源码的爬取,如下是网页的源码:
Scrapy入门:简单爬虫项目梳理整个框架操作流程
Scrapy入门:简单爬虫项目梳理整个框架操作流程
如源码所示,所要爬取的信息都封装在 class=“quote” 的 span 标签中,看其中具体的,我们所要提取便是 text,author,tag三个信息,源码过于简单,不再多的叙述…

5. 创建 Item

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

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

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

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

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

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

上面的操作只能实现对初始请求队列的抓取,那么下一页的内容该如何抓取呢?分析网页源码:
Scrapy入门:简单爬虫项目梳理整个框架操作流程
可以看到,在网页的最下端有 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

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

9. 运行整体架构

在下方的Terminal处执行命令:

scrapy crawl quotes

接下来就可看到运行的结果了(过长,只放两张截图):
Scrapy入门:简单爬虫项目梳理整个框架操作流程
Scrapy入门:简单爬虫项目梳理整个框架操作流程

10. 保存到文件

执行命令:

scrapy crawl -o quotes.json
# 保存为 json 文件格式
'''
更多的文件格式
				quotes.jsonline
				quotes.csv
				quotes.xml
				quotes.pickle
				quotes.marshal
				ftp://user:aaa@qq.com/path/to/quotes.csv
'''

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

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

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

在 pipeline.py 中进行方法的重写:
Scrapy入门:简单爬虫项目梳理整个框架操作流程

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

继续努力,加油!