Python高效爬虫——scrapy介绍与使用

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Scrapy是一个快速且高效的网页抓取框架,用于抓取网站并从中提取结构化数据。它可用于多种用途,从数据挖掘到监控和自动化测试。相比于自己通过requests等模块开发爬虫,scrapy能极大的提高开发效率,包括且不限于以下原因:1. 它是一个异步框架,并且能通过配置调节并发量,还可以针对域名或ip进行精准控制2. 内置了xpath等提取器,方便提取结构化数据3. 有爬虫中间件和下载中间件,可以轻松地添加、修改或删除请求和响应的处理逻辑,从而增强了框架的可扩展性4. 通过管道方式存储数据,更加方便快捷的开发各种数据储存方式

介绍

Scrapy是一个快速且高效的网页抓取框架,用于抓取网站并从中提取结构化数据。它可用于多种用途,从数据挖掘到监控和自动化测试。


相比于自己通过requests等模块开发爬虫,scrapy能极大的提高开发效率,包括且不限于以下原因:

  1. 它是一个异步框架,并且能通过配置调节并发量,还可以针对域名或ip进行精准控制
  2. 内置了xpath等提取器,方便提取结构化数据
  3. 有爬虫中间件和下载中间件,可以轻松地添加、修改或删除请求和响应的处理逻辑,从而增强了框架的可扩展性
  4. 通过管道方式存储数据,更加方便快捷的开发各种数据储存方式

安装

conda:

conda install -c conda-forge scrapy

pip:

pip install Scrapy

架构

1716893875619.jpg

各个模块的功能介绍

  1. 引擎(Engine) :
  • 负责控制整个爬取流程的核心模块。
  • 将请求分配给下载器,并处理从下载器返回的响应。
  • 负责调度器和下载器之间的协调工作,确保请求的顺利处理和数据的流通。
  1. 调度器(Scheduler) :
  • 接受引擎发来的请求,并根据一定的策略(如FIFO、LIFO等)将这些请求放入队列中,以便后续的处理。
  • 防止重复请求的生成,确保爬取过程的有效性。
  1. 下载器(Downloader) :
  • 负责下载网页数据,发送HTTP请求并接收响应。
  • 可配置代理、用户代理、cookies等信息,以模拟浏览器行为。
  • 处理HTTP响应,将结果传递给引擎。
  1. 中间件(Middleware) :
  • 拦截和处理引擎、调度器、下载器之间的请求和响应。
  • 可以在请求发出前进行预处理,或在响应返回后进行后处理。
  • 可以进行用户自定义的操作,例如添加代理、修改请求头等。
  1. 爬虫(Spider) :
  • 用户编写的用于定义如何爬取特定网站的类。
  • 包括起始URL、如何跟踪链接、如何提取数据等。
  • 定义如何解析下载的页面并提取所需数据的规则。
  1. 项目管道(Item Pipeline) :
  • 处理爬取到的数据,包括清洗、验证、存储等操作。
  • 通过多个项目管道进行数据处理,可以灵活应对不同类型数据的处理需求。
  1. 调度器中间件(Scheduler Middleware) :
  • 用于对请求的调度过程进行自定义的拦截和处理。
  • 可以在请求入队列前或出队列后进行一些处理,例如动态修改优先级、过滤请求等。
  1. 扩展(Extensions) :
  • 用于监听Scrapy的信号、修改配置、添加新命令等。
  • 可以用于监控爬取过程、记录日志、实现定制化需求等。


以上是对Scrapy框架中各个模块的详细介绍,每个模块都有其独特的功能和作用,通过它们的协作,Scrapy能够完成从网页爬取到数据处理的整个流程,在接下来的文章中,也会有各个模块的开发教程

