继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Scrapy入门教程:轻松开始你的网络爬虫之旅

呼如林
关注TA
已关注
手记 486
粉丝 102
获赞 363
概述

Scrapy是一个高度模块化的Python爬虫框架,用于高效地从网站上抓取和提取结构化数据。它基于Twisted异步网络库开发,具备强大的数据提取能力、高效的执行性能和高度可扩展性。Scrapy广泛应用于数据抓取、网站监控、搜索引擎抓取和数据分析等多种场景,并且拥有活跃的社区支持。

Scrapy简介

Scrapy是一个高度模块化的Python爬虫框架,用于抓取网站并从网页中提取结构化的数据。Scrapy是基于Twisted异步网络库开发的,因此具有很高的效率和可扩展性。

Scrapy是什么

Scrapy是一个开源的网络爬虫框架,设计用于从网站上抓取数据。它可以帮助你实现从网页中提取结构化的数据,如文本、图片、视频等。Scrapy框架提供了一系列的功能,使得编写爬虫变得容易且高效。

Scrapy的特点和优势

Scrapy具有以下特点和优势:

  1. 强大的数据提取能力:Scrapy提供了强大的数据提取工具,如XPath和CSS选择器,使得从HTML中解析和提取所需数据变得简单。
  2. 高效的执行性能:Scrapy基于Twisted异步网络库开发,能够高效地处理大量并发的网络请求。
  3. 高度可扩展性:Scrapy框架设计中考虑到了可扩展性,可以通过中间件和管道等模块来扩展功能。
  4. 合理的设计模式:Scrapy遵循了清晰的设计模式,使得代码易于维护和理解。
  5. 社区活跃:Scrapy拥有活跃的社区支持,这使得你在遇到问题时能够轻松找到解决方案。
Scrapy的应用场景

Scrapy广泛应用于各种场景中,常见的应用包括:

  1. 数据抓取:从网站上抓取数据并保存为结构化的形式。
  2. 网站监控:持续监控网站的内容变化,如价格变动、新文章发布等。
  3. 搜索引擎抓取:为抓取大量的网页数据构建搜索引擎。
  4. 数据分析:从网站上抓取数据进行分析,如监测竞争对手的产品价格等。
Scrapy环境搭建
安装Python环境

Scrapy基于Python编写,因此需要先安装Python环境。推荐使用Python 3.6或更高版本。

  1. 访问Python官方网站下载Python安装包;
  2. 选择适合您操作系统的安装包,按照安装向导进行安装;
  3. 安装完成后,可以在命令行中运行python --version验证Python是否安装成功。

示例代码:

# 检查Python版本
python --version
安装Scrapy框架

安装Python环境之后,接下来安装Scrapy框架。

  1. 打开命令行工具;
  2. 使用pip工具安装Scrapy:
pip install scrapy

示例代码:

# 安装Scrapy
pip install scrapy
验证安装是否成功

安装完成后,可以通过运行Scrapy的命令来验证是否安装成功。

  1. 打开命令行工具;
  2. 输入scrapy --version命令:
# 检验Scrapy安装
scrapy --version

输出的信息中包含版本号,说明安装成功。

示例代码:

# 验证Scrapy安装
scrapy --version

输出结果类似于:

scrapy 2.4.1
Scrapy的基本结构
Scrapy项目结构介绍

Scrapy项目的目录结构通常如下:

myproject/
    scrapy.cfg   # Scrapy项目的配置文件
    myproject/
        __init__.py
        items.py   # 定义Item的数据结构
        middlewares.py  # 中间件的定义
        pipelines.py    # 管道的定义
        settings.py     # Scrapy设置
        spiders/
            __init__.py
            myspider.py   # 爬虫的定义
  • scrapy.cfg:Scrapy项目的配置文件。
  • myproject/items.py:定义爬取的Item结构。
  • myproject/spiders/:包含爬虫的目录。
  • myproject/settings.py:包含Scrapy设置。
Spiders(爬虫)详解

Spiders是Scrapy项目中最核心的部分,它用于定义爬虫的逻辑。每个爬虫定义了一个或多个方法,用于处理请求和响应。

