各人好,欢迎继承关注本系列爬虫教程!本篇博客将为各人介绍如何使用 Scrapy 框架构建一个高效、可扩展的爬虫项目。Scrapy 是一个功能强大的爬虫框架,它内置了许多精良的特性,如异步请求、内置中间件、Item 管道等,非常得当用于大规模数据采集和项目维护。
在本文中,我们将以抓取 Quotes to Scrape 网站为例,详细讲授如何从创建项目、定义数据结构、编写爬虫、数据洗濯到数据存储的全过程,并附上详细的代码及中文注释,资助你快速把握 Scrapy 的使用方法。
1. Scrapy框架简介
Scrapy 是一个开源的、基于 Python 的爬虫框架,主要特点包罗:
- 高性能:基于异步 I/O 实现,可以或许高效抓取海量数据。
- 模块化筹划:项目结构清晰,便于扩展和维护。
- 内置多种组件:支持中间件、管道、调理器等,满足复杂爬虫项目的需求。
2. 环境准备与项目创建
2.1 安装Scrapy
首先,通过 pip 安装 Scrapy:
2.2 创建Scrapy项目
在下令行中执行以下下令创建一个新的 Scrapy 项目(项目名称这里取为 myproject):
- scrapy startproject myproject
复制代码 项目目录结构如下:
- myproject/
- │ scrapy.cfg
- └───myproject/
- │ __init__.py
- │ items.py # 定义数据结构
- │ middlewares.py
- │ pipelines.py # 数据处理与存储
- │ settings.py # 项目配置
- └───spiders/
- │ __init__.py
- │ quotes_spider.py # 爬虫代码
复制代码 3. 编写Scrapy爬虫
3.1 定义数据结构(items.py)
在 myproject/items.py 中定义我们要抓取的数据结构,本例中抓取“名言”的文本、作者及标签:
- import scrapy
- class QuoteItem(scrapy.Item):
- # 定义抓取的字段
- text = scrapy.Field() # 名言文本
- author = scrapy.Field() # 作者
- tags = scrapy.Field() # 标签列表
复制代码 3.2 编写爬虫代码(spiders/quotes_spider.py)
在 myproject/spiders/quotes_spider.py 中编写爬虫代码,抓取 Quotes to Scrape 网站的内容:
- import scrapy
- from myproject.items import QuoteItem # 导入定义好的数据结构
- class QuotesSpider(scrapy.Spider):
- name = "quotes" # 定义爬虫名称,在运行时使用
- allowed_domains = ["quotes.toscrape.com"] # 允许抓取的域名
- start_urls = [
- "http://quotes.toscrape.com/" # 初始请求的URL
- ]
- def parse(self, response):
- """
- 解析网页内容,提取名言信息并处理翻页
- """
- # 遍历页面中所有包含名言信息的块
- for quote in response.css("div.quote"):
- item = QuoteItem() # 创建一个数据项对象
- # 提取名言文本,使用 CSS 选择器
- item["text"] = quote.css("span.text::text").get()
- # 提取作者信息
- item["author"] = quote.css("small.author::text").get()
- # 提取标签列表
- item["tags"] = quote.css("div.tags a.tag::text").getall()
- yield item # 生成数据项,交由管道处理
- # 处理翻页,提取下一页链接
- next_page = response.css("li.next a::attr(href)").get()
- if next_page:
- # 将相对URL转换为绝对URL
- next_page = response.urljoin(next_page)
- # 递归调用parse方法继续抓取下一页
- yield scrapy.Request(url=next_page, callback=self.parse)
复制代码 4. 数据存储与Item Pipeline
为了将抓取的数据进行存储,我们可以使用 Scrapy 的 Item Pipeline。这里我们以将数据存储到 JSON 文件为例。
4.1 编写Pipeline(pipelines.py)
在 myproject/pipelines.py 中编写如下代码:
- import json
- class MyProjectPipeline:
- def open_spider(self, spider):
- """
- 爬虫启动时调用,打开数据存储文件
- """
- self.file = open("quotes.json", "w", encoding="utf-8")
- def close_spider(self, spider):
- """
- 爬虫关闭时调用,关闭文件
- """
- self.file.close()
- def process_item(self, item, spider):
- """
- 处理每个数据项,将其写入JSON文件
- """
- # 将Item转换为字典,并转换为JSON字符串
- line = json.dumps(dict(item), ensure_ascii=False) + "\n"
- self.file.write(line)
- return item
复制代码 4.2 启用Pipeline
在 myproject/settings.py 中启用我们定义的 Pipeline,添加或修改如下配置:
- ITEM_PIPELINES = {
- 'myproject.pipelines.MyProjectPipeline': 300,
- }
复制代码 数字 300 表现该 Pipeline 的执行顺序,数字越小越先执行。
5. 运行爬虫
在项目根目录下打开下令行,执行以下下令启动爬虫:
运行成功后,爬虫会依次抓取 Quotes to Scrape 网站的全部页面,并将抓取的数据存储到项目根目录下的 quotes.json 文件中。你可以打开该文件检察抓取结果,每行代表一条 JSON 格式的名言数据。
6. 小结
在本篇博客中,我们介绍了如何使用 Scrapy 框架构建一个完备的爬虫项目,详细内容包罗:
- 项目创建:使用 scrapy startproject 下令快速生成项目结构。
- 定义数据结构:在 items.py 中定义抓取的数据字段。
- 编写爬虫:在 spiders/quotes_spider.py 中编写爬虫代码,使用 CSS 选择器提取数据,并处置惩罚翻页逻辑。
- 数据存储:通过自定义 Pipeline 将数据存储到 JSON 文件中,并在 settings.py 中启用 Pipeline。
- 运行爬虫:使用 scrapy crawl 下令启动爬虫,完成数据抓取与存储。
Scrapy 强大的框架特性使得爬虫项目的开发、维护和扩展变得更加高效。盼望本篇博客能资助你快速上手 Scrapy,构建自己的高效爬虫项目。假如你有任何问题或建议,欢迎在评论区留言讨论!别忘了点赞、收藏并分享给需要的朋友,我们下篇博客再见!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |