使用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的强大功能,我们可以轻松地爬取网站数据,并通过数据管道将其存储到各种存储系统中。希望这篇文章对你有所帮助!