Scrapy框架快速入门指南

Scrapy框架快速入门指南

在数据驱动的世界中,快速而高效地抓取数据变得尤为重要。Scrapy是一个快速、简单但功能强大的爬虫框架,能够满足数据抓取的各种需求。今天,我们将快速入门Scrapy,了解如何使用它抓取和提取数据。

目录

  1. 前置条件
  2. 安装Scrapy
  3. 创建并设置Scrapy项目
  4. 编写Spider爬虫
  5. 存储抓取结果
  6. 设置与中间件
  7. 实用小贴士

前置条件

  • 操作系统:CentOS 7
  • Python版本:Python 3.8
  • Scrapy版本:2.8.0

安装Scrapy

  1. 确保Python和pip已安装:

    bash 复制代码
    sudo yum install -y python38 python38-pip
  2. 升级pip并安装Scrapy:

    bash 复制代码
    python3.8 -m pip install --upgrade pip
    pip3 install scrapy
  3. 验证安装:

    bash 复制代码
    scrapy version

    如果看到类似 Scrapy 2.8.0 的输出,说明安装成功。

创建并设置Scrapy项目

  1. 创建Scrapy项目:

    bash 复制代码
    scrapy startproject myproject
  2. 目录结构:

    bash 复制代码
    myproject/
        scrapy.cfg
        myproject/
            __init__.py
            items.py
            middlewares.py
            pipelines.py
            settings.py
            spiders/
                __init__.py
  3. 设置项目配置:

    编辑 myproject/settings.py 进行一些基本设置:

    python 复制代码
    BOT_NAME = 'myproject'
    SPIDER_MODULES = ['myproject.spiders']
    NEWSPIDER_MODULE = 'myproject.spiders'
    
    ROBOTSTXT_OBEY = True
    
    ITEM_PIPELINES = {
        'myproject.pipelines.MyProjectPipeline': 300,
    }

编写Spider爬虫

  1. 创建Spider爬虫:

    bash 复制代码
    scrapy genspider example example.com
  2. 编辑 myproject/spiders/example.py

    python 复制代码
    import scrapy
    
    class ExampleSpider(scrapy.Spider):
        name = "example"
        allowed_domains = ["example.com"]
        start_urls = ["http://example.com/"]
    
        def parse(self, response):
            yield {
                'title': response.xpath('//title/text()').get(),
                'url': response.url,
            }
  3. 运行爬虫并查看输出:

    bash 复制代码
    scrapy crawl example -o output.json

    这样,抓取结果将保存为 output.json 文件。

存储抓取结果

除了JSON文件,Scrapy还支持以多种格式存储数据:

  1. CSV格式:

    bash 复制代码
    scrapy crawl example -o output.csv
  2. XML格式:

    bash 复制代码
    scrapy crawl example -o output.xml
  3. MySQL数据库:

    pipelines.py 文件中实现数据存储到MySQL的功能:

    python 复制代码
    import mysql.connector
    
    class MyProjectPipeline:
        def open_spider(self, spider):
            self.conn = mysql.connector.connect(
                host='localhost',
                user='your_user',
                password='your_password',
                database='your_database'
            )
            self.cursor = self.conn.cursor()
    
        def close_spider(self, spider):
            self.conn.commit()
            self.conn.close()
    
        def process_item(self, item, spider):
            self.cursor.execute(
                "INSERT INTO your_table (title, url) VALUES (%s, %s)",
                (item['title'], item['url'])
            )
            return item

设置与中间件

设置

调整Scrapy的设置文件以提高性能或自定义爬虫行为:

  • 并发请求数:

    python 复制代码
    CONCURRENT_REQUESTS = 16
  • 下载延迟(秒):

    python 复制代码
    DOWNLOAD_DELAY = 2
  • 禁用cookies:

    python 复制代码
    COOKIES_ENABLED = False

中间件

中间件可用于修改请求和响应:

  1. middlewares.py 中创建自定义中间件:

    python 复制代码
    class CustomDownloaderMiddleware:
        def process_request(self, request, spider):
            spider.logger.info(f'Processing request: {request.url}')
            return None
  2. settings.py 中启用中间件:

    python 复制代码
    DOWNLOADER_MIDDLEWARES = {
        'myproject.middlewares.CustomDownloaderMiddleware': 543,
    }

实用小贴士

  1. 查看网络请求 :使用 scrapy shell 以交互方式查看和测试网络请求:

    bash 复制代码
    scrapy shell "http://example.com/"

    在shell中,你可以使用Xpath和CSS选择器来查看页面内容。

  2. 调试爬虫 :利用 logging 库记录爬虫的详细运行状态:

    python 复制代码
    import logging
    logging.basicConfig(level=logging.DEBUG)
  3. 遵守机器人协议 :遵循网站的 robots.txt 文件,以避免违反网站的爬取政策。

掌握了Scrapy的基础操作,接下来可以根据需求扩展功能,为复杂的数据抓取任务做准备啦。

相关推荐
Data_agent12 小时前
学术爬虫实战:构建知网论文关键词共现网络的技术指南
python·算法
_一路向北_14 小时前
爬虫框架:Feapder使用心得
爬虫·python
皇族崛起14 小时前
【3D标注】- Unreal Engine 5.7 与 Python 交互基础
python·3d·ue5
你想知道什么?15 小时前
Python基础篇(上) 学习笔记
笔记·python·学习
Swizard15 小时前
速度与激情:Android Python + CameraX 零拷贝实时推理指南
android·python·ai·移动开发
一直跑15 小时前
Liunx服务器centos7离线升级内核(Liunx服务器centos7.9离线/升级系统内核)
python
leocoder16 小时前
大模型基础概念入门 + 代码实战(实现一个多轮会话机器人)
前端·人工智能·python
Buxxxxxx16 小时前
DAY 37 深入理解SHAP图
python
ada7_16 小时前
LeetCode(python)108.将有序数组转换为二叉搜索树
数据结构·python·算法·leetcode
请一直在路上16 小时前
python文件打包成exe(虚拟环境打包,减少体积)
开发语言·python