Python中的Scrapy库

Python中的Scrapy库是一个高效的爬虫框架,用于创建和实现异步的网络爬虫。它提供了一个API来简化爬取网站数据的过程,从而节省开发人员的时间和精力。本篇博客文章将详细介绍Scrapy库的使用和API,并提供相应的代码注释,帮助读者更好地理解它的工作原理和应用场景。

安装Scrapy库

首先我们需要安装Scrapy库,可通过以下命令进行安装:

pip install scrapy

Scrapy核心组件

Scrapy主要由以下几个核心组件组成:

Spider

Spider是Scrapy库的核心组件之一。它主要负责抓取和解析网页的过程。一个Spider通常包含了从哪里开始抓取、如何抓取、抓取到哪里、如何解析等一系列信息。Scrapy中提供了一个基础的Spider类,开发人员只需创建一个子类,并进行必要的配置即可。

以下是一个简单的Spider示例,它抓取的是全球新闻网站中的新闻标题和链接:

import scrapyclass NewsSpider(scrapy.Spider):name = 'news'start_urls = ['https://www.globalnews.ca/world/']def p****(self, response):for article in response.css('article[class^="post-"]'):yield {'title': article.css('h3[class^="entry-title"] a::text').get(),'link': article.css('h3[class^="entry-title"] a::attr(href)').get()}
  • name:Spider的名称。单个项目中可能包含多个Spider,通过名称来区分不同的Spider。
  • start_urls:Spider开始抓取的URL列表。
  • p****:主要的解析方法,负责从抓取到的HTML中提取有用的信息并进行返回。

在上面的示例中,我们通过response对象提取了网页中所有文章的标题和链接,使用了CSS选择器,并通过关键字yield将结果返回给Scrapy引擎。

Item

Item是Scrapy库用来表示抓取到的数据的容器。Item中包含了所有需要抓取的数据和每个字段的元数据信息。开发人员只需定义一个Item子类,并进行必要的字段定义即可。

import scrapyclass NewsItem(scrapy.Item):title = scrapy.Field()link = scrapy.Field()

在上面的示例中,我们定义了一个NewsItem类,它包含了两个字段titlelink。每个字段使用了scrapy.Field()作为默认值,该字段可包含的类型(如int、float、datetime、string等)将由Scrapy动态确定。

Item Pipeline

Item Pipeline主要负责将抓取到的数据进行处理、清洗、持久化等操作。它通过一系列的处理器(或过滤器)对Item进行处理,并将处理后的结果发送到存储器中。Item pipeline是Scrapy的一个python类,开发人员可以通过继承和定制来实现自定义的数据处理流程。

以下是一个简单的Item Pipeline示例,它将每个Item存储到JSON文件中:

import jsonclass NewsPipeline:def open_spider(self, spider):self.file = open('news.json', 'w')def close_spider(self, spider):self.file.close()def process_item(self, item, spider):line = json.dumps(dict(item)) + "\n"self.file.write(line)return item

在上面的示例中,我们新建了一个NewsPipeline类,并通过json模块将Item转换为字典。然后将其存储到文件中。open_spiderclose_spider方法用于在Spider开启和关闭时创建和销毁文件。process_item方法则用于定义如何处理Item。

Middleware

中间件是Scrapy库的另一个核心组件,它主要负责在Spider爬取过程中,对请求和响应之间进行预处理的过程,包括重试、登录验证、代理设置、User-Agent设置等。中间件既可以由Scrapy官方提供,也可以由开发人员自定义。

以下是一个简单的Middleware示例,它用于添加固定的User-Agent:

class NewsMiddleware:def process_request(self, request, spider):request.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'

在上面的示例中,我们新建了一个NewsMiddleware类,并重写了process_request方法,用于添加User-Agent。

Scrapy应用实例

在上面了解了Scrapy的核心组件后,我们可以开始实现一个简单的爬虫应用。以下是一个爬取百度百科词条信息的示例爬虫:

安装BeautifulSoup

在我们开始爬取之前,需要先安装和导入BeautifulSoup模块,该模块将帮助我们解析和提取HTML文档中的信息。

