4. 编写你的第一个Scrapy爬虫

4. 编写你的第一个Scrapy爬虫

在本篇文章中,我们将开始编写一个简单的 Scrapy 爬虫,帮助你理解如何从一个网站抓取数据。我们将通过一个实际的例子,演示如何创建一个 Scrapy 爬虫,从目标网页获取信息,并将其保存到本地。

4.1 Scrapy爬虫的基本构成

Scrapy 爬虫的基本构成很简单,通常包含以下几个关键部分:

  1. name:爬虫的名字,用于在运行时识别。
  2. start_urls:起始的 URL 列表,爬虫从这些 URL 开始抓取。
  3. parse():解析函数,用于处理抓取到的响应数据,并提取我们需要的内容。

首先,我们来创建一个简单的爬虫,它从一个名为“Quotes to Scrape”的网站抓取名言和作者信息。

4.2 创建一个Scrapy爬虫
  1. 创建一个新的爬虫: 打开项目目录,在 spiders/ 文件夹内创建一个新的爬虫文件,命名为 quotes_spider.py

  2. 定义爬虫类: 在文件中编写以下内容:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = 'quotes'  # 爬虫的名称
    start_urls = ['https://quotes.toscrape.com/']  # 起始URL列表

    def parse(self, response):
        # 提取网页中的名言和作者信息
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.css('span small::text').get(),
            }

        # 获取下一页的链接
        next_page = response.css('li.next a::attr(href)').get()
        if next_page:
            yield response.follow(next_page, self.parse)  # 递归抓取下一页
4.3 解析爬虫代码
  • name:这是爬虫的名称,运行爬虫时需要用到。

  • start_urls:一个包含起始 URL 的列表,爬虫会从这些 URL 开始抓取。

  • parse():这是一个解析函数,Scrapy 会自动调用它来处理网页响应。我们通过 CSS 选择器来提取网页中的数据。

    • quote.css('span.text::text').get():选择每个名言的文本内容。
    • quote.css('span small::text').get():选择每个名言的作者名字。

    接着,我们通过 response.follow() 方法递归抓取下一页的内容,实现分页抓取。

4.4 运行爬虫
  1. 运行爬虫: 保存 quotes_spider.py 文件后,打开命令行,进入到 Scrapy 项目的根目录,运行以下命令:
scrapy crawl quotes

这时,Scrapy 会开始从 start_urls 列表中的网址抓取数据,并输出每个名言和对应的作者。

  1. 将数据保存到文件: 你可以将抓取的数据保存到一个文件中,比如 JSON 格式。运行以下命令:
scrapy crawl quotes -o quotes.json

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

  1. 查看抓取的数据: 你可以打开 quotes.json 文件,查看抓取到的名言和作者数据。
[
  {
    "text": "“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”",
    "author": "Albert Einstein"
  },
  {
    "text": "“It is our choices that show what we truly are, far more than our abilities.”",
    "author": "J.K. Rowling"
  },
  ...
]
4.5 Scrapy爬虫中的一些常用功能

在实际爬取过程中,我们经常会用到一些 Scrapy 的特性,下面介绍几个常用的功能:

  1. 提取多个数据项: 如果页面包含多个数据项,可以使用 for 循环来遍历所有数据项。上面我们已经演示了如何从每个 div.quote 中提取文本和作者。

  2. 处理分页: 在很多网站中,数据是分页展示的。我们使用 response.follow() 方法来处理分页,并递归地抓取每一页的内容。在 parse() 方法中,调用 response.follow(next_page, self.parse) 可以获取到下一页的链接,并继续抓取。

  3. 设置请求头: 在某些网站上,为了模拟真实用户访问,可能需要自定义请求头。你可以在爬虫中设置 headers 来模拟浏览器请求:

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, headers={
                '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'
            })
    
  4. 处理重定向和错误页面: Scrapy 会自动处理 HTTP 重定向(如 301、302)和常见的错误页面(如 404)。但如果需要自定义处理,可以使用 Scrapy 的 errback 参数来指定错误回调函数:

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, callback=self.parse, errback=self.handle_error)
    
    def handle_error(self, failure):
        # 处理错误
        self.logger.error(f"Request failed: {failure}")
    
4.6 扩展爬虫功能

爬虫并不只是抓取数据,你还可以利用 Scrapy 的强大功能来定制爬虫的行为:

  1. 设置下载延迟: 为了避免对目标网站造成过大压力,Scrapy 默认会设置一个下载延迟。如果你想自定义延迟,可以在 settings.py 文件中配置:

    DOWNLOAD_DELAY = 2  # 设置每个请求之间的延迟为 2 秒
    
  2. 使用代理: 如果你需要使用代理来抓取数据,可以通过 Scrapy 中间件来实现。可以在 settings.py 中设置代理:

    DOWNLOADER_MIDDLEWARES = {
        'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1,
    }
    
    HTTP_PROXY = 'http://your_proxy:port'
    
  3. 使用用户代理: 通过 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'
    
总结

在本篇文章中,我们详细介绍了如何使用 Scrapy 编写一个简单的爬虫,从目标网页抓取名言和作者信息。通过这个例子,你已经掌握了 Scrapy 爬虫的基本用法,并了解了如何设置请求、提取数据和处理分页。随着你的爬虫经验积累,你可以通过 Scrapy 提供的更多功能,灵活地定制你的爬虫,并进行高效的数据抓取。

下一篇,我们将深入讨论 Scrapy 中的 Item、Pipeline 和数据存储,以帮助你更好地处理和存储抓取的数据。

你可能感兴趣的:(scrapy,爬虫,c++)