在Python爬虫的生态中,Scrapy是一个非常流行且强大的爬虫框架。它提供了高效的抓取方式,支持自动化的调度、重试、数据存储等功能,适合处理中大型爬虫项目。Scrapy的设计理念简洁、模块化,开发者可以快速构建高效的爬虫。

本文将通过一个简单的实战项目,带你从零开始配置和使用Scrapy框架,深入了解如何快速搭建爬虫并将其部署到生产环境。


1. Scrapy简介

Scrapy是一个用于从网站抓取数据的框架,支持以下功能:

  • 多线程抓取:内置了异步的请求机制,能够高效地并发抓取网页。
  • 数据存储:可以直接将抓取的数据存储为JSON、CSV、XML或导入到数据库中。
  • 中间件和扩展:通过中间件(middlewares)可以对请求和响应进行自定义处理,如自动处理代理、验证码、重试等。
  • 调度机制:内置爬取调度,支持定时任务调度。

2. 安装与配置Scrapy

2.1 安装Scrapy

在开始之前,你需要安装Scrapy。可以通过pip进行安装:

pip install scrapy
2.2 创建Scrapy项目

创建一个新的Scrapy项目非常简单,执行以下命令:

scrapy startproject myproject

这将创建一个名为myproject的文件夹,并包含Scrapy项目所需的基本结构。目录结构如下:

myproject/
    scrapy.cfg
    myproject/
        __init__.py
        items.py
        middlewares.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
  • scrapy.cfg:Scrapy的配置文件。
  • myproject/settings.py:存放配置项,控制爬虫的行为。
  • myproject/items.py:定义爬虫抓取的对象。
  • myproject/spiders/:存放爬虫代码的目录。
  • myproject/pipelines.py:定义如何处理抓取的数据(如存入数据库等)。
2.3 配置settings.py

Scrapy的配置文件settings.py允许你对爬虫的各项行为进行详细配置。以下是一些常见的配置项:

  • USER_AGENT:指定请求时使用的User-Agent
  • ROBOTSTXT_OBEY:设置为True表示遵守robots.txt规则。
  • DOWNLOAD_DELAY:控制每次请求之间的延迟,避免过于频繁的请求被封。
  • ITEM_PIPELINES:定义数据处理的管道。
# settings.py

USER_AGENT = 'myproject (+http://www.yourdomain.com)'

ROBOTSTXT_OBEY = True  # 遵守robots.txt规则

DOWNLOAD_DELAY = 2  # 设置请求间隔

ITEM_PIPELINES = {
   'myproject.pipelines.MyprojectPipeline': 1,
}

3. 编写爬虫

Scrapy爬虫是定义在spiders/目录中的Python文件。每个爬虫文件都是一个类,继承自scrapy.Spider

3.1 定义爬虫类

以下是一个简单的Scrapy爬虫,抓取一个假设网站的所有文章标题和链接:

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'  # 爬虫名称
    start_urls = ['https://example.com']  # 爬虫的起始URL

    def parse(self, response):
        # 提取网页中的所有文章链接
        for article in response.css('div.article'):
            yield {
                'title': article.css('h2::text').get(),
                'url': article.css('a::attr(href)').get(),
            }

        # 翻页逻辑
        next_page = response.css('a.next::attr(href)').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)
  • name:定义爬虫的名称,用于启动爬虫时的命令。
  • start_urls:定义爬虫的初始URL列表。
  • parse():解析响应,提取所需的数据。
3.2 启动爬虫

在项目的根目录下运行以下命令启动爬虫:

scrapy crawl myspider

这会启动名为myspider的爬虫,抓取start_urls中的网页内容。


4. 数据存储

Scrapy提供了多种方式来存储抓取的数据,最常见的是将数据导出为JSON、CSV或XML文件。

4.1 导出为JSON文件

运行爬虫时,可以使用以下命令将抓取的数据保存为JSON格式:

scrapy crawl myspider -o output.json

这将把抓取的数据存储到output.json文件中。

4.2 使用管道处理数据

有时抓取的数据需要进一步处理,例如清洗数据或将其存入数据库。此时,你可以在pipelines.py中定义管道(Pipeline)来处理数据。

# pipelines.py

class MyprojectPipeline:
    def process_item(self, item, spider):
        # 在此处理抓取的数据,如存入数据库
        return item

settings.py中启用该管道:

ITEM_PIPELINES = {
   'myproject.pipelines.MyprojectPipeline': 1,
}

5. 中间件与反爬

为了突破反爬机制,Scrapy提供了强大的中间件(Middleware)机制,你可以使用它来模拟浏览器行为、设置代理、处理验证码等。

5.1 使用代理池

settings.py中配置代理池来防止IP被封禁:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1,
    'myproject.middlewares.ProxyMiddleware': 100,
}

middlewares.py中实现代理池:

import random

class ProxyMiddleware:
    def process_request(self, request, spider):
        proxies = [
            'http://10.10.1.10:8000',
            'http://20.20.2.20:8000',
        ]
        request.meta['proxy'] = random.choice(proxies)
5.2 模拟浏览器头部

通过修改请求头(如User-Agent)来模拟浏览器的访问:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'myproject.middlewares.RandomUserAgentMiddleware': 400,
}

middlewares.py中定义随机的User-Agent:

import random

class RandomUserAgentMiddleware:
    def process_request(self, request, spider):
        user_agents = [
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
        ]
        request.headers['User-Agent'] = random.choice(user_agents)

6. 项目部署

在开发完Scrapy爬虫之后,部署到生产环境是一个不可忽视的步骤。

6.1 使用Scrapy Cloud

Scrapy Cloud是Scrapy官方提供的云平台,允许你部署和调度爬虫。

  1. 注册并登录Scrapy Cloud

  2. 安装scrapinghub

    pip install scrapinghub
    
  3. 使用以下命令将爬虫上传到Scrapy Cloud:

    shub deploy
    
  4. 通过Scrapy Cloud的界面管理你的爬虫,查看抓取数据。

6.2 使用Docker部署Scrapy项目

你也可以将Scrapy项目容器化,通过Docker部署爬虫。首先创建一个Dockerfile

FROM python:3.8-slim

WORKDIR /app

COPY . /app

RUN pip install -r requirements.txt

CMD ["scrapy", "crawl", "myspider"]

然后构建并运行Docker镜像:

docker build -t myspider .
docker run myspider

7. 总结

通过本文,你已经学会了如何使用Scrapy框架从零开始搭建一个爬虫项目,并

掌握了数据存储、反爬措施以及部署爬虫的技巧。Scrapy提供了非常强大的功能,能够帮助你快速、有效地完成数据抓取任务。

无论是调度任务、模拟浏览器、使用代理,还是数据存储和管道处理,Scrapy都能提供灵活的支持。部署爬虫到云平台或使用Docker进行容器化部署,进一步提升了爬虫的可维护性和扩展性。

希望本文能帮助你深入理解Scrapy框架,并能在实际项目中快速应用这些技能。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