运行流程

  1. 配置爬虫(Spider)并启动引擎(Engine) :
  • 用户编写具体的爬虫类,定义了如何爬取特定网站的规则。
  • 用户通过命令行或代码方式启动Scrapy引擎,指定要运行的爬虫。
  1. 引擎调度请求到调度器(Scheduler) :
  • 引擎将起始请求发送给调度器,调度器根据一定的策略将请求放入队列中,等待下载器处理。
  • 调度器会控制请求的优先级、去重逻辑等。
  1. 下载器(Downloader)获取并处理请求:
  • 下载器从调度器获取请求,然后发送HTTP请求到目标网站。
  • 下载器接收目标网站的HTTP响应,将响应传递给引擎。
  1. 引擎将响应发送给Spider处理:
  • 引擎接收到下载器返回的响应,然后将响应发送给对应的Spider进行处理。
  • Spider根据预定义的规则解析响应,提取所需的数据,并生成新的请求或数据项。
  1. 处理数据项(Item) :
  • 爬虫将从页面中提取的数据封装成数据项(Item),并将其发送给项目管道(Item Pipeline)进行处理。
  • 项目管道可以负责数据的清洗、验证、存储等操作,用户可以自定义多个项目管道,以便处理不同类型的数据。
  1. 数据持久化:
  • 经过项目管道处理后的数据项可以被持久化存储到数据库、文件等目的地。
  1. 循环执行直到完成:
  • 整个爬取流程会循环执行,直到队列中没有新的请求,或者爬取任务被手动终止。
  1. 扩展和监控:
  • 用户可以通过扩展(Extensions)来监听Scrapy的信号、修改配置、添加新命令等,以实现定制化需求。
  • 可以使用日志和其他监控工具来监控爬取过程,确保爬虫正常运行。


总的来说,Scrapy运行模式是基于异步事件驱动的,各个模块之间通过事件和回调函数进行交互,整个爬取过程由引擎统一协调控制。这种模式使得Scrapy能够高效地处理大规模的爬取任务,并且具有良好的可扩展性和灵活性。

使用

使用下述命令创建第一个scrapy项目:scrapy startproject JuejinProject

其中JuejinProject是项目名,会得到如下结构:

1716893951628.jpg

各文件作用如下:

  • scrapy.cfg:项目的配置文件,可以把框架相关配置写入。
  • JuejinProject/items.py:定义结构化的数据模型。
  • JuejinProject/pipelines.py:用来持久化存储数据模型。
  • JuejinProject/settings.py:项目的设置文件。
  • JuejinProject/spiders/:爬虫存放目录。

使用下述命令创建爬虫:

scrapy genspider toscrape quotes.toscrape.com/page/1/格式为"scrapy genspider 爬虫名 起始url" 这时你会发现在spiders路径下多了一个toscrape.py文件,添加注释后内容如下:

import scrapy
class ToscrapeSpider(scrapy.Spider):
    # 爬虫名
    name = "toscrape"
    # 允许的域名
    allowed_domains = ["quotes.toscrape.com"]
    # 起始url,第一个请求
    start_urls = ["https://quotes.toscrape.com/page/1/"]
    def parse(self, response):
        """
        默认的解析方法,请求得到的response对象会传入此方法
        :param response: 
        :return: 
        """
        pass

想使用xpath解析出指定字段需要使用xpath相关方法:

import scrapy
class ToscrapeSpider(scrapy.Spider):
    # 爬虫名
    name = "toscrape"
    # 允许的域名
    allowed_domains = ["quotes.toscrape.com"]
    # 起始url,第一个请求
    start_urls = ["https://quotes.toscrape.com/page/1/"]
    def parse(self, response):
        """
        默认的解析方法,请求得到的response对象会传入此方法
        :param response:
        :return:
        """
        quotes = response.xpath('//div[@class="quote"]')
        for quote in quotes:
            quote_text = quote.xpath('.//span[@class="text"]/text()').extract_first()
            print(quote_text)
if __name__ == '__main__':
    # 使用此方法可以对爬虫进行debug
    from scrapy.cmdline import execute
    execute('scrapy crawl toscrape'.split())

运行这段代码就可以得到页面上的人物发言了:

1716893973420.jpg

这只是最简单的一个例子,将数据输出到了控制台,在生产中,会有更复杂的问题需要解决,比如遇到反爬怎么处理?怎么把数据存入数据库?代码异常如何及时发现?网站有反爬怎么处理?在下边的章节,我将逐个解决遇到的问题,让scrapy更好的为你所用。

