中国技术大牛,首次公开自己的Scrapy项目开发过程,否是新的趋势

中国技术大牛,首次公开自己的Scrapy项目开发过程,否是新的趋势

介绍:

这是我的Scrapy教程系列的第9篇文章,在本Scrapy教程中,我将讨论如何定义Scrapy项目,如何使用Scrapy项目,以及如何创建自定义项目管道以将Item的数据保存到DB中。如果您在阅读时有任何疑问,我希望您在阅读本文后有一个很好的理解,请在此留言,我会尽快回复。

您可以在本教程结束时获取此项目的源代码。

Scrapy Item VS Python Dict

在大多数抓取工作中,我们的目标是从网页中提取结构化数据,Python Dict确实可以用来返回抓取的数据,但是,很容易在字段名称中输入拼写错误或设置不一致的数据,这会造成一些灾难有很多蜘蛛的大型项目。如果您希望一个字段只接收字符串类型,那么没有好的解决方案。

为了解决这个问题,Scrapy提供了Scrapy Item课程。Item

实例是用于收集数据的简单容器,您可以将其视为Python dict的包装,但它具有比原生Python Dict更有用的功能。

如果您不熟悉Scrapy,可以在项目中使用Python Dict,但是,如果您的项目很大或者您在Scrapy方面有一些经验,请使用Scrapy Item来使您的项目保持一致。

如何定义Scrapy项目及其使用方法

每个Scrapy项目都调用了项目定义文件items.py,因此在此项目中,您需要编辑scrapy_spider/items.py

中国技术大牛,首次公开自己的Scrapy项目开发过程,否是新的趋势

现在让我们尝试在Scrapy Shell中使用此项,scrapy shell输入进入。

中国技术大牛,首次公开自己的Scrapy项目开发过程,否是新的趋势

从上面的代码中,您可以看到Scrapy项目和Python dict的使用之间没有太大区别,但Scrapy项目可以帮助您删除拼写错误并使您的项目保持一致,这就是为什么我建议使用Scrapy Item而不是比Python dict收集数据。

物品管道

在一个项目被spider抓取后,它将被发送到Item Pipeline以有几个组件处理。每个管道组件都是一个Python类,它实现了一个简单的方法。组件可以对项执行操作,修改,删除或将其发送到下一个组件。

项目管道可用于验证已删除数据,检查重复数据或将数据插入到Mysql,PostgreSQL或MongoDB等数据库中。

在本节中,我想向您展示如何使用项目管道将已删除的引用数据保存到数据库中,方法是使用SQLAlchemy-The Database Toolkit for Python。

设置SQLAlchemy

首先,我们需要确保已经安装了Mysql Server

  1. 如果您使用的是Mac,则可以使用它homebrew来帮助您快速安装mysql。
  2. 如果您使用的是Ubuntu或其他Linux发行版,则可以使用包管理器等apt。
  3. 如果您使用的是Windows,请使用二进制安装程序进行安装。
中国技术大牛,首次公开自己的Scrapy项目开发过程,否是新的趋势

将localhost在该命令是MySQL服务器的IP地址,记得要改变它,如果你的MySQL服务器是另一台机器上。quote_toscrape是数据库名称。安装Mysql之后,现在需要使用命令

安装SQLAlchemy pip install SQLAlchemy。

Settings.py

现在我们在项目settings.py中添加Mysql Server连接字符串,将下面的代码添加到 scrapy_spider/settings.py

中国技术大牛,首次公开自己的Scrapy项目开发过程,否是新的趋势

因为我们使用SQLAlchemy连接Mysql,所以这里的drivername是mysql,如果你连接Postgres,那么drivername就是postgres。你应该改变的user,passwd这里的价值。

Models.py

现在创建scrapy_spider/models.py,此文件将包含由其创建的数据库模型SQLAlchemy。

首先,我们定义一个帮助我们连接数据库的函数。为此,我们需要导入SQLAlchemy以及我们的scrapy设置实例:

中国技术大牛,首次公开自己的Scrapy项目开发过程,否是新的趋势

我想用这个例子指出一些要点。

1.首先,许多在线资源都喜欢用于from sqlalchemy import *将所有内容导入到我们的models.py中,但是,这不是一个好习惯,因为它可以使阅读代码的人感到困惑并对性能产生一些不良影响。因此,为了成为更好的开发人员,我们需要更明确地了解我们的导入内容。