pip install beautifulsoup4
from bs4 import BeautifulSoupclass BaiduBaikeSpider(scrapy.Spider):name = "baidubaike"allowed_domains = ["baike.baidu.com"]start_urls = ["https://baike.baidu.com/item/Python/407313",]def p****(self, response):soup = BeautifulSoup(response.body, 'html.p****r')main_content = soup.find('div', {'class': 'main-content'})title = main_content.find('dd', {'class' : 'lemmaWgt-lemmaTitle-title'}).h1.text.strip()summary = main_content.find('div', {'class' : 'lemma-summary'}).text.strip()for paragraph in main_content.select('div[class="para"]'):content = paragraph.text.strip()yield {'title': title,'summary': summary,'content': content,}

在上面的示例中,我们使用了beautifulsoup4库来解析网页HTML文档,并使用了CSS选择器来提取标题、摘要和正文内容。然后将结果返回给Scrapy引擎。

运行和存储

在完成代码开发后,我们可以使用以下命令启动爬虫并将结果存储到JSON文件中。

scrapy crawl baidubaike -o baidubaike.json

在上面的命令中,baidubaike是Spider的名称,baidubaike.json则是存储结果的文件名。

结论

Scrapy是一个高效、可扩展的Python爬虫框架,提供了一些核心组件以便开发人员能够更方便地创建和实现异步网络爬虫。在本文中,我们介绍了Scrapy的核心组件以及如何使用它们来实现一个简单的爬虫应用程序。虽然Scrapy的学习曲线可能较高,但是一旦掌握了它的使用方法,将会大大加快爬虫开发的速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/125949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现多平台兼容性:开发同城外卖小程序的技术策略

在移动互联网时代,外卖行业的快速崛起改变了人们点餐的方式。随着小程序的兴起,开发同城外卖小程序成为了许多企业的重要战略。然而,小程序的多平台兼容性成为了一项关键挑战。本文将探讨如何实现多平台兼容性,以开发高效且用户友…

Scrum master的职责

首先,Scrum master负责建立Scrum团队。同时Scrum master要帮助团队(甚至大到公司)中的每个成员理解Scrum理论和实践。 Scrum master还需要有很强的软技能,用于指导Scrum团队。Scrum master要对Scrum团队的成功负责任,…

保姆级安装Jdk,Tomact,Mysql在linux中并且部署项目

🌟在这里,我要推荐给大家我的专栏《Linux》。🎯🎯 🚀无论你是编程小白,还是有一定基础的程序员,这个专栏都能满足你的需求。我会用最简单易懂的语言,带你走进代码的世界,…

Ansible初认识

1、简介 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主机。比…

【好书推荐】ChatGPT 驱动软件开发:AI 在软件研发全流程中的革新与实践

前言 计算机技术的发展和互联网的普及,使信息处理和传输变得更加高效,极大地改变了金融、商业、教育、娱乐等领域的运作方式。数据分析、人工智能和云计算等新兴技术,也在不断地影响和改变着各个行业。 如今,我们正在见证人工智能…

使用MobaXterm向linux窗口化传输文件

使用MobaXterm向linux窗口化传输文件 之前上大学的时候,经常是XSheel配合Xftp使用,Xftp可以窗口化的往linux服务器传输文件,但是有一个问题,就是Xftp是收费的。 后来工作之后师兄给推荐了一个免费的,又好用的类似于Xf…

JavaScript重难点整理

1. 数据类型: - 原始类型:数字、字符串、布尔值、null、undefined。 let num 10;let str "Hello";let bool true;let n null;let u undefined;- 引用类型:对象、数组、函数。 let obj { name: "John", age: 25 };l…

基于PyTorch的共享单车使用数量预测研究

收藏和点赞,您的关注是我创作的动力 文章目录 概要 一、预测模型的实现3.1数据的获取和预处理3.2划分数据集3.3构建神经网络 二、PyTorch框架三 原理2.1前馈神经网络2.1.1 BP神经网络 四 预测效果验证4.1小批量梯度下降4.2批量梯度下降4.3随机梯度下降 五 结 论目录…

信息安全与网络安全的关系

