📜  Scrapy – 壳(1)

📅  最后修改于: 2023-12-03 14:47:18.874000             🧑  作者: Mango

Scrapy – 壳

Scrapy 是一个用于抓取网站内容的 Python 库。它是由 Scrapinghub 公司开发的,目的是为了降低抓取网站数据时的复杂性和难度。Scrapy 通过编写一些爬虫脚本来实现数据抓取功能,且支持异步操作,处理大量数据时非常高效。

Scrapy 提供了一套完整的工具集,几行代码就能完成一个基本的爬虫项目。Scrapy 的工作流程可以分为以下几个步骤:

  1. 定义 Item:定义目标数据对象。
  2. 编写 Spider:定义如何抓取数据。
  3. 存储 Item:将抓取的数据存储起来。
  4. 运行爬虫:启动爬虫并开始抓取。

以下是创建一个 Scrapy 项目的步骤:

scrapy startproject myproject

创建完 Scrapy 项目后,需要编写 Spider 脚本来实现如何抓取数据。Spider 是一个实现了抓取流程的 Python 类,Scrapy 针对不同网页结构提供了多种 Spider。Spider 脚本通常包括以下几个部分:

  1. URL 的初始请求。
  2. 页面的解析方法。
  3. 获得下一页的处理方式。

以下是一个简单的 Spider 实现:

import scrapy

class MySpider(scrapy.Spider):
    name = "myspider"
    allowed_domains = ["example.com"]
    start_urls = [
        "http://www.example.com/1",
        "http://www.example.com/2",
        "http://www.example.com/3",
    ]

    def parse(self, response):
        for item in response.xpath('//div[@class="post"]'):
            yield {
                'title': item.xpath('a/text()').extract_first(),
                'link': item.xpath('a/@href').extract_first(),
                'desc': item.xpath('p/text()').extract_first(),
            }

        next_page = response.xpath('//a[@class="next-page"]/@href')
        if next_page:
            url = response.urljoin(next_page[0].extract())
            yield scrapy.Request(url, self.parse)

在编写 Spider 脚本完成数据抓取后,需要将数据存储至数据库或以其它方式处理。Scrapy 可以将数据保存至多种形式,包括 CSV、JSON、XML 格式。

以下是使用 ItemPipeline 存储到 JSON 的方法:

import json

class JsonWriterPipeline(object):

    def open_spider(self, spider):
        self.file = open('items.jl', 'w')

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

    def process_item(self, item, spider):
        line = json.dumps(dict(item)) + "\n"
        self.file.write(line)
        return item

最后,可以通过以下命令启动 Scrapy 爬虫:

scrapy crawl myspider

Scrapy 内置了一些强大的工具和特性,它简化了抓取大量、复杂数据的流程。对于需要抓取大量数据的应用,Scrapy 是一个非常好的选择。