授课语音

开发 Scrapy 框架爬虫

Scrapy 是一个强大的 Python 爬虫框架,适用于大规模数据抓取和处理。开发 Scrapy 爬虫的基本流程通常包括:定义 Item、编写 Spider、配置 Pipelines 和 Middleware、以及运行爬虫等步骤。下面是详细的开发步骤。

1. 创建 Scrapy 项目

首先,确保你已经按照前面的步骤安装并配置了 Scrapy。

1.1 创建一个新的 Scrapy 项目

在命令行中,进入你想创建项目的目录,运行以下命令来创建一个 Scrapy 项目:

scrapy startproject myproject

这会在当前目录下创建一个名为 myproject 的 Scrapy 项目,目录结构如下:

myproject/
    scrapy.cfg
    myproject/
        __init__.py
        items.py
        middlewares.py
        pipelines.py
        settings.py
        spiders/
            __init__.py

2. 定义 Item

Item 是 Scrapy 中的数据结构,用来定义我们要抓取的内容。

2.1 在 items.py 中定义 Item

打开 myproject/items.py,定义你要抓取的数据字段。例如,如果你要抓取博客文章的标题和链接,可以定义如下:

import scrapy

class MyprojectItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()

3. 创建 Spider

Spider 是用来爬取网站并提取数据的组件。Scrapy 提供了多种类型的 Spider(例如 CrawlSpiderXMLFeedSpider),这里以简单的 Spider 为例。

3.1 编写一个 Spider

spiders 目录下,创建一个新的 Python 文件(例如 quotes_spider.py)。这个 Spider 将从网站上抓取数据。以抓取书籍信息为例,Spider 内容如下:

import scrapy
from myproject.items import MyprojectItem

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = ['http://quotes.toscrape.com/']

    def parse(self, response):
        # 提取每个quote的数据
        for quote in response.css('div.quote'):
            item = MyprojectItem()
            item['title'] = quote.css('span.text::text').get()  # 获取引用文本
            item['link'] = quote.css('span small::text').get()  # 获取作者信息
            yield item

        # 翻页功能:获取下一页链接并继续爬取
        next_page = response.css('li.next a::attr(href)').get()
        if next_page:
            yield response.follow(next_page, self.parse)

上述代码的解释:

  • start_urls:指定初始抓取的 URL。
  • parse:处理响应并提取数据。在这里,我们提取每个 quote 的文本和作者。
  • next_page:实现翻页功能,抓取网站的下一页。

4. 配置 Pipelines 和 Middlewares(可选)

Scrapy 的 Pipelines 和 Middlewares 用于处理抓取到的数据、处理请求和响应等。

4.1 配置 Pipeline

pipelines.py 中,你可以定义一个 Pipeline 用于处理抓取到的数据。例如,存储到数据库、文件等。

class MyprojectPipeline:
    def process_item(self, item, spider):
        # 在这里你可以处理抓取的数据
        # 例如将数据保存到文件或数据库
        with open('quotes.json', 'a') as f:
            f.write(str(item) + '\n')
        return item

4.2 启用 Pipeline

settings.py 文件中启用 Pipeline:

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

5. 配置 Settings(可选)

Scrapy 提供了许多设置选项来定制爬虫的行为。例如,你可以配置 User-Agent、请求延迟、并发请求数等。

打开 settings.py,配置一些常见的设置:

# 配置请求延迟,避免过于频繁的请求
DOWNLOAD_DELAY = 2

# 配置 User-Agent,模拟浏览器访问
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'

6. 运行爬虫

在项目根目录下,运行爬虫抓取数据:

scrapy crawl quotes

Scrapy 会开始从 start_urls 指定的地址抓取数据,并使用 parse 方法提取数据。你可以看到终端输出抓取到的内容。

7. 存储数据

Scrapy 支持将抓取到的数据导出为多种格式,如 JSON、CSV 和 XML。运行爬虫时,可以通过以下命令将数据导出为 JSON 文件:

scrapy crawl quotes -o quotes.json

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

8. 高级功能(可选)

8.1 使用选择器

Scrapy 的选择器提供了强大的 XPath 和 CSS 选择功能,帮助你更精确地提取网页内容。例如:

# 使用 CSS 选择器
quote_text = response.css('span.text::text').get()

# 使用 XPath 选择器
quote_text = response.xpath('//span[@class="text"]/text()').get()

8.2 模拟登录

如果网站需要登录才能访问某些内容,可以使用 Scrapy 的 FormRequest 来模拟登录。例如:

def start_requests(self):
    login_url = 'http://example.com/login'
    return [scrapy.FormRequest(login_url, formdata={'username': 'user', 'password': 'pass'}, callback=self.after_login)]

def after_login(self, response):
    # 登录后执行的操作
    pass

8.3 并发控制

Scrapy 默认会并发执行多个请求,这样爬取速度更快。你可以在 settings.py 文件中设置并发请求数:

CONCURRENT_REQUESTS = 16  # 默认并发请求数

9. 小结

通过上面的步骤,你已经学会了如何使用 Scrapy 框架来开发一个基本的爬虫。你可以根据需要扩展爬虫的功能,例如实现登录、处理 Cookies、设置代理、配置请求头等。

Scrapy 的强大之处在于它支持大规模的爬取和高度定制化的功能,适用于数据抓取、爬取数据存储以及自动化数据处理等场景。

去1:1私密咨询

系列课程: