更高级的爬虫,Scrapy框架的使用

前言

之前博主分享了两篇使用requests库进行网络资源的爬取,那么有没有一个通用的更加强大的爬虫方案呢?答案当然是有的,下面博主就为大家介绍一下Scrapy框架(也是业内运用最为广泛的框架)的基本使用。

Scrapy简介

  • Scrapy使用纯Python实现,是一个为了爬取网站数据,提取结构性数据而编写的应用框架,其用途非常广泛,可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
  • 通常我们只需要定制开发几个模块就可以很简单的通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。
  • Scrapy也支持多线程爬取,并且用户可以自由选择是否遵循robots协议。
  • Scrapy 使用了Twisted异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。

Scrapy架构

在这里插入图片描述
Scrapy Engine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。
Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
Downloader Middlewares(下载中间件):一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件):一个可以自定扩展和操作引擎和Spider中间通信的功能组件。


有些朋友可能没有安装Scrapy,请移步Scrapy中文官方文档

第一个Scrapy项目

下面我们以爬取豆瓣电影排行为例。
在开始爬取之前,我们首先要创建一个scrapy项目,在命令行输入以下命令即可创建。

scrapy startproject padouban

此命令是创建名为padouban的Scrapy项目。(前面的scrapy startproject)为固定格式。
创建成功后目录结构如下:
在这里插入图片描述
然后我们需要cd到spiders目录下,输入以下命令,创建一个爬虫

scrapy genspider douban movie.douban.com

scrapy genspider为固定格式,douban为爬虫文件名,movie.douban.com为我们所爬取的网站的域名。
执行命令后发现spiders目录下多了一个douban.py的文件,我们便可以开始编写我们的爬虫了。

网页分析

来到豆瓣剧情排行榜页面,我们发现随着向下滑动的过程中电影不断增加,这很可能是浏览器发送了AJAX请求,分析network,选择XHR,我们发现了携带的电影信息。
在这里插入图片描述
知道了信息来源,我们就可以开始编写爬虫文件了。

编写程序

编写scrapy项目,我们一般需要编写四个文件。
首先编写items.py,这个文件确定的我们要爬取哪些信息。

import scrapy


class PadoubanItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    types = scrapy.Field()
    regions = scrapy.Field()
    movie_url = scrapy.Field()
    image_url = scrapy.Field()
    actors = scrapy.Field()
    release_date = scrapy.Field()

修改settings.py文件

USER_AGENT = ""#这里需要填写用户代理
DOWNLOAD_DELAY = 0.5#选择请求间隔时间,这里选择0.5秒
#ROBOTSTXT_OBEY = True #是否遵循robots协议,我们需要注释掉。
ITEM_PIPELINES = {
    'padouban.pipelines.PadoubanPipeline': 300,
} #启用管道,我们需要取消注释。

然后编写douban.py文件

import json
import scrapy
from padouban.items import PadoubanItem

class DoubanSpider(scrapy.Spider):
    name = 'douban'
    #允许爬取的域
    allowed_domains = ['movie.douban.com']
    #开始爬取的第一个url
    start_urls = ['https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=0&limit=20']
    offset = 0 
    #请求到资源后进入此函数进行解析。
    def parse(self, response):
        #解析拿到的json,将其转变为字典
        list_data = json.loads(response.text)
        #创建Item类,保持提取的字段
        item = PadoubanItem()
        if not list_data:
            return
        #提取相应的字段
        for i in list_data:
            item['title'] = i.get("title")
            item['types'] = i.get("types")
            item['regions'] = i.get("regions")
            item['movie_url'] = i.get("url")
            item['image_url'] = i.get("cover_url")
            item['actors'] = i.get("actors")
            item['release_date'] = i.get("release_date")
            #此处会把item扔给管道处理,然后继续执行,不会结束函数。
            yield item
        self.offset = 20 + self.offset
        url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start={}&limit=20".format(self.offset)
        #继续请求
        yield scrapy.Request(url=url, callback=self.parse)

最后编写管道文件(piplines.py)

import json

class PadoubanPipeline(object):
    #开始爬取时执行此方法
    def open_spider(self, spider):
        #打开json文件,进行写操作
        self.file = open("douban.json", "w")
    #每当yield item后执行此方法
    def process_item(self, item, spider):
        #将字典转换为json,并写入文件
        content = json.dumps(dict(item), ensure_ascii = False) + '\n'
        self.file.write(content)
        return item
    #结束爬取时执行此方法
    def close_spider(self, spider):
        #关闭json文件
        self.file.close()

程序完成后,我们只需要命令行进入spiders目录下,然后执行命令:

scrapy crawl douban

就可以执行爬虫了。
爬取部分结果如下:
在这里插入图片描述
恭喜大家学习完了Scrapy框架的基本使用,希望对大家有所帮助,今天的分享就到这里了,祝大家学习进步!

猜你喜欢

转载自blog.csdn.net/weixin_42494845/article/details/105187052