python | 爬虫笔记 - (八)Scrapy框架基础

一、简介

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

1.1 安装

pip3 install Scrapy

1.2 框架介绍

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

1.3 部分详解

1.3.1 spider
· 定义爬取网站的动作
· 分析爬取下来的网页
 
爬取循环过程如下:
初始的url初始化request-> Response作为参数返回回调函数 -> 回调函数分析网页内容 1)返回字典或item,可用pipelin处理 2)返回request 回调函数循环请求,直到生成item
 
1.3.2 Downloader Middleware
Request和Response之间的处理模块,可以完成修改 User-Agent、 处理重定向 、设置代理、失败重试、 设置 Cookies等功能。此模块非常重要
核心方法
process_request(request, spider)
process_response(request, response, spider)
process_exception(request, exception, spider)
 
1.3.3 Spider Middleware
spider处理机制的子框架
核心方法:
process_spider_input(response, spider)
process_spider_output(response, result, spider)
process_spider_exception(response, exception, spider)
process_start_requests(start_requests, spider)
 
1.3.4 Item Pipeline
open_spider(spider)
close_spider(spider)
from_crawler(cls, crawler)

1.4 selector

1)直接使用
from scrapy import selector
 
body = '...'
selector = Selector(text=body)
title = selector.xpath('//title/text()').extract_first() #提取title标签里的内容
print(title)

构建时传入text参数,生成selector对象,通过xpath(), css()等方法提取

 
2)shell文件
scrapy shell 网址
之后在shell中可以用不同选择器进行操作。selector主要操作Response这个变量来进行解析
· result结果得到selectorlist类型列表变量;
· 可使用xpath()、css() 和正则表达式的方法选择
· extract()/ extract_first() 获取内容
e.g.
result = response.selector.xpath('//a')
result
result.xpath('.//a[@href="image1.html"]/text()')extract_first() #xpath
result.css('a[@href="image1.html"]::text]).extract_first() #css
#备注:css中获取文本和属性需要用::text和::attr()的写法

二、上手项目

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

2.1 创建项目

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

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

python | 爬虫笔记 - (八)Scrapy框架基础_第1张图片

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()
字段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方法执行数据插入操作
执行后可在数据库中查看对应表格
 
本节对应代码请见:
参考: https://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html

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

(零)学习路线

(一)开发环境配置

(二)爬虫基础

(三)基本库使用

(四)解析库使用

(五)数据存储

(六)Ajax数据爬取

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

持续更新...

 

转载于:https://www.cnblogs.com/geo-will/p/9727020.html

你可能感兴趣的:(python | 爬虫笔记 - (八)Scrapy框架基础)