Python 爬虫实战:Scrapy 框架详解与应用

🛠️ Scrapy 框架基本使用

Scrapy 是一个强大的 Python 爬虫框架,提供了用于提取和处理网页数据的功能。以下是 Scrapy 的基本使用步骤:

  1. 安装 Scrapy
bash 复制代码
pip install scrapy
  1. 创建 Scrapy 项目
bash 复制代码
scrapy startproject myproject

这将生成一个基础的 Scrapy 项目结构,包括 settings.pyspidersitems.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 爬虫开发有所帮助。🎯

相关推荐
喵叔哟12 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生19 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
hopetomorrow32 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
小牛itbull42 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i1 小时前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
nuclear20111 小时前
使用Python 在Excel中创建和取消数据分组 - 详解
python·excel数据分组·创建excel分组·excel分类汇总·excel嵌套分组·excel大纲级别·取消excel分组
躺平的花卷1 小时前
Python爬虫案例八:抓取597招聘网信息并用xlutils进行excel数据的保存
爬虫·excel
闲暇部落1 小时前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
GIS瞧葩菜1 小时前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming19871 小时前
STL关联式容器之set
开发语言·c++