python | 爬虫笔记 - (八)Scrapy入门教程

一、简介

Scrapy是一个基于Twisted 的异步处理框架,是针对爬虫过程中的网站数据爬取、结构性数据提取而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

1.1 安装

pip3 install Scrapy

1.2 框架介绍

组成:
Engine 引擎,处理整个系统的数据流处理、触发事务
Item 项目,定义爬取结果的数据结构
Scheduler 调度器
Downloader 下载器
Spider 定义爬取逻辑和网页解析规则
Item Pipeline 项目管道,清洗、验证和存储数据
Downloader Middlewares 下载器中间件
Spider Middlewares 蜘蛛中间件

二、上手项目

内容:爬取 http://quotes.toscrape.com
流程框架:抓取第一页-获取内容和下一页连接-翻页爬取-保存爬取结果

2.1 创建项目

通过命令行来创建项目
scrapy startproject tutorial
创建目录如下

tutorial/
    scrapy.cfg
    tutorial/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...

2.2 编写一个Spider

Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 item 的方法。
 
为了创建一个Spider,必须继承 scrapy.Spider 类, 且定义以下三个属性:
  · name
  · start_urls
  · parse: 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。
scrapy genspider quotes quotes.toscrape.com

2.3 创建Item

Item 是保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。
在item中定义相应的字段。编辑 tutorial 目录中的 items.py 文件
import scrapy

class QuoteItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()

2.4 解析Response

parse()方法的参数 resposne 是 start_urls 里面的链接爬取后的结果 。 所以在 parse()方法中,我们可以直接对 response 变量包含的内容进行解析,比如浏览请求结果的网页源代码,或者进一步分析源代码内容,或者找出结果中的链接而得到下一个请求 。
 
分析网页结构
进入项目的根目录,执行下列命令启动spider:
scrapy crawl quotes

2.5 使用item

Item可以理解为一个字典,不过在声明的时候需要实例化。 然后依次用刚才解析的结果赋值 Item的每一个字段, 最后将 Item返回即可。
quotes = response.css('.quote')   #选择quote的区块
        for quote in quotes:
            item = QuoteItem()
            item['text'] = quote.css('.text::text').extract_first()
            item['author'] = quote.css('.author::text').extract_first()
            item['tags'] = quote.css('.tags .tag::text').extract()
    yield item
首页的所有内容被解析出来 ,并被赋值成了一个个 QuoteItem。
scrapy shell quotes.toscrape.com #可以在命令行交互

2.6 后续Request-多页抓取

找到next按钮,查看源代码,可以根据链接构建下一个请求。
通过递归调用,回调函数调用自己,实现翻页循环
next = response.css('.pager .next a::attr(href)').extract_first()
        url = response.urljoin(next)
        yield scrapy.Request(url=url, callback=self.parse) 

2.7 保存到文件

scrapy crawl quotes -o quotes.json #也可以保存成csv,xml等不同文件格式

2.8 使用Item Pipeline

通过item Pipeline可以实现更复杂的操作,比如将数据保存到MongoDB,或者筛选某些有用的item
Pipeline功能主要包括:
- 清理 HTML数据。
- 验证爬取数据,检查爬取字段
- 查重井丢弃重复内容。
- 将爬取结果保存到数据库。
 
定义一个类并实现process_item()方法
两个参数item和spider实例
from scrapy.exceptions import DropItem

class TextPipeline(object):
    def __init__(self):
        self.limit = 50

    def process_item(self, item, spider):
        if item['text']:
            if len(item['text']) > self.limit:
                item['text'] = item['text'][0:self.limit].rstrip() + '...'  #设置长度50截断字符串
            return item
        else:
            return DropItem('Missing Text')
处理后的item即可存入MongoDB,其中涉及另外几个方法
- from_crawler 类方法@class,通过crawler可以拿到全局配置的信息,在setting.py中。比如在其中设置MongoDB的名称和地址,然后通过这个方法获取
- openspider
- closespider
通过process_item方法执行数据插入操作
执行后可在数据库中查看对应表格
 
本节对应代码请见:

##本系列内容为《python3爬虫开发实战》学习笔记。本系列博客列表如下:

(零)学习路线

(一)开发环境配置

(二)爬虫基础

(三)基本库使用

(四)解析库使用

(五)数据存储

扫描二维码关注公众号,回复: 3416515 查看本文章

(六)Ajax数据爬取

(七)动态渲染页面爬取Selenium

持续更新...

猜你喜欢

转载自www.cnblogs.com/geo-will/p/9727020.html