Scrapy是一个用于爬取网站数据并提取结构性数据的Python应用框架,广泛应用于数据挖掘、信息处理或存储历史数据等场景。以下是对Scrapy的详细介绍:
一、Scrapy架构Scrapy的整体架构由多个组件构成,包括Scrapy引擎(ScrapyEngine)、调度器(Scheduler)、下载器(Downloader)、爬虫(Spiders)和数据项管道(itemPipeline)。这些组件通过中间件相互连接,共同完成数据的爬取和处理任务。
- Scrapy引擎:负责控制系统所有组件的数据流,并在某些动作发生时触发事件。
- 调度器:接收引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。
- 下载器:用于下载网页内容,并将下载好的网页返回给引擎。
- 爬虫:由用户编写,用于从特定的网页中提取需要的信息,即实体(Item)。用户也可以从中提取出链接,让Scrapy继续爬取下一个页面。
- 数据项管道:负责处理爬虫从网页中抽取的数据,主要功能是持久化实体、验证实体的有效性、清除不需要的信息。
Scrapy的数据流由引擎控制,其流程如下:
- 引擎打开一个网站,找到处理该网站的爬虫,并询问爬虫第一次要爬取的URL。
- 引擎从爬虫中获取第一次要爬取的URL,并以Request方式发送给调度器。
- 引擎向调度器请求下一个要爬取的URL。
- 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载器中间件转发给下载器。
- 下载器下载给定的网页,下载完毕后生成一个该页面的结果,并将其通过下载器中间件发送给引擎。
- 引擎从下载器中接收到下载结果,并通过爬虫中间件发送给爬虫进行处理。
- 爬虫对结果进行处理,并返回爬取到的数据项及需要跟进的新的URL给引擎。
- 引擎将爬取到的数据项发送给数据项管道,将爬虫生成的新的请求发送给调度器。
- 从步骤3开始重复,直到调度器中没有更多的请求,引擎关闭该网站。
二、Scrapy应用案例以下是一个使用Scrapy从当当网站抓取书籍信息的案例:
创建项目:
scrapy startproject tutorial该命令将会创建包含必要文件的tutorial目录。
定义Item:
在items.py文件中定义要抓取的数据模型,例如:
import scrapyclass DangItem(scrapy.Item): title = scrapy.Field() link = scrapy.Field() desc = scrapy.Field() price = scrapy.Field()编写Spider:
在spiders目录下创建Spider文件,例如dang_spider.py,定义爬虫逻辑:
import scrapyfrom tutorial.items import DangItemclass DangSpider(scrapy.Spider): name = "dangdang" allowed_domains = ["dangdang.com"] start_urls = [ "http://search.dangdang.com/?key=python
核心编程&act=click", "http://search.dangdang.com/?key=python
基础教程&act=click" ] def parse(self, response): # 使用XPath解析网页内容 books = response.xpath('//ul/li') for book in books: item = DangItem() item['title'] = book.xpath('.//a/text()').extract() item['link'] = book.xpath('.//a/@href').extract() item['desc'] = book.xpath('.//p/text()').extract() item['price'] = book.xpath('.//span/text()').extract() yield item爬取数据:
在项目根目录下执行爬虫:
scrapy crawl dangdang -o items.json该命令将启动爬虫,并将爬取的数据以JSON格式保存到items.json文件中。
通过以上步骤,就可以使用Scrapy框架从当当网站抓取所需的书籍信息,并进行进一步的处理和分析。