一、简介
Scrapy是一个基于Twisted 的异步处理框架,是针对爬虫过程中的网站数据爬取、结构性数据提取而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
1.1 安装
pip3 install Scrapy
1.2 框架介绍
组成:
Engine 引擎,处理整个系统的数据流处理、触发事务
Item 项目,定义爬取结果的数据结构
Scheduler 调度器
Downloader 下载器
Spider 定义爬取逻辑和网页解析规则
Item Pipeline 项目管道,清洗、验证和存储数据
Downloader Middlewares 下载器中间件
Spider Middlewares 蜘蛛中间件
二、上手项目
流程框架:抓取第一页-获取内容和下一页连接-翻页爬取-保存爬取结果
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 查看本文章
持续更新...