前言 说说信息安全与网络安全的关系 如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉【入门&进阶全套282G学习资源包免费分享!】 一、包含和被包含的关系 信息安全包括网络安全,信息安全还包括操作系统安全&…

12.2 一文读懂i2c-tools工具(i2cdetect、i2cdump、i2ctransfer)

本文主要内容: 1 i2c-tools介绍 2 安装i2c-tools工具 2.1命令行安装 2.2 源码编译安装 2.3 yocto安装 3 i2cdetect 详细示例讲解 4 i2cdump 详细示例讲解 5 i2ctransfer详细示例讲解 6 i2cget详细示例讲解 7 i2cset 详细示例讲解 一 i2c-tools介绍 简介 i2c-tools,主要用来…

NLP 快速入门

文章目录 前言NLP 历史回顾NLP任务语料的标注AI语料标注师岗位职责 TransformersHugging Face模型中文文本分类使用 NLTK 进行文本分类 参考链接开源NLP 前言 学习NLP,解决两个问题: 如何使用别人训练好的模型?如何基于别人的模型&#xff…

1. 一文快速学懂常用工具——Git(上)

本章讲解知识点 什么是Git?为什么要使用版本控制工具?版本控制工具的前世今生本专栏适合于软件开发刚入职的学生或人士,有一定的编程基础,帮助大家快速掌握工作中必会的工具和指令。本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。如专栏内容有错漏,欢迎在评论…

加速软件开发和交付的革命性方法-DevOps

“ 随着信息技术的快速发展,现代软件开发和交付已经经历了巨大的变革。DevOps(Development和Operations的结合)已经成为这一变革的关键推动力,让开发团队和运维团队之间的界限变得模糊,以加速软件的开发、测试和部署过…

算法刷题-二叉树

算法刷题-二叉树 199. 二叉树的右视图 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 思路 广度优先搜索,答案就是二叉树的最右侧的节点 遍历每层的时候&#xff…

K-means(K-均值)算法

K-means(k-均值,也记为kmeans)是聚类算法中的一种,由于其原理简单,可解释强,实现方便,收敛速度快,在数据挖掘、聚类分析、数据聚类、模式识别、金融风控、数据科学、智能营销和数据运…

Spring-cloud-openfeign拦截器RequestInterceptor接口

RequestInterceptor接口位于包io.github.openfeign-core下,使用Spring Cloud Feign的时候会自动依赖这个包 下面的代码会在每次调用Feign1的m1方法时,向HTTP头追加键值对武汉3:晴川历历汉阳树 FeignClient(value "feignA", url "XXX或…

SpringBoot整合自签名SSL证书,转变HTTPS安全访问(单向认证服务端)

前言 HTTP 具有相当优秀和方便的一面,然而 HTTP 并非只有好的一面,事物皆具两面性,它也是有不足之处的。例如: 通信使用明文(不加密),内容可能会被窃听。不验证通信方的身份,因此有可能会遭遇…

【Kubernetes 基本概念】Kubernetes 的架构和核心概念

目录 一、Kurbernetes1.1 简介1.2 为什么要用K8s?1.3 K8s的特性 二、Kurbernetes集群架构与组件三、Kurbernetes的核心组件3.1 Master组件3.1.1 Kube-apiserver3.1.2 Kube-controller-manager3.1.3 Kube-scheduler 3.2 配置存储中心——etcd3.3 Node组件3.3.1 Kubelet3.3.2 Ku…

Python图像处理【15】基于非锐化掩码锐化图像

基于非锐化掩码锐化图像 0. 前言1. 使用 scikit-image filters 模块执行非锐化掩码2. 使用 PIL ImageFilter 模块执行非锐化掩码3. 使用 SimpleITK 执行拉普拉斯锐化4. 使用 OpenCV 实现非锐化掩码小结系列链接 0. 前言 非锐化滤波器是一个简单的锐化算子,通过从原…

https的加密流程

文章目录 一、两种加密方式二、https的加密流程2.1对称加密2.2非对称加密2.3中间人攻击问题2.4使用证书来校验客户端收到的公钥是否是服务器生成的公钥2.4.1证书的校验2.4.2证书的校验所得到的效果 一、两种加密方式 https在http的基础之上引入了加密机制(加密层)。https加密的…