🛠️ Scrapy 框架基本使用
Scrapy 是一个强大的 Python 爬虫框架,提供了用于提取和处理网页数据的功能。以下是 Scrapy 的基本使用步骤:
- 安装 Scrapy
bash
pip install scrapy
- 创建 Scrapy 项目
bash
scrapy startproject myproject
这将生成一个基础的 Scrapy 项目结构,包括 settings.py
、spiders
、items.py
等文件夹和文件。
🏗️ Scrapy 框架结构识别
Scrapy 项目通常包含以下几个重要组件:
spiders
: 存放爬虫代码的文件夹,每个爬虫文件定义了如何抓取特定网站的数据。items.py
: 用于定义要抓取的数据结构。pipelines.py
: 处理抓取到的数据,比如清洗、存储等。settings.py
: Scrapy 的配置文件,用于设置框架的各种参数。middlewares.py
: 用于定义 Scrapy 中间件,处理请求和响应。
📁 多种形式项目创建
除了使用 scrapy startproject
命令创建项目外,你还可以使用命令创建爬虫:
bash
scrapy genspider myspider example.com
这将生成一个名为 myspider
的爬虫文件,负责抓取 example.com
网站的数据。
🔄 Scrapy Fetch 模式
Scrapy 提供了多种数据抓取方式,包括:
- Fetch Requests: 直接抓取请求,使用 Scrapy shell 进行快速测试。
bash
scrapy shell "http://example.com"
- Scrapy Crawl: 使用已定义的爬虫抓取数据。
bash
scrapy crawl myspider
📜 Scrapy 常用指令集合
以下是一些常用的 Scrapy 命令:
- 创建项目 :
scrapy startproject projectname
- 生成爬虫 :
scrapy genspider spidername domain.com
- 启动爬虫 :
scrapy crawl spidername
- 运行爬虫并保存数据 :
scrapy crawl spidername -o output.json
- 调试 :
scrapy shell "http://example.com"
🛠️ Scrapy 配置文件解读
settings.py
是 Scrapy 的核心配置文件,包含了框架的各种设置,比如:
USER_AGENT
: 设置爬虫的用户代理。
python
USER_AGENT = 'myproject (+http://www.myproject.com)'
DOWNLOAD_DELAY
: 设置下载延迟。
python
DOWNLOAD_DELAY = 2
ITEM_PIPELINES
: 启用或禁用管道。
python
ITEM_PIPELINES = {
'myproject.pipelines.MyPipeline': 1,
}
🧩 Scrapy 管道学习
管道(Pipelines)是 Scrapy 处理抓取数据的重要组成部分。以下是一个简单的管道示例,它将数据保存到 JSON 文件中:
pipelines.py
:
python
import json
class JsonWriterPipeline:
def __init__(self):
self.file = open('items.json', 'w')
self.exporter = json.JSONEncoder()
def process_item(self, item, spider):
line = self.exporter.encode(item) + "\n"
self.file.write(line)
return item
def close_spider(self, spider):
self.file.close()
在 settings.py
中启用管道:
python
ITEM_PIPELINES = {
'myproject.pipelines.JsonWriterPipeline': 1,
}
📝 Scrapy 表单处理
Scrapy 支持处理表单提交,例如登录操作。以下是一个示例,展示如何使用 Scrapy 提交表单:
python
import scrapy
class FormSpider(scrapy.Spider):
name = 'form_spider'
start_urls = ['http://example.com/login']
def parse(self, response):
yield scrapy.FormRequest.from_response(
response,
formdata={'username': 'user', 'password': 'pass'},
callback=self.after_login
)
def after_login(self, response):
# 检查登录是否成功
if "Welcome" in response.text:
self.logger.info("Login successful!")
else:
self.logger.info("Login failed.")
🧩 Scrapy 功能学习
🧩 Selector 数据处理
Scrapy 使用 Selector
来提取数据。常用选择器包括:
- XPath 选择器:
python
response.xpath('//title/text()').get()
- CSS 选择器:
python
response.css('title::text').get()
- 正则表达式选择器:
python
import re
response.text.find(r'\bExample\b')
🗃️ Scrapy 对接 MySQL
将数据存储到 MySQL 数据库的示例:
pipelines.py
:
python
import mysql.connector
class MySQLPipeline:
def open_spider(self, spider):
self.conn = mysql.connector.connect(
host='localhost',
user='root',
password='password',
database='scrapy_db'
)
self.cursor = self.conn.cursor()
def process_item(self, item, spider):
self.cursor.execute(
"INSERT INTO my_table (field1, field2) VALUES (%s, %s)",
(item['field1'], item['field2'])
)
self.conn.commit()
return item
def close_spider(self, spider):
self.cursor.close()
self.conn.close()
在 settings.py
中启用管道:
python
ITEM_PIPELINES = {
'myproject.pipelines.MySQLPipeline': 1,
}
🗄️ Scrapy 对接 MongoDB
将数据存储到 MongoDB 的示例:
pipelines.py
:
python
import pymongo
class MongoDBPipeline:
def open_spider(self, spider):
self.client = pymongo.MongoClient('localhost', 27017)
self.db = self.client['scrapy_db']
self.collection = self.db['my_collection']
def process_item(self, item, spider):
self.collection.insert_one(dict(item))
return item
def close_spider(self, spider):
self.client.close()
在 settings.py
中启用管道:
python
ITEM_PIPELINES = {
'myproject.pipelines.MongoDBPipeline': 1,
}
📂 Scrapy 文件存储
将数据存储为文件(如 CSV、JSON)的示例:
python
import csv
class CsvWriterPipeline:
def __init__(self):
self.file = open('items.csv', 'w', newline='', encoding='utf-8')
self.writer = csv.writer(self.file)
self.writer.writerow(['field1', 'field2'])
def process_item(self, item, spider):
self.writer.writerow([item['field1'], item['field2']])
return item
def close_spider(self, spider):
self.file.close()
在 settings.py
中启用管道:
python
ITEM_PIPELINES = {
'myproject.pipelines.CsvWriterPipeline': 1,
}
以上内容展示了如何使用 Scrapy 框架进行数据抓取、处理和存储,希望对你进行 Python 爬虫开发有所帮助。🎯