使用Scrapy将数据写入MySQL数据库

使用Scrapy将数据写入MySQL数据库

在网页爬取和数据处理过程中,经常需要将数据写入到数据库中,MySQL是其中非常常见的一种。而Scrapy作为Python的爬虫框架,也自然而然地支持将数据存储到MySQL数据库中。本文将介绍如何使用Scrapy将爬取的数据写入到MySQL数据库中。

阅读更多:MySQL 教程

准备工作

安装MySQL Connector

在使用Scrapy操作MySQL数据库之前,需要安装MySQL Connector。可以使用pip进行安装:

pip install mysql-connector-python-rf
Mysql

创建数据库

首先需要在MySQL中创建一个数据库和相应的数据表,以存储爬取的数据。可以使用如下的SQL语句进行创建(假设该数据库名为mydatabase):

CREATE DATABASE mydatabase;
USE mydatabase;
CREATE TABLE mytable (
  id INT(11) NOT NULL AUTO_INCREMENT,
  title VARCHAR(255) NOT NULL,
  content TEXT NOT NULL,
  url VARCHAR(2083) NOT NULL,
  PRIMARY KEY (id)
);
Mysql

在创建表时,需要注意设置表的字段和数据类型。上面的SQL语句中,mytable表有四个字段,其中id为自增长主键。

配置Scrapy

在Scrapy项目中,可以通过设置settings.py文件中的相应配置项来连接MySQL数据库。

MYSQL_HOST = 'localhost'
MYSQL_PORT = 3306
MYSQL_DBNAME = 'mydatabase'
MYSQL_USER = 'root'
MYSQL_PASSWORD = '123456'
Mysql

上面的配置项中,MYSQL_HOSTMYSQL_PORTMYSQL_DBNAMEMYSQL_USERMYSQL_PASSWORD可以直接替换为自己的MySQL数据库信息。

编写代码

假设我们已经编写好了一个Scrapy爬虫,爬取到的数据是一些新闻内容。下面我们将介绍如何将这些数据写入到MySQL数据库中。

Pipeline

在Scrapy中,可以使用Pipeline来管道化数据处理过程,其中包括将数据存储到MySQL数据库中。

首先,在项目的pipelines.py中创建一个Pipeline类来实现将数据写入MySQL数据库的功能。具体实现如下:

import mysql.connector

class MySQLPipeline(object):
    def __init__(self, host, port, dbname, user, password):
        self.host = host
        self.port = port
        self.dbname = dbname
        self.user = user
        self.password = password

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            host=crawler.settings.get('MYSQL_HOST'),
            port=crawler.settings.get('MYSQL_PORT'),
            dbname=crawler.settings.get('MYSQL_DBNAME'),
            user=crawler.settings.get('MYSQL_USER'),
            password=crawler.settings.get('MYSQL_PASSWORD'),
        )

    def open_spider(self, spider):
        self.conn = mysql.connector.connect(
            host=self.host,
            port=self.port,
            database=self.dbname,
            user=self.user,
            password=self.password,
        )
        self.cursor = self.conn.cursor()

    def close_spider(self, spider):
        self.conn.commit()
        self.conn.close()

    def process_item(self, item, spider):
        sql = 'INSERT INTO mytable (title, content, url) VALUES (%s, %s, %s)'
        self.cursor.execute(sql, (
            item['title'],
            item['content'],
            item['url'],
        ))
        return item
Mysql

上述代码的思路是,首先定义了一个MySQLPipeline类,其中包括了初始化、从配置中获取MySQL数据库信息、打开和关闭数据库连接、执行SQL语句并将数据写入MySQL数据库的方法。其中,process_item方法就是将爬取到的数据插入到MySQL数据库中的操作。

Item

在Scrapy中,Item代表了从网页中提取的数据。我们需要定义一个Item来封装从网页中提取的新闻数据。在项目目录下的items.py中,可以定义如下的数据模型:

import scrapy

class NewsItem(scrapy.Item):
    title = scrapy.Field()
    content = scrapy.Field()
    url = scrapy.Field()
Mysql

上述代码中定义了一个NewsItem类,其中包含三个字段,分别代表新闻的标题、内容和URL。

Spider

最后,在Scrapy的Spider中,我们需要从网页中提取新闻数据,并将其封装为NewsItem对象,最终通过Pipeline将数据写入MySQL数据库中。

假设我们的Spider代码如下所示,从给定的URL中爬取新闻信息:

import scrapy
from myproject.items import NewsItem

class NewsSpider(scrapy.Spider):
    name = "news"
    start_urls = [
        'http://www.xxx.com/news/',
    ]

    def parse(self, response):
        for news in response.xpath('//div[contains(@class, "news")]'):
            item = NewsItem()
            item['title'] = news.xpath('.//h2/text()').get()
            item['content'] = news.xpath('.//p/text()').get()
            item['url'] = response.urljoin(news.xpath('.//@href').get())
            yield item
Mysql

在上述代码中,我们首先定义了Spider的名称和起始URL,然后在解析响应结果时,通过XPath从网页中提取出新闻的标题、内容和URL,并将其封装为NewsItem对象。

运行代码

运行Scrapy爬虫,并将爬取到的新闻数据写入MySQL数据库中,只需要在终端中执行以下命令:

scrapy crawl news
Mysql

Scrapy会自动执行Spider并将爬取到的数据写入到MySQL数据库中。如果需要查看MySQL数据库中保存的数据,只需要使用相应的SQL语句查询即可。

总结

Scrapy可以很方便地将爬取到的数据写入MySQL数据库中。通过Pipeline的方式,我们可以对爬取到的数据进行加工处理,并最终将其写入数据库中。同时,在Spider中定义好数据模型,可以更方便地管理爬取到的数据。

当然,在实际应用中,还需要考虑数据的去重、更新等问题,以及对于较大的数据量,如何优化性能等问题。因此,在使用时需要根据具体情况进行调整和优化。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册