相关文章
|
3天前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
18 3
|
3天前
|
数据采集 API 开发者
🚀告别网络爬虫小白!urllib与requests联手,Python网络请求实战全攻略
在网络的广阔世界里,Python凭借其简洁的语法和强大的库支持,成为开发网络爬虫的首选语言。本文将通过实战案例,带你探索urllib和requests两大神器的魅力。urllib作为Python内置库,虽API稍显繁琐,但有助于理解HTTP请求本质;requests则简化了请求流程,使开发者更专注于业务逻辑。从基本的网页内容抓取到处理Cookies与Session,我们将逐一剖析,助你从爬虫新手成长为高手。
20 1
|
12天前
|
数据采集 JavaScript 前端开发
构建你的首个Python网络爬虫
【9月更文挑战第8天】本文将引导你从零开始,一步步构建属于自己的Python网络爬虫。我们将通过实际的代码示例和详细的步骤解释,让你理解网络爬虫的工作原理,并学会如何使用Python编写简单的网络爬虫。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你打开网络数据获取的新世界。
|
12天前
|
数据采集 机器学习/深度学习 搜索推荐
Python爬虫技术基础与应用场景详解
本文介绍了爬虫技术的基本概念、原理及应用场景,包括数据收集、价格监测、竞品分析和搜索引擎优化等。通过一个实战案例展示了如何使用Python爬取电商网站的商品信息。强调了在使用爬虫技术时需遵守法律法规和道德规范,确保数据抓取的合法性和合规性。
|
15天前
|
数据采集 JavaScript 前端开发
打造你的Python爬虫:从基础到进阶
【9月更文挑战第5天】在数字信息泛滥的时代,掌握一项技能能让我们更好地筛选和利用这些资源。本文将带你了解如何用Python构建一个基本的网页爬虫,进而拓展到更复杂的数据抓取任务。无论你是编程新手还是有一定经验的开发者,跟随这篇文章的步伐,你将能够实现自动化获取网络数据的目标。准备好了吗?让我们一起潜入代码的世界,解锁新的可能!
WK
|
19天前
|
数据采集 XML 安全
常用的Python网络爬虫库有哪些?
Python网络爬虫库种类丰富,各具特色。`requests` 和 `urllib` 简化了 HTTP 请求,`urllib3` 提供了线程安全的连接池,`httplib2` 则具备全面的客户端接口。异步库 `aiohttp` 可大幅提升数据抓取效率。
WK
36 1
|
20天前
|
数据采集 JavaScript 前端开发
构建简易Python爬虫:抓取网页数据入门指南
【8月更文挑战第31天】在数字信息的时代,数据抓取成为获取网络资源的重要手段。本文将引导你通过Python编写一个简单的网页爬虫,从零基础到实现数据抓取的全过程。我们将一起探索如何利用Python的requests库进行网络请求,使用BeautifulSoup库解析HTML文档,并最终提取出有价值的数据。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你打开数据抓取的大门。
|
21天前
|
数据采集 存储 数据库
构建你的第一个Python爬虫:从入门到实践
【8月更文挑战第31天】在数字时代的浪潮中,数据如同新时代的石油,而网络爬虫则是开采这些数据的钻头。本文将引导初学者了解并实现一个基础的网络爬虫,使用Python语言,通过实际代码示例,展示如何收集和解析网页信息。我们将一起探索HTTP请求、HTML解析以及数据存储等核心概念,让你能够快速上手并运行你的首个爬虫项目。
|
20天前
|
数据采集 存储 JavaScript
Python 爬虫实战:从入门到精通
【8月更文挑战第31天】 本文将带你走进 Python 爬虫的世界,从基础的请求和解析开始,逐步深入到反爬策略的应对和数据存储。我们将通过实际案例,一步步构建一个功能完整的爬虫项目。无论你是编程新手还是有一定经验的开发者,都能在这篇文章中找到适合自己的学习路径。让我们一起探索数据的海洋,揭开网络信息的神秘面纱。
|
21天前
|
数据采集 存储 JavaScript
Python 爬虫实战:从入门到精通
【8月更文挑战第31天】 本文将带你走进 Python 爬虫的世界,从基础的请求和解析开始,逐步深入到反爬策略的应对和数据存储。我们将通过实际案例,一步步构建一个功能完整的爬虫项目。无论你是编程新手还是有一定经验的开发者,都能在这篇文章中找到适合自己的学习路径。让我们一起探索数据的海洋,揭开网络信息的神秘面纱。