爬虫框架Scrapy

爬虫框架Scrapy

一.scrapy概述

Scrapy使用了Twisted异步网络框架来处理网络通信,该网络框架可以加快下载速度,并且包含了各种中间件接口,可以灵活地完成各种需求

Scrapy功能强大,它支持自定义ItemPipline数据管道;支持在Spider中指定(网页域范围)以及对应的Rule(爬取规则);支持XPathDOM的解析等.而且Scrapy还有自己的shell,可以方便地调试爬虫项目和查看爬虫运行结果

二.scrapy框架架构

from IPython.display import Image
Image("./data/10_1.png",width=500)

output_5_0.png

Scrapy框架主要包含了以下组件:

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

三.scrapy框架的运作流程

scrapy的运作流程由引擎控制,其控制如下:

  1. 引擎向Spiders请求第一个要爬取的URL
  2. 引擎从Spiders中获取到第一个要爬取的URL,封装成Request并交给调度器
  3. 引擎向调度器请求下一个要爬取的Request
  4. 调度器返回下一个要爬取的Request给引擎,引擎将Request通过下载中间件转发给下载器
  5. 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件发送给引擎
  6. 引擎从下载器中接收到Response并通过Spider中间件发送给Spider处理
  7. Spider处理Response并返回爬取到的Item及新的Request给引擎
  8. 引擎将爬取到的Item给Item Pipeline,将Request给调度器
  9. 开始重复第2步,直到调度器中没有更多的Request

四.scrapy框架的操作

使用scrapy框架制作爬虫一般需要以下4个步骤:

  1. 新建项目(scrapy startproject xx):创建一个新的爬虫项目
  2. 明确目标(编写items.py):明确想要爬取的目标
  3. 制作爬虫(spiders/xxspider.py):制作爬虫,开始爬取网页
  4. 存储数据(piplines.py):存储爬取内容(一般通过管道进行)

1.新建scrapy项目

scrapy startproject 项目名称
from IPython.display import Image
Image("./data/10_2.png",width=500)

output_13_0.png

项目目录

Image("./data/10_3.png",width=500)

output_15_0.png

各个文件的作用:

  1. scrapy.cfg:配置文件,用于存储项目的配置信息
  2. myspider:项目的python模块
  3. items.py:实体文件,用于定义项目的目标实体
  4. middlewares.py:中间件文件,用于定义Spider中间件
  5. pipelines.py:管道文件,用于定义项目使用的管道
  6. settings.py:设置文件,用于存储项目的设置信息
  7. spiders:存储爬虫代码的目录

2.明确爬取目标

页面的网址:http://www.itcast.cn/channel/teacher.shtml;爬取讲师的姓名,级别和个人信息

scrapy框架提供了基类scrapy.Item用来表示实体数据.scrapy使用Item实体来表示要爬取的数据.Item定义结构化数据字段,类似于python中的字典dict

Image("./data/10_4.png",width=500)

output_20_0.png

import scrapy

class MyspiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()

     # 姓名
    name=scrapy.Field()
    # 级别
    title=scrapy.Field()
    # 个人信息
    info=scrapy.Field()

3.制作Spiders

制作Spiders分为3个步骤实现,分别是创建爬虫,运行爬虫以爬取网页和提取数据

创建爬虫

scrapy genspider 爬虫名称 "爬取域"
Image(filename="./data/10_5.png",width=500)

output_26_0.png

Image(filename="./data/10_6.png",width=500)

output_27_0.png

首先修改start_urls的值为爬取的第一个URL,然后修改parse()方法,将响应信息转换成文本,保存在teacher.html

Image(filename="./data/10_7.png",width=500)

output_29_0.png

运行爬虫,爬取网页

命令格式:scrapy crawl 爬虫名称;此命令在爬虫名称.py所在的目录下执行

scrapy crawl itcast

提取数据

重新编辑parse()方法,完整itcast.py文件如下

# -*- coding: utf-8 -*-
import scrapy
from myspider.items import MyspiderItem

class ItcastSpider(scrapy.Spider):
    name = 'itcast'
    allowed_domains = ['itcast.cn']
    start_urls = ('http://www.itcast.cn/channel/teacher.shtml',)

    def parse(self, response):

        """
        with open("teacher.html","w",encoding="utf-8") as file:
            file.write(response.text)
        pass
        """
        items=[]
        for each in response.xpath("//div[@class='li_txt']"):
            item=MyspiderItem()

            # 使用extract()方法返回的都是Unicode字符串
            name=each.xpath("h3/text()").extract()
            title=each.xpath("h4/text()").extract()
            info=each.xpath("p/text()").extract()

            # xpath返回的是包含一个元素的列表
            item["name"]=name[0]
            item["title"]=title[0]
            item["info"]=info[0]

            items.append(item)

        return items

重新执行:scrapy crawl itcast

注意:使用文件内容来运行scrapy爬虫.打开项目,在项目中新建一个start.py文件,内容如下

from scrapy import cmdline

cmdline.execute("scrapy crawl itcast".split())

然后执行start.py文件即可

4.存储数据

# 输出JSON格式,默认为Unicode编码
scrapy crawl itcast -o teachers.json
# 输出JSON Lines格式,默认为Unicode编码
scrapy crawl itcast -o teachers.jsonl
# 输出CSV格式
scrapy crawl itcast -o teachers.csv
# 输出XML格式
scrapy crawl itcast -o teachers.xml
Image(filename="./data/10_8.png",width=500)

output_40_0.png

原文地址:https://www.cnblogs.com/LQ6H/p/12940566.html