1. scrapy数据存储在mysql数据库的两种方式
当我们使用Scrapy框架进行爬虫开发时,一般会将爬取到的数据保存到数据库中。其中,MySQL数据库是一种常用的关系型数据库。在Scrapy框架中,我们可以使用两种不同的方法将数据存储到MySQL数据库中,分别是同步和异步方式。
2. 同步方式
同步方式即将数据一条一条地插入到数据库中。这种方式比较简单,适用于数据量较小的情况。我们可以使用Python中MySQLdb模块来实现数据的同步存储。以下是一个简单的例子:
2.1 安装MySQLdb
在命令行下使用pip install MySQL-python安装MySQLdb模块。
2.2 编写MySQL Pipeline
在Scrapy项目中,我们可以编写一个MySQL Pipeline实现将数据存储到MySQL数据库中。在pipelines.py中编写如下代码:
```
import MySQLdb
class MySQLPipeline(object):
def __init__(self, host, port, username, password, database):
self.host = host
self.port = port
self.username = username
self.password = password
self.database = database
def open_spider(self, spider):
self.db = MySQLdb.connect(self.host, self.username, self.password, self.database, self.port, charset='utf8')
self.cursor = self.db.cursor()
def process_item(self, item, spider):
sql = """
INSERT INTO table_name (field1, field2, field3)
VALUES (%s, %s, %s)
"""
self.cursor.execute(sql, (item['field1'], item['field2'], item['field3']))
self.db.commit()
return item
def close_spider(self, spider):
self.db.close()
```
其中,MySQLPipeline类包含五个参数:host、port、username、password和database,分别表示MySQL数据库的主机地址、端口号、用户名、密码和数据库名。在open_spider函数中,我们建立了与数据库的连接,并创建了游标对象。在process_item函数中,我们使用了参数item,其中包含我们从页面中爬取到的数据,然后将其插入到MySQL数据库中,并使用db.commit()方法进行提交。在close_spider函数中,我们关闭了数据库的连接。
2.3 配置settings.py
我们需要在settings.py中启用MySQL Pipeline并配置MySQL数据库,方法如下:
```
ITEM_PIPELINES = {
'myproject.pipelines.MySQLPipeline': 300,
}
MYSQL_HOST = 'localhost'
MYSQL_PORT = 3306
MYSQL_USERNAME = 'root'
MYSQL_PASSWORD = 'password'
MYSQL_DATABASE = 'mydatabase'
```
2.4 运行爬虫
接下来我们就可以在命令行下运行爬虫了。在命令行下输入以下命令:
```
scrapy crawl myspider
```
其中,myspider为我们编写的爬虫名称。
3. 异步方式
异步方式即将一批数据同时插入到数据库中,适用于数据量较大的情况。在Scrapy框架中,我们可以使用Twisted框架实现异步存储。在异步存储方式下,我们需要建立一个连接池,用于管理多个连接到MySQL数据库的连接。以下是一个简单的例子:
3.1 安装Twisted和MySQLdb
在命令行下使用pip install Twisted MySQL-python安装Twisted和MySQLdb模块。
3.2 编写MySQL异步Pipeline
在pipelines.py中编写如下代码:
```
import MySQLdb.cursors
from twisted.enterprise import adbapi
class MySQLAsyncPipeline(object):
def __init__(self, host, port, username, password, database):
self.host = host
self.port = port
self.username = username
self.password = password
self.database = database
@classmethod
def from_settings(cls, settings):
host = settings['MYSQL_HOST']
port = settings['MYSQL_PORT']
username = settings['MYSQL_USERNAME']
password = settings['MYSQL_PASSWORD']
database = settings['MYSQL_DATABASE']
return cls(host, port, username, password, database)
def open_spider(self, spider):
self.dbpool = adbapi.ConnectionPool('MySQLdb',
host=self.host,
port=self.port,
user=self.username,
passwd=self.password,
db=self.database,
charset='utf8',
cursorclass=MySQLdb.cursors.DictCursor
)
def process_item(self, item, spider):
query = self.dbpool.runInteraction(self._process_item, item)
query.addErrback(self.handle_error)
return item
def _process_item(self, conn, item):
sql = """
INSERT INTO table_name (field1, field2, field3)
VALUES (%s, %s, %s)
"""
values = (item['field1'], item['field2'], item['field3'])
conn.execute(sql, values)
def handle_error(self, failure):
print(failure)
```
我们使用了Twisted中的adbapi模块,建立了一个连接池。在open_spider函数中,我们建立了与数据库的连接,并建立了一个连接池。在process_item函数中,我们使用了参数item,并使用dbpool.runInteraction方法将该数据插入到MySQL数据库中。在handle_error函数中,我们打印出错误信息以便我们进行调试。
3.3 配置settings.py
我们需要在settings.py中启用MySQL异步Pipeline并配置MySQL数据库,方法如下:
```
ITEM_PIPELINES = {
'myproject.pipelines.MySQLAsyncPipeline': 300,
}
MYSQL_HOST = 'localhost'
MYSQL_PORT = 3306
MYSQL_USERNAME = 'root'
MYSQL_PASSWORD = 'password'
MYSQL_DATABASE = 'mydatabase'
```
3.4 运行爬虫
接下来我们就可以在命令行下运行爬虫了。在命令行下输入以下命令:
```
scrapy crawl myspider
```
其中,myspider为我们编写的爬虫名称。
总结
本文介绍了Scrapy框架中将数据存储到MySQL数据库中的两种方式,分别是同步和异步方式。同步方式适用于数据量较小的情况,代码简单易懂。而异步方式适用于数据量较大的情况,可以提高数据存储的效率。在使用异步方式时,我们建立了一个连接池,用于管理多个连接到MySQL数据库的连接,可以使得数据存储更加稳定。