如何使用Scrapy框架?

  • Post category:Python

当我们需要从网络中获取大量数据时,手动爬取数据是非常耗费时间且效率低下的。这时我们可以考虑使用自动化的爬虫框架来实现。Scrapy正是一个强大的Python爬虫框架,它可以帮助我们抓取网页上的数据并将其存储到本地或者通过API接口直接返回给其他应用程序使用。

以下是使用Scrapy框架的步骤:

  1. 安装Scrapy框架(前提是已经安装了Python)
    bash
    pip install scrapy

  2. 创建新的Scrapy项目,可以通过以下命令实现:
    bash
    scrapy startproject your_project_name

    运行该命令后,一个名为 your_project_name 的文件夹将被创建在当前目录下。这个文件夹包括了scrapy框架的基本配置文件和代码结构。

  3. 定义爬虫项目的数据模型, 在 Scrapy 中,将一个网站称之为一个“爬虫”,在每个“爬虫”中需要定义数据模型。数据模型可以定义在 spider.py 文件中,它是爬虫项目中最为重要的文件。

例如,我们想要爬取一个名为 quotes.toscrape.com的网站来获取其中的名言警句, 首先我们需要定义该网站的URL链接, 并在 spider.py 文件中进行如下定义:
“`python
import scrapy

class QuoteSpider(scrapy.Spider):
name = “quote”
start_urls = [
‘http://quotes.toscrape.com/page/1/’,
]

   # 网站爬取的逻辑
   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(),
               'tags': quote.css('div.tags a.tag::text').getall(),
           }

       next_page = response.css('li.next a::attr(href)').get()
       if next_page is not None:
           yield response.follow(next_page, self.parse)

“`
在上述代码片段中,我们定义了一个名为 QuoteSpider的子类,它是Scrapy的一个Spider(爬虫)对象。我们定义了名字为quote的爬虫,它定向去爬取 http://quotes.toscrape.com/page/1/ 网站的数据。parse() 是这个 Project 的基本逻辑驱动方法。

  1. 在定义Spider对象之后,我们需要将其与结果输出机制结合起来。需要生成items.py文件,并定义对应的字段,
    “`python
    import scrapy

class QuotesItem(scrapy.Item):
# 定义字段
text = scrapy.Field()
author = scrapy.Field()
tags = scrapy.Field()
“`
在上述代码中,我们定义了一个 QuotesItem 对象,它表示此爬虫程序中所抓取到的信息。属性text, author和tags分别表示名言内容、作者和标签属性。

  1. 准备最后的输出数据格式。这部分通常可以通过创建 pipelines.py 库来完成。
    “`python
    import pymongo

class MongoPipeline(object):

   collection_name = 'quotes'

   def open_spider(self, spider):
       self.client = pymongo.MongoClient("mongodb://localhost:27017/")
       self.db = self.client["mydatabase"]

   def close_spider(self, spider):
       self.client.close()

   def process_item(self, item, spider):
       self.db[self.collection_name].insert_one(dict(item))
       return item

“`
在上述代码中,我们创建了一个名为 MongoPipeline 的类,用于将抓到的信息存储到 MongoDB 数据库中。

  1. 最后在终端中运行 scrapy crawl quote 命令,开始爬虫任务。当爬虫运行结束后,系统将会将获取到的数据保存到你所指定的实例中。

在Scrapy框架中,我们可以使用许多有用的工具,如Selector和ItemLoader,这些工具可以大大简化数据的提取、格式化和上传等流程。

以下是一个具体的例子,我们将使用Scrap框架来爬取DouBan的电影排行,并将排行榜信息存储到本地文件中:

import scrapy
import re

class DouBanSpider(scrapy.Spider):
    name = "douban"
    allowed_domains = ["movie.douban.com"]
    start_urls = [
        "https://movie.douban.com/top250"
    ]

    def parse(self, response):
        for movie in response.xpath('//div[@class="hd"]'):
            title = movie.xpath('a/span[@class="title"]/text()').extract_first()
            rank = movie.xpath("preceding-sibling::div/span[@class=''][1]/text()").extract_first()

            yield {
                "title": title,
                "rank": re.sub(r'(\xa0)*', '', rank),
            }

        next_page = response.xpath('//span[@class="next"]/a/@href')
        if next_page:
            yield response.follow(next_page[0], self.parse)

在上述代码中,我们定义了一个 DouBanSpider 的子类,用于爬取排名前250的电影;我们定义了start_urls作为抓取页面的起始链接,parse() 方法会对页面进行解析,并获取电影名称和该电影在Top 250中的排名。

最后,我们需要将数据存储到本地文件中。在settings.py文件中配置如下所示:

ITEM_PIPELINES = {'douban.pipelines.DoubanPipeline': 300, }
FEED_URI = 'items.csv'
FEED_FORMAT = 'csv'

配置文件中 ITEM_PIPELINES,这里我们使用了管道机制,用于在运行完爬虫之后将数据存储到本地文件items.csv中。

在完成以上步骤后,我们在终端窗口下运行命令 scrapy crawl douban ,即可得到电影排名信息并存储到文件中。

总结来说,使用Scrapy框架,我们可以快速高效地创建自动化的爬虫程序。这里提供的是非常基础的用法,学习成本相对较低,但是对于数据获取或关联需要更深入的学习。