定义一个基本的爬虫

创建一个Scrapy项目,并定义一个基本的爬虫。首先,使用Scrapy的命令行工具创建一个新的Scrapy项目:

scrapy startproject myproject

接下来,定义一个爬虫。在myproject/spiders目录下,创建一个名为myspider.py的文件。在文件中定义一个爬虫类,继承自scrapy.Spider,并指定namestart_urlsparse

示例代码:

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://www.example.com']

    def parse(self, response):
        # 解析响应
        title = response.xpath('//title/text()').get()
        self.log(f'Got title: {title}')
  • name:爬虫的名称。
  • start_urls:爬虫将要抓取的URL列表。
  • parse:定义了如何处理响应的方法。
Items(项目)的定义

Item的定义用于指定爬虫从网页上抓取的数据结构。定义一个Item类,继承自scrapy.Item,并使用scrapy.Field()来定义字段。

示例代码:

import scrapy

class MyItem(scrapy.Item):
    title = scrapy.Field()
    url = scrapy.Field()
    description = scrapy.Field()

定义了titleurldescription三个字段。这些字段将用于存储爬取的数据。

Scrapy爬虫实战
创建第一个Scrapy项目
  1. 打开命令行工具;
  2. 使用scrapy startproject命令创建一个新的Scrapy项目:
scrapy startproject exampleproject

输出结果类似于:

New Scrapy project exampleproject, using template directory 'c:\python38\lib\site-packages\scrapy\commands\startproject\templates', created by Scrapy 2.4.1.

创建的项目目录结构如下:

exampleproject/
    scrapy.cfg
    exampleproject/
        __init__.py
        items.py
        middlewares.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
编写爬虫代码

在项目中定义一个爬虫。在exampleproject/spiders目录下,创建一个名为examplespider.py的文件。在文件中定义一个爬虫类,如下所示:

示例代码:

import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'examplespider'
    start_urls = [
        'http://www.example.com',
        'http://www.example.org',
        'http://www.example.net',
    ]

    def parse(self, response):
        self.log(f'Got response from {response.url}')
        title = response.xpath('//title/text()').get()
        self.log(f'Title: {title}')

该爬虫类定义了:

  • name:爬虫的名称。
  • start_urls:爬虫将要抓取的URL列表。
  • parse:定义了如何处理响应的方法。
数据处理和存储

Scrapy提供了多种方式来处理和存储数据。以下是几种常见的数据处理和存储方式:

使用管道处理数据

定义一个管道类,继承自scrapy.ItemPipeline,并定义数据处理方法。在settings.py文件中开启管道。

示例代码:

import scrapy

class ExamplePipeline(object):
    def process_item(self, item, spider):
        item['title'] = item['title'].strip()
        return item

存储数据到数据库

定义一个管道类,将数据存储到数据库中。例如,可以使用SQLite数据库。

示例代码:

import sqlite3
from scrapy.exceptions import DropItem

class SQLitePipeline(object):
    def open_spider(self, spider):
        self.connection = sqlite3.connect('example.db')
        self.cursor = self.connection.cursor()
        self.cursor.execute('CREATE TABLE IF NOT EXISTS scraped (title TEXT, url TEXT, description TEXT)')
        self.connection.commit()

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

    def process_item(self, item, spider):
        self.cursor.execute('INSERT INTO scraped VALUES (?, ?, ?)', (item['title'], item['url'], item['description']))
        self.connection.commit()
        return item

settings.py文件中开启管道:

FEED_EXPORTERS = {
    'sqlite': 'exampleproject.pipelines.SQLitePipeline',
}
中间件和管道的使用

Scrapy提供了中间件和管道两种扩展机制。

中间件

中间件可以用于处理请求和响应,如添加自定义的请求头、修改响应内容等。定义一个中间件类,继承自scrapy.spidermiddlewares.SpiderMiddleware,并在settings.py文件中启用中间件。

示例代码:

from scrapy import signals

