Scrapy保存数据到MySQL数据库

0 阅读3分钟

使用Scrapy构建网络爬虫并存储数据到MySQL数据库

在当今信息爆炸的时代,网络爬虫成为了获取数据的一种重要手段。Scrapy是一个快速、高层次的Web抓取和网页抓取框架,用于爬取网站并从页面中提取结构化的数据。本文将介绍如何使用Scrapy构建一个简单的网络爬虫,并将爬取的数据存储到MySQL数据库中。

一、环境准备

在开始之前,请确保你已经安装了以下软件:

  • Python(建议使用Python 3.x版本)
  • Scrapy(可以通过pip install scrapy进行安装)
  • MySQL数据库(以及相应的Python连接器,如pymysql)

二、创建Scrapy项目

首先,我们需要创建一个Scrapy项目。在命令行中运行以下命令:

scrapy startproject myproject

这将创建一个名为myproject的Scrapy项目。进入项目目录后,我们将开始编写爬虫代码。

三、编写爬虫代码

myproject/spiders目录下,创建一个名为ssr2.py的文件,并编写以下代码:

# ssr2.py
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
 
class Ssr2Spider(CrawlSpider):
    name = "ssr2"
    allowed_domains = ["scrape.center"]
    start_urls = ["https://ssr2.scrape.center/page/1"]
 
    rules = (
        Rule(LinkExtractor(allow=r"https://ssr2.scrape.center/page/\d+"), follow=True),
        Rule(LinkExtractor(allow=r"https://ssr2.scrape.center/detail/\d+"), callback="parse_item"),
    )
 
    def parse_item(self, response):
        item = {}
        item['title'] = response.xpath("/html/body/div/div[2]/div[1]/div/div/div[1]/div/div[2]/a/h2/text()").extract_first()
        item['categories'] = response.xpath("//div[@class='categories']//span/text()").extract()
        item['score'] = response.xpath("//div[@class='el-col el-col-24 el-col-xs-8 el-col-sm-4']/p[@class='score m-t-md m-b-n-sm']/text()").extract_first().replace(' ', '').replace('\n', '')
        return item

这个爬虫使用了Scrapy的CrawlSpider类,它允许我们根据规则自动跟踪页面链接。我们定义了两个规则:一个是跟踪分页链接,另一个是解析详情页并提取数据。

四、编写数据管道

接下来,我们需要编写一个数据管道来将爬取的数据存储到MySQL数据库中。在myproject/pipelines.py文件中,编写以下代码:

# pipelines.py
import pymysql
from myproject import settings  # 注意这里应该使用你的项目名替换myproject
 
class CuiqingcaiPipeline:
    def __init__(self):
        self.connection = None
 
    def open_spider(self, spider):
        self.connection = pymysql.connect(
            host=settings.MYSQL_HOST,
            user=settings.MYSQL_USER,
            password=settings.MYSQL_PASSWD,
            database=settings.MYSQL_DBNAME,
            cursorclass=pymysql.cursors.DictCursor  # 返回字典形式的游标
        )
        print("开始保存数据~~~")
 
    def process_item(self, item, spider):
        try:
            with self.connection.cursor() as cursor:
                # 注意:这里的SQL语句应该使用占位符%s,并且不应该包含value关键字,而是使用VALUES
                sql = "INSERT INTO ssr2 (title, categories, score) VALUES (%s, %s, %s);"
                # 由于categories是一个列表,我们需要将其转换为字符串以便存储
                # 这里简单地使用逗号分隔,但你也可以选择其他格式,如JSON
                categories_str = ','.join(item['categories'])
                # 执行SQL语句
                cursor.execute(sql, (item['title'], categories_str, float(item['score'])))
        except Exception as e:
            print(e)
 
        # 提交事务
        self.connection.commit()
        return item
 
    def close_spider(self, spider):
        self.connection.close()
        print("结束爬取~~~")

请注意,我们需要在项目的settings.py文件中配置MySQL数据库的连接信息:

python
# settings.py
MYSQL_HOST = 'your_mysql_host'
MYSQL_USER = 'your_mysql_user'
MYSQL_PASSWD = 'your_mysql_password'
MYSQL_DBNAME = 'your_database_name'
 
# 启用数据管道
ITEM_PIPELINES = {
    'myproject.pipelines.CuiqingcaiPipeline': 300,  # 注意这里应该使用你的项目名替换myproject
}

五、运行爬虫

现在,我们可以运行爬虫来开始爬取数据了。在命令行中运行以下命令:

scrapy crawl ssr2

这将启动爬虫,并按照我们定义的规则开始爬取数据。爬取的数据将通过我们编写的数据管道存储到MySQL数据库中。

六、总结

本文介绍了如何使用Scrapy构建一个简单的网络爬虫,并将爬取的数据存储到MySQL数据库中。通过Scrapy的强大功能,我们可以轻松地爬取网站数据,并通过数据管道将其存储到各种存储系统中。希望这篇文章对你有所帮助!