2.我们使用get_project_settingsScrapy附带来获取设置对象,这可以让我们访问CONNECTION_STRING。

3.要使用Sqlalchemy创建表,我们必须declarative_base从SQLAlchemy 导入以将定义表结构的类映射到Mysql。我们QuoteDB继承DeclarativeBase并设置类中的字段。对于每个字段,我们定义它的字段类型,我们的主键字段为Integer,其余为字符串,文本。

在设置了sqlalchemy之后,我们可以通过输入来测试它是否按预期工作scrapy shell。请记住使用%paste命令粘贴下面的代码块以在Scrapy shell中进行测试。您可以查看这篇文章,了解有关Scrapy shell Scrapy教程#6:Scrapy Shell概述和技巧的更多提示。

中国技术大牛,首次公开自己的Scrapy项目开发过程,否是新的趋势

如果您不清楚此代码阻止了什么,请不要担心,我将在下一节中详细解释。你应该知道的是,如果没有引发错误,那么你会在终端中看到测试引号文本,这意味着SqlAlchemy可以在你的环境中按预期工作。现在我们可以将此代码块移动到我们的管道中,使其由spider抓取进程项并将数据保存到Mysql数据库中。

将Scraped数据流水线化到数据库

pipelines.pyscrapy项目中有一个文件,它定义了我们在Scrapy项目中使用的管道。我们可以修改ScrapySpiderPipeline文件,使其按照我们的预期将数据保存到数据库。

中国技术大牛,首次公开自己的Scrapy项目开发过程,否是新的趋势

这里,我们有一个构造函数,def __init__(self)通过定义引擎,DB中的数据表来初始化类。create_table

如果DB中没有数据表。

函数会尝试为我们创建数据表。每个管道组件类都必须有一个方法process_item,该方法将被顺序调用以处理已删除的项目。所以在process_item中,我们与数据库建立会话并将数据设置为我们的QuoteDB模型。然后将其添加到我们的会话中,您应该注意的是,在您调用该commit方法之前,此时数据不会保存到数据库。

如果commit方法有问题,那么rollback将帮助我们回滚正在进行的事务。

在process_item的最后,我们将项目返回到下一个要处理的管道。

激活管道

完成自定义管道后,我们需要在settings.py中激活它,这ITEM_PIPELINES是您应该修改的唯一一个。

中国技术大牛,首次公开自己的Scrapy项目开发过程,否是新的趋势

此处的数字决定了它们运行的顺序,项目从较低值到较高值类别。您可以设置0-1000之间的数字。

运行蜘蛛和检查数据库

现在我们可以运行我们的蜘蛛并在DB中检查结果scrapy crawl quotes_spider,并且在完成蜘蛛完成后,您可以登录mysql服务器来检查结果。

中国技术大牛,首次公开自己的Scrapy项目开发过程,否是新的趋势

如您所见,由于在测试SqlAchemy时插入了第一行和第二行,因此您需要删除生产中的数据。建议的方法是在

def __init__我们的Pipeline组件类中添加一些代码。您可以将此视为一个小练习,如果您有任何问题,请将消息发送给我。

故障排除:

如果您尝试使用SqSqlalchemy将已删除项目插入数据库,本节将列出您可能遇到的一些错误。

ImportError: No module named 'MySQLdb'

此错误通常是由于缺少mysql连接器引起的,我们可以通过安装第三方软件包来安装该问题。

pip install mysqlclient 无论你的Python是Python2还是Python3,都可以解决你的问题。

一些在线旧资源会告诉您使用,pip install mysql-python但此包只能在Python2中使用。这mysqlclient是更好的选择,因为它可以在两个Python版本上工作。

结论

在这个Scrapy教程中,我谈到了如何定义Scrapy项目,如何使用Scrapy项目,以及如何创建自定义项目管道以将Item的数据保存到DB中。您还学习了如何使用SQLAlchemy(python世界中最流行的ORM)为您做一些数据库工作。由于我在这篇文章中主要关注Scrapy,所以在本教程中我没有多谈SQLAlchemy,如果在将代码导入项目时有任何疑问,请留言并尽快回复。

喜欢的话就转发这篇文章吧!欢迎在下方评论,留下你的独特见解分享给大家! 私信“01”还可获取10本电子书


分享到:


相關文章: