使用 Scrapy 进行数据爬取的核心流程可概括为:创建项目 → 定义数据结构 → 编写爬虫逻辑 → 配置项目 → 运行爬虫并处理数据。以下是详细步骤,以爬取一个示例网站(如书籍信息网站)为例:

一、准备工作

1. 安装 Scrapy:

bash

pip install scrapy

2. 确认目标网站(以 Books to Scrape 为例,一个练习用的书籍信息网站)。

 

二、步骤详解

1. 创建 Scrapy 项目

首先通过命令创建项目框架,项目名自定义(如  book_crawler ):

bash

scrapy startproject book_crawler

cd book_crawler # 进入项目目录

项目结构说明:

plaintext

book_crawler/

├── scrapy.cfg # 项目部署配置

└── book_crawler/ # 主模块

    ├── items.py # 定义爬取的数据结构(Item)

    ├── middlewares.py # 中间件(处理请求/响应)

    ├── pipelines.py # 数据处理管道(如保存到文件/数据库)

    ├── settings.py # 项目配置(如User-Agent、延迟等)

    └── spiders/ # 存放爬虫代码的目录

 

2. 定义数据结构(Item)

在  items.py  中定义要爬取的数据字段(如书籍名称、价格、评分等),用于规范化存储数据:

python

import scrapy

class BookItem(scrapy.Item):

    title = scrapy.Field() # 书籍标题

    price = scrapy.Field() # 价格

    rating = scrapy.Field() # 评分

    link = scrapy.Field() # 书籍详情页链接

 

3. 编写爬虫(Spider)

在  spiders  目录下创建爬虫文件(如  books.py ),定义爬取规则:

- 起始 URL

- 如何解析页面提取数据

- 如何跟进下一页链接

python

import scrapy

from book_crawler.items import BookItem

class BooksSpider(scrapy.Spider):

    # 爬虫唯一名称(启动时使用)

    name = "books"

    # 允许爬取的域名(限制爬虫范围,避免爬取其他网站)

    allowed_domains = ["books.toscrape.com"]

    # 起始URL(爬虫开始的页面)

    start_urls = ["http://books.toscrape.com/"]

 

    def parse(self, response):

        """解析列表页,提取书籍数据并跟进下一页"""

        # 1. 提取当前页的书籍数据

        for book in response.css('article.product_pod'):

            item = BookItem()

            # 使用CSS选择器提取数据(也可使用XPath)

            item['title'] = book.css('h3 a::attr(title)').get() # 标题

            item['price'] = book.css('p.price_color::text').get() # 价格

            item['rating'] = book.css('p.star-rating::attr(class)').re_first('star-rating (\w+)') # 评分(提取class中的星级)

            item['link'] = response.urljoin(book.css('h3 a::attr(href)').get()) # 详情页链接(拼接完整URL)

            yield item # 将数据传递给管道处理

 

        # 2. 跟进下一页链接

        next_page = response.css('li.next a::attr(href)').get()

        if next_page:

            # 拼接完整URL(如将"catalogue/page-2.html"转为绝对路径)

            next_page_url = response.urljoin(next_page)

            # 发送请求,回调自身(继续解析下一页)

            yield scrapy.Request(next_page_url, callback=self.parse)

 

 

4. 配置项目(settings.py)

 

修改配置文件,优化爬取策略(反爬、效率等):

 

python

# 1. 设置User-Agent(模拟浏览器,避免被识别为爬虫)

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'

 

# 2. 禁止遵循robots.txt(根据网站规则决定,练习网站可关闭)

ROBOTSTXT_OBEY = False

 

# 3. 设置请求延迟(单位:秒,避免请求过快被封)

DOWNLOAD_DELAY = 1

 

# 4. 启用管道(如果需要自定义数据处理,如保存到数据库)

ITEM_PIPELINES = {

    'book_crawler.pipelines.BookCrawlerPipeline': 300, # 优先级:数字越小越先执行

}

 

 

5. 处理数据(Pipeline,可选)

 

如果需要自定义数据处理(如去重、保存到数据库),编辑  pipelines.py 。例如,保存数据到 JSON 文件:

 

python

import json

 

class BookCrawlerPipeline:

    def open_spider(self, spider):

        # 爬虫启动时打开文件

        self.file = open('books.json', 'w', encoding='utf-8')

        self.file.write('[') # JSON数组开始

 

    def close_spider(self, spider):

        # 爬虫结束时关闭文件

        self.file.write(']') # JSON数组结束

        self.file.close()

 

    def process_item(self, item, spider):

        # 处理每条数据,转为JSON字符串写入文件

        line = json.dumps(dict(item), ensure_ascii=False) + ',\n'

        self.file.write(line)

        return item # 传递给下一个管道(如果有)

 

 

6. 运行爬虫并查看结果

 

执行以下命令启动爬虫,结果可保存为 JSON、CSV 等格式:

 

bash

# 直接输出到文件(无需管道)

scrapy crawl books -o books_output.json # 保存为JSON

# 或保存为CSV

scrapy crawl books -o books_output.csv

 

 

运行后,会生成  books_output.json  或  books_output.csv ,包含所有爬取的书籍数据。

 

关键技巧

 

1. 调试选择器:使用  scrapy shell  交互式测试选择器:

bash

scrapy shell "http://books.toscrape.com/"

# 在shell中测试:response.css('h3 a::attr(title)').get()

 

2. 处理动态页面:若数据由 JavaScript 加载,可结合  scrapy-splash  或  playwright  渲染页面。

3. 反爬策略:通过中间件添加随机 User-Agent、代理 IP,或设置  CONCURRENT_REQUESTS  控制并发数。

 

通过以上步骤,即可完成一个基础的 Scrapy 爬虫。对于复杂场景(如登录、分布式爬取),可进一步扩展中间件、管道或集成第三方工具。

 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