从零开始讲解Scrapy爬虫开发及数据存储的教程,采用分步式讲解并附带完整代码示例:
Scrapy爬虫教程:从入门到数据存储(MySQL版)
一、开发环境准备
-
安装Python(推荐3.8+版本)
- 官网下载地址:https://www.python.org/
-
创建虚拟环境(可选但推荐)
python -m venv scrapy_env source scrapy_env/bin/activate # Linux/Mac scrapy_env\Scripts\activate # Windows
-
安装必要库
pip install scrapy pymysql
二、创建Scrapy项目
-
新建项目
scrapy startproject book_crawler cd book_crawler
-
目录结构说明:
book_crawler/ │ ├── scrapy.cfg # 项目配置文件 └── book_crawler/ # 项目主目录 ├── __init__.py ├── items.py # 定义抓取数据结构 ├── middlewares.py # 中间件配置 ├── pipelines.py # 数据管道(数据库存储逻辑) ├── settings.py # 项目设置 └── spiders/ # 爬虫目录 └── __init__.py
三、编写爬虫(以图书网站为例)
- 创建爬虫文件
spiders/book_spider.py
import scrapy
class BookSpider(scrapy.Spider):
name = "books"
start_urls = ['http://books.toscrape.com/']
def parse(self, response):
# 提取图书列表
for book in response.css('article.product_pod'):
yield {
'title': book.css('h3 a::attr(title)').get(),
'price': book.css('p.price_color::text').get(),
'rating': book.css('p.star-rating::attr(class)').get().split()[-1],
'stock': book.css('p.availability::text')[1].get().strip()
}
# 自动翻页
next_page = response.css('li.next a::attr(href)').get()
if next_page:
yield response.follow(next_page, self.parse)
四、配置数据存储管道
- 修改
pipelines.py
import pymysql
class MysqlPipeline:
def __init__(self):
self.conn = None
self.cursor = None
def open_spider(self, spider):
# 连接数据库
self.conn = pymysql.connect(
host='localhost',
user='root',
password='yourpassword',
db='book_db',
charset='utf8mb4'
)
self.cursor = self.conn.cursor()
# 创建数据表
self.cursor.execute("""
CREATE TABLE IF NOT EXISTS books(
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
price DECIMAL(10,2),
rating VARCHAR(20),
stock VARCHAR(50)
)
""")
def process_item(self, item, spider):
# 插入数据
query = """
INSERT INTO books (title, price, rating, stock)
VALUES (%s, %s, %s, %s)
"""
self.cursor.execute(query, (
item['title'],
float(item['price'][1:]), # 去除£符号
item['rating'],
item['stock']
))
self.conn.commit()
return item
def close_spider(self, spider):
self.cursor.close()
self.conn.close()
- 配置
settings.py
ITEM_PIPELINES = {
'book_crawler.pipelines.MysqlPipeline': 300,
}
# 遵守robots协议(测试时可关闭)
ROBOTSTXT_OBEY = False
# 设置请求延迟(避免被封)
DOWNLOAD_DELAY = 2
五、运行与测试
- 启动爬虫
scrapy crawl books
- 查看MySQL数据库
SELECT * FROM books LIMIT 5;
六、常见问题解决
-
数据库连接失败
- 检查MySQL服务是否运行
- 确认用户名/密码是否正确
- 检查数据库权限设置
-
乱码问题解决
# 在settings.py中添加 FEED_EXPORT_ENCODING = 'utf-8'
-
反爬虫策略应对
- 在settings.py中配置:
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' DOWNLOAD_DELAY = 3
七、项目扩展建议
- 添加异常处理
- 使用Item类规范化数据结构
- 添加日志记录
- 实现分布式爬虫(需结合Scrapy-Redis)
Q&A环节:
Q:爬虫运行时如何看到SQL语句?
A:在pipelines.py中添加打印语句,或者在MySQL中开启查询日志
Q:数据如何导出为CSV?
A:运行命令添加导出参数:
scrapy crawl books -o books.csv
建议新手按照以下步骤练习:
- 先运行示例爬虫观察效果
- 尝试修改CSS选择器提取不同字段
- 自定义存储到其他数据库(如MongoDB)
- 添加新的网站解析逻辑
注意:实际使用时请遵守目标网站的robots.txt协议,控制请求频率,避免对目标网站造成过大压力。