class ExampleMiddleware(object):
    @classmethod
    def from_crawler(cls, crawler):
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_request(self, request, spider):
        # 添加自定义请求头
        request.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
        return request

    def process_response(self, request, response, spider):
        # 修改响应内容
        response.text = response.text.replace('example', 'example modified')
        return response

    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s' % spider.name)

settings.py文件中启用中间件:

SPIDER_MIDDLEWARES = {
    'exampleproject.middlewares.ExampleMiddleware': 543,
}

管道

管道可以用于处理和存储爬取的数据。定义一个管道类,继承自scrapy.item.ItemPipeline,并在settings.py文件中启用管道。

示例代码:

class ExamplePipeline(object):
    def process_item(self, item, spider):
        item['title'] = item['title'].strip()
        return item

settings.py文件中启用管道:

ITEM_PIPELINES = {
    'exampleproject.pipelines.ExamplePipeline': 300,
}
请求和响应的处理

Scrapy允许你自定义请求的发送和响应的处理方式。

自定义请求的发送

定义一个Spider类,使用scrapy.Request方法发送自定义的请求。

示例代码:

import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'
    start_urls = ['http://www.example.com']

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, callback=self.parse, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'})

处理响应

定义一个Spider类,使用parse方法处理响应。

示例代码:

def parse(self, response):
    self.log(f'Got response from {response.url}')
    title = response.xpath('//title/text()').get()
    self.log(f'Title: {title}')
异步请求和延迟处理

Scrapy支持异步请求和延迟处理,以提高性能。

异步请求

在Spider类中使用scrapy.Request方法发送异步请求。

示例代码:

import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'
    start_urls = ['http://www.example.com']

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, callback=self.parse, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'})

延迟处理

定义一个Spider类,使用DOWNLOAD_DELAY设置延迟时间。

示例代码:

DOWNLOAD_DELAY = 2  # 2秒延迟

这将使Scrapy在每次请求之间等待2秒。

Scrapy常见问题及解决方案
常见错误及解决方法

Scrapy在使用过程中可能会遇到一些常见的错误,以下是一些常见错误及解决方法:

  1. 403 Forbidden:网站可能检测到你的请求频率过高,导致被封禁。可以通过设置User-Agent或使用代理来解决。
  2. XPath选择器错误:如果XPath表达式不正确,会导致无法解析到数据。可以使用浏览器的开发者工具检查DOM结构。
  3. 内存溢出:如果处理的数据量过大,可能会导致内存溢出。可以使用管道中的item处理方法限制数据大小。

解决403 Forbidden

settings.py文件中设置代理:

示例代码:

HTTP_PROXY = 'http://123.123.123.123:8080'

在Spider类中设置User-Agent:

示例代码:

class ExampleSpider(scrapy.Spider):
    name = 'example'
    start_urls = ['http://www.example.com']

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, callback=self.parse, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'})
性能优化技巧

Scrapy提供了多种性能优化技巧:

  1. 使用Twisted异步网络库:Scrapy基于Twisted异步网络库开发,能够高效地处理大量并发的网络请求。
  2. 限制下载延迟:通过设置DOWNLOAD_DELAY限制每次请求之间的延迟时间。
  3. 使用中间件和管道:通过中间件和管道来扩展功能,如自定义请求头、数据处理等。

示例代码:

DOWNLOAD_DELAY = 2  # 2秒延迟
遵守Robots协议

网站通常使用Robots协议来规定哪些页面可以被爬虫抓取。Scrapy默认遵守Robots协议,可以通过设置ROBOTSTXT_OBEY来控制是否遵守。

示例代码:

ROBOTSTXT_OBEY = True
避免被网站封禁的策略

网站可能会检测到频繁的请求,导致被封禁。以下是一些避免被网站封禁的策略:

  1. 使用代理:通过设置代理来隐藏真实的IP地址。
  2. 设置User-Agent:通过设置User-Agent模拟不同的浏览器。
  3. 限制请求频率:通过设置DOWNLOAD_DELAY限制每次请求之间的延迟时间。

示例代码:

HTTP_PROXY = 'http://123.123.123.123:8080'
DOWNLOAD_DELAY = 2
打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP