数据的存储是任何爬虫项目都需要考虑的重要部分。在Scrapy项目中,存储爬取的数据有两种主要方法:存储到CSV和存储到MySQL。在本文中,我们将学习如何使用Scrapy将数据存储到这两种格式中。
存储到CSV
存储到CSV相对比较简单,只需要在Scrapy项目中的pipelines.py文件中编写相应的代码即可实现。
首先,我们需要在Scrapy项目中的pipelines.py中添加以下代码:
import csv
class CsvPipeline(object):
def __init__(self):
self.file = open('data.csv', 'w', encoding='utf-8')
self.writer = csv.writer(self.file)
self.writer.writerow(['field1', 'field2', 'field3'])
def process_item(self, item, spider):
self.writer.writerow([item['field1'], item['field2'], item['field3']])
return item
def close_spider(self, spider):
self.file.close()
在上面的代码中,我们定义了一个CsvPipeline类,在__init__()方法中创建了一个csv文件,并将第一行写入表头。在process_item()方法中,通过item对象访问要存储的字段,并将其写入到csv文件中。在close_spider()方法中,关闭CsvPipeline实例的文件对象。
现在已经定义了CsvPipeline,我们需要在settings.py中启用它。在settings.py文件中添加以下代码:
ITEM\_PIPELINES = {
'myproject.pipelines.CsvPipeline': 300,
}
在上面的代码中,我们将CsvPipeline的优先级(300)定义为比其他管道更高。这意味着Scrapy将首先使用该管道存储数据。
存储到MySQL
存储到MySQL需要注意的是需要安装pymysql或mysql-connector-python等库,所以需要进行安装。
以下是存储到MySQL的代码:
import pymysql
class MysqlPipeline(object):
def __init__(self):
self.conn = pymysql.connect(
host='localhost',
user='root',
password='password',
db='db_name',
charset='utf8'
)
self.cursor = self.conn.cursor()
def process_item(self, item, spider):
insert_sql = "INSERT INTO tablename (field1, field2, field3) VALUES (%s, %s, %s)"
self.cursor.execute(insert_sql, (item['field1'], item['field2'], item['field3']))
self.conn.commit()
return item
def close_spider(self, spider):
self.cursor.close()
self.conn.close()
在上面的代码中,我们定义了一个MysqlPipeline类,在__init__()方法中创建了一个MySQL连接,然后在process_item()方法中将item对象中的字段插入到数据库中。在close_spider()方法中,关闭MysqlPipeline实例的数据库连接。
现在已经定义了MysqlPipeline,我们需要在settings.py中启用它。在settings.py文件中添加以下代码:
ITEM\_PIPELINES = {
'myproject.pipelines.MysqlPipeline': 300,
}
在上面的代码中,我们将MysqlPipeline的优先级(300)定义为比其他管道更高。这意味着Scrapy将首先使用该管道存储数据。请根据自己的项目需求更改代码中的IP、用户名、密码、数据库、表名等参数。
这样,你就可以很容易地将Scrapy爬取的数据存储到CSV和MySQL中了。