Python爬虫进阶:使用Scrapy库进行数据提取和处理

在我们的初级教程中,我们介绍了如何使用Scrapy创建和运行一个简单的爬虫。在这篇文章中,我们将深入了解Scrapy的强大功能,学习如何使用Scrapy提取和处理数据。

一、数据提取:Selectors和Item

在Scrapy中,提取数据主要通过Selectors来完成。Selectors基于XPath或CSS表达式的查询语言来选取HTML文档中的元素。你可以在你的爬虫中使用response对象的xpath或css方法来创建一个Selector对象。

例如,我们可以修改我们的QuotesSpider爬虫,使用Selectors来提取每个引用的文本和作者:

python 复制代码
import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"

    start_urls = [
        'http://quotes.toscrape.com/page/1/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            text = quote.css('span.text::text').get()
            author = quote.css('span small::text').get()
            print(f'Text: {text}, Author: {author}')

此外,Scrapy还提供了Item类,可以定义你想要收集的数据结构。Item类非常适合收集结构化数据,如我们从quotes.toscrape.com中获取的引用:

python 复制代码
import scrapy

class QuoteItem(scrapy.Item):
    text = scrapy.Field()
    author = scrapy.Field()

然后我们可以修改QuotesSpider爬虫,使其生成和收集QuoteItem对象:

python 复制代码
class QuotesSpider(scrapy.Spider):
    name = "quotes"

    start_urls = [
        'http://quotes.toscrape.com/page/1/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            item = QuoteItem()
            item['text'] = quote.css('span.text::text').get()
            item['author'] = quote.css('span small::text').get()
            yield item

二、数据处理:Pipelines

Scrapy使用数据管道(pipelines)来处理爬虫从网页中抓取的Item。当爬虫生成一个Item,它将被发送到Item Pipeline进行处理。

Item Pipeline是一些按照执行顺序排列的类,每个类都是一个数据处理单元。每个Item Pipeline组件都是一个Python类,必须实现一个process_item方法。这个方法必须返回一个Item对象,或者抛出DropItem异常,被丢弃的item将不会被之后的pipeline组件所处理。

例如,我们可以添加一个Pipeline,将收集的引用保存到JSON文件中:

python 复制代码
import json

class JsonWriterPipeline(object):

    def open_spider(self, spider):
        self.file = open('quotes.jl', 'w')

    def close_spider(self, spider):
        self.file.close()

    def process_item(self, item, spider):
        line = json.dumps(dict(item)) + "\n"
        self.file.write(line)
        return item

然后你需要在项目的设置文件(settings.py)中启用你的Pipeline:

python 复制代码
ITEM_PIPELINES = {
   'tutorial.pipelines.JsonWriterPipeline': 1,
}

在这篇文章中,我们更深入地探讨了Scrapy的功能,包括如何使用Selectors和Item提取数据,如何使用Pipelines处理数据。在下一篇文章中,我们将学习如何使用Scrapy处理更复杂的情况,如登录、cookies、以及如何避免爬虫被网站识别和封锁等问题。

相关推荐
专注仿真2 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
外收内放2 小时前
Python基础语法练习题(75)
开发语言·python·学习
黑十3 小时前
PyTorch 报 “no CUDA GPUs are available“ 怎么办?3 步排查
服务器·网络·人工智能·pytorch·python
threelab4 小时前
开源图片去水印代码
python
taller_20005 小时前
【012】数据类型入门: Excel 数据到 Python 值的转换
python·excel·pie·py
淡漠的蓝精灵5 小时前
web.py:一个简单到极致的 Python Web 框架
开发语言·前端·python·其他
起个名字费劲死了6 小时前
Halcon学习一:骰子识别
前端·python·学习
eric-sjq7 小时前
小思框架 · 30M 级长上下文新架构对比技术报告
人工智能·python·深度学习·语言模型
reasonsummer8 小时前
【办公类-04-05】20261030整理手机照片(华为手机助手导出照片到日期文件夹+批量添加四级文件夹+手动转移照片更名+更改三级文件夹合并汉字名称)
python·智能手机
BD_Marathon9 小时前
【Python】初识迭代器
python