Scrapy 框架基本了解以及Spiders爬虫

Scrapy 框架基本了解以及Spiders爬虫,首先我们先了解下Scrapy 框架基本原理,然后我们用一个简单的案例来介绍Scrapy的使用。

Scrapy 框架基本了解:
1、Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。
2、框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。
3、Scrapy 使用了 Twisted'twɪstɪd异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。
4、Scrapy框架流程图

Scrapy 框架基本了解以及Spiders爬虫_第1张图片
scrapy_all.png

① 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中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)。

Scrapy 框架Spiders步骤:
1、创建一个Scrapy项目scrapy startproject mySpider
2、定义提取的结构化数据(Item)
3、编写爬取网站的 Spider 并提取出结构化数据(Item)
scrapy genspider example example.com

scrapy.cfg :项目的配置文件
mySpider/ :项目的Python模块,将会从这里引用代码
mySpider/items.py :项目的目标文件
mySpider/pipelines.py :项目的管道文件
mySpider/settings.py :项目的设置文件
mySpider/spiders/ :存储爬虫代码目录

4、编写 Item Pipelines 来存储提取到的Item(即结构化数据)

在mySpider目录下执行:scrapy crawl itcast

保存数据:
scrapy保存信息的最简单的方法主要有四种,-o 输出指定格式的文件,命令如下:

# json格式,默认为Unicode编码
scrapy crawl itcast -o teachers.json
# json lines格式,默认为Unicode编码
scrapy crawl itcast -o teachers.jsonl
# csv 逗号表达式,可用Excel打开
scrapy crawl itcast -o teachers.csv
# xml格式
scrapy crawl itcast -o teachers.xml

5、Spiders爬取某个培训结构老师的信息
items.py

模型类

import scrapy
# Item 定义结构化数据字段,用来保存爬取到的数据
class TeacherinfoItem(scrapy.Item):
    # 获取名字
    name = scrapy.Field()
    # 职称
    position = scrapy.Field()
    # 个人信息
    info = scrapy.Field()

myteacher.py

爬虫文件

# -*- coding: utf-8 -*-
import scrapy
from teacherInfo.items import TeacherinfoItem
class MyteacherSpider(scrapy.Spider):
    name = 'myteacher'
    allowed_domains = ['itcast.cn']
    # start_urls = ("http://www.itcast.cn/channel/teacher.shtml",) 元组也可以
    start_urls = ['http://www.itcast.cn/channel/teacher.shtml#ac',
                  'http://www.itcast.cn/channel/teacher.shtml#acloud',
                  'http://www.itcast.cn/channel/teacher.shtml#adesign',
                  'http://www.itcast.cn/channel/teacher.shtml#ads',
                  'http://www.itcast.cn/channel/teacher.shtml#ajavaee',
                  'http://www.itcast.cn/channel/teacher.shtml#anetmarket',
                  'http://www.itcast.cn/channel/teacher.shtml#aphp',
                  'http://www.itcast.cn/channel/teacher.shtml#apm',
                  'http://www.itcast.cn/channel/teacher.shtml#apython',
                  'http://www.itcast.cn/channel/teacher.shtml#astack',
                  'http://www.itcast.cn/channel/teacher.shtml#atest',
                  'http://www.itcast.cn/channel/teacher.shtml#aui',
                  'http://www.itcast.cn/channel/teacher.shtml#auijp',
                  'http://www.itcast.cn/channel/teacher.shtml#aweb']
    # 爬虫的约束区域
    def parse(self, response):
        # 存放老师信息的集合
        items = []
        print(response.body)
        for each in response.xpath("//div[@class='li_txt']"):
            # 将我们得到的数据封装到一个 `ItcastItem` 对象
            item = TeacherinfoItem()
            # extract()方法返回的都是unicode字符串
            name = each.xpath("h3/text()").extract()
            position = each.xpath("h4/text()").extract()
            info = each.xpath("p/text()").extract()
            # xpath返回的是包含一个元素的列表
            item['name'] = name[0]
            item['position'] = position[0]
            item['info'] = info[0]
            items.append(item)
            yield item
        # 直接返回最后数据
        # return items

pipelines.py

管道

import json
import codecs
class TeacherinfoPipeline(object):
    def __init__(self):
        self.filename = codecs.open('teacher.json','wb','utf-8')
    def process_item(self, item, spider):
        print(item)
        html = json.dumps(dict(item),ensure_ascii=False)
        self.filename.write(html + '\n')
        return item

    def open_spider(self, spider):
        pass
        # self.filename.close()

settings.py

基本设置

BOT_NAME = 'teacherInfo'
SPIDER_MODULES = ['teacherInfo.spiders']
NEWSPIDER_MODULE = 'teacherInfo.spiders'
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:56.0)'
ROBOTSTXT_OBEY = True
SPIDER_MIDDLEWARES = {
   'teacherInfo.middlewares.TeacherinfoSpiderMiddleware': 543,
}
ITEM_PIPELINES = {
   'teacherInfo.pipelines.TeacherinfoPipeline': 300,
}

begin.py

运行和调试文件

from scrapy import cmdline
cmdline.execute('scrapy crawl myteacher'.split())

配置begin.py文件请移步PyCharm运行和调试Scrapy
了解这么多,就可以使用Scrapy框架爬虫了,一起学习。

你可能感兴趣的:(Scrapy 框架基本了解以及Spiders爬虫)