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

互联架构唠唠嗑 2024-06-01 10:21:32
介绍

Scrapy是一个快速且高效的网页抓取框架,用于抓取网站并从中提取结构化数据。它可用于多种用途,从数据挖掘到监控和自动化测试。相比于自己通过requests等模块开发爬虫,scrapy能极大的提高开发效率,包括且不限于以下原因:

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

conda:

conda install -c conda-forge scrapy

pip:

pip install Scrapy架构

各个模块的功能介绍

1.引擎(Engine) :

负责控制整个爬取流程的核心模块。将请求分配给下载器,并处理从下载器返回的响应。负责调度器和下载器之间的协调工作,确保请求的顺利处理和数据的流通。

2.调度器(Scheduler) :

接受引擎发来的请求,并根据一定的策略(如FIFO、LIFO等)将这些请求放入队列中,以便后续的处理。防止重复请求的生成,确保爬取过程的有效性。

3.下载器(Downloader) :

负责下载网页数据,发送HTTP请求并接收响应。可配置代理、用户代理、cookies等信息,以模拟浏览器行为。处理HTTP响应,将结果传递给引擎。

4.中间件(Middleware) :

拦截和处理引擎、调度器、下载器之间的请求和响应。可以在请求发出前进行预处理,或在响应返回后进行后处理。可以进行用户自定义的操作,例如添加代理、修改请求头等。

5.爬虫(Spider) :

用户编写的用于定义如何爬取特定网站的类。包括起始URL、如何跟踪链接、如何提取数据等。定义如何解析下载的页面并提取所需数据的规则。

6.项目管道(Item Pipeline) :

处理爬取到的数据,包括清洗、验证、存储等操作。通过多个项目管道进行数据处理,可以灵活应对不同类型数据的处理需求。

7.调度器中间件(Scheduler Middleware) :

用于对请求的调度过程进行自定义的拦截和处理。可以在请求入队列前或出队列后进行一些处理,例如动态修改优先级、过滤请求等。

8.扩展(Extensions) :

用于监听Scrapy的信号、修改配置、添加新命令等。可以用于监控爬取过程、记录日志、实现定制化需求等。

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

运行流程

1.配置爬虫(Spider)并启动引擎(Engine) :

用户编写具体的爬虫类,定义了如何爬取特定网站的规则。用户通过命令行或代码方式启动Scrapy引擎,指定要运行的爬虫。

2.引擎调度请求到调度器(Scheduler) :

引擎将起始请求发送给调度器,调度器根据一定的策略将请求放入队列中,等待下载器处理。调度器会控制请求的优先级、去重逻辑等。

3.下载器(Downloader)获取并处理请求:

下载器从调度器获取请求,然后发送HTTP请求到目标网站。下载器接收目标网站的HTTP响应,将响应传递给引擎。

4.引擎将响应发送给Spider处理:

引擎接收到下载器返回的响应,然后将响应发送给对应的Spider进行处理。Spider根据预定义的规则解析响应,提取所需的数据,并生成新的请求或数据项。

5.处理数据项(Item) :

爬虫将从页面中提取的数据封装成数据项(Item),并将其发送给项目管道(Item Pipeline)进行处理。项目管道可以负责数据的清洗、验证、存储等操作,用户可以自定义多个项目管道,以便处理不同类型的数据。

6.数据持久化:

经过项目管道处理后的数据项可以被持久化存储到数据库、文件等目的地。

7.循环执行直到完成:

整个爬取流程会循环执行,直到队列中没有新的请求,或者爬取任务被手动终止。

8.扩展和监控:

用户可以通过扩展(Extensions)来监听Scrapy的信号、修改配置、添加新命令等,以实现定制化需求。可以使用日志和其他监控工具来监控爬取过程,确保爬虫正常运行。

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

使用

使用下述命令创建第一个scrapy项目:scrapy startproject JuejinProject其中JuejinProject是项目名,会得到如下结构:

各文件作用如下:

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 scrapyclass 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 scrapyclass 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())

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

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

作者:炼数成金链接:https://juejin.cn/post/7373507761127505971

0 阅读:37

互联架构唠唠嗑

简介:感谢大家的关注