Python爬虫学习第十二天---scrapy学习

news2024/11/26 2:34:54

Python爬虫学习第十二天—scrapy学习

一、scrapy的概念和流程

1、scrapy概念

Scrapy是一个Python编写的开源网络爬虫框架,它是一个被设计用于爬取网络数据、提取结构性数据的框架。

Scrapy文档地址:http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html

2、scrapy工作流程

在这里插入图片描述

其流程可以描述如下:
	1.爬虫中起始的url构造成request对象-->爬虫中间件-->引擎-->调度器
	2.调度器把request-->引擎-->下载中间件--->下载器
	3.下载器发送请求,获取response响应---->下载中间件---->引擎--->爬虫中间件--->爬虫
	4.爬虫提取url地址,组装成request对象---->爬虫中间件--->引擎--->调度器,重复步骤2
	5.爬虫提取数据--->引擎--->管道处理和保存数据
注意:
	图中中文是为了方便理解后加上去的
	图中绿色线条的表示数据的传递
	注意图中中间件的位置,决定了其作用
	注意其中引擎的位置,所有的模块之前相互独立,只和引擎进行交互

2.1 scrapy的三个内置对象

request请求对象:由url method post_data headers等构成。
response响应对象:由url body status headers等构成。
item数据对象:本质是个字典。

2.2 scrapy中每个模块的具体作用

在这里插入图片描述

二、scrapy的入门使用

1、安装scrapy

centos 7:pip/pip3 install scrapy
ubuntu: sudo apt-get install scrapy

2、scrapy项目开发流程

1、创建项目
	scrapy startproject mySpider
2、生成一个爬虫,需要进入项目目录后执行如下命令;
	scrapy genspider douluodalu ibiquge.la
3、提取数据
	spider中实现数据采集相关内容。
4、保存数据
	利用管道pipeline来处理(保存)数据。

3、创建项目

通过命令将scrapy项目的的文件生成出来;
创建scrapy 项目的命令:
	scrapy start project <项目名称>

示例:
	scrapy startproject lufeitest

生成目录如下:

在这里插入图片描述

4、创建爬虫

进入项目目录:cd lufeitest/
执行命令:scrapy genspider <爬虫名称>  <允许爬取的域名>
	爬虫名字: 作为爬虫运行时的参数
	允许爬取的域名: 为对于爬虫设置的爬取范围,设置之后用于过滤要爬取的url,如果爬取的url与允许的域不通则被过滤掉。

示例:
	cd lufeitest/
	scrapy genspider csdntest www.csdn.net

在这里插入图片描述

5、完善爬虫

在上一步生成出来的爬虫文件中编写指定网站的数据采集操作,实现数据提取。
步骤如下:
	01、修改起始URL;
	02、检查修改允许的域名;
	03、在parse方法中实现爬取逻辑;

5.1 在./lufeitest/lufeitest/spiders/csdntest.py中修改内容

生成的初始内容如下:
class CsdntestSpider(scrapy.Spider):
    name = 'itcast'
    allowed_domains = ['itcast.cn']   # 02、检查域名
    start_urls = ['https://www.itcast.cn/channel/teacher.shtml#ajavaee']   # 01、修改起始URL

    # 03、在parse方法中实现爬取逻辑
    def parse(self, response):
        # 定义对于网站的相关操作

        # 获取老师节点列表;
        node_list = response.xpath('//div[@class="li_txt"]')
        # print(len(node_list))
        # 遍历老师节点列表
        for node in node_list:
            ter_temp = {}

            # xpath方法返回的是选择器对象列表
            # ter_temp['name'] = node.xpath('./h3/text()')[0].extract()   # extract()从xpath选择器对象中提取数据,但是当前面选择器输出的内容为空列表时,会报错。当列表值为多个时建议使用extract().
            # ter_temp['jibie'] = node.xpath('./h4/text()')[0].extract()
            # ter_temp['jianjie'] = node.xpath('./p/text()')[0].extract()

            ter_temp['name'] = node.xpath('./h3/text()').extract_first()   # extract_first()当前面的选择器为空列表时,其不会报错,会显示值为None,如果不是空列表,会拿到第一个结果。当前面列表只有一个值时,建议使用extract_first().
            ter_temp['jibie'] = node.xpath('./h4/text()').extract_first()
            ter_temp['jianjie'] = node.xpath('./p/text()').extract_first()

            # print(ter_temp)

            yield ter_temp   # scrapy返回数据,通常使用yield,好处是可以实现翻页操作。所以不使用return返回数据
注意点:
	1、scrapy.Spider爬虫类中必须有名为parse的解析
	2、如果网站结构层次比较复杂,也可以自定义其他解析函数
	3、在解析函数中提取的url地址如果要发送请求,则必须属于allowed_domains范围内,但是start_urls中的url地址不受这个限制,我们会在后续的课程中学习如何在解析函数中构造发送请求
	4、启动爬虫的时候注意启动的位置,是在项目路径下启动
	5、parse()函数中使用yield返回数据,注意:解析函数中的yield能够传递的对象只能是:BaseItem, Request, dict, None

5.2 定位元素以及提取数据、属性值的方法

解析并获取scrapy爬虫中的数据: 利用xpath规则字符串进行定位和提取

	response.xpath方法的返回结果是一个类似list的类型,其中包含的是selector对象,操作和列表一样,但是有一些额外的方法
	额外方法extract():返回一个包含有字符串的列表
	额外方法extract_first():返回列表中的第一个字符串,列表为空没有返回None

5.3 response响应对象的常用属性

	response.url:当前响应的url地址
	response.request.url:当前响应对应的请求的url地址
	response.headers:响应头
	response.requests.headers:当前响应的请求头
	response.body:响应体,也就是html代码,byte类型
	response.status:响应状态码

6、保存数据

利用管道pipeline来处理(保存)数据。

6.1 在pipelines.py文件中对数据操作

1、定义一个管道类
2、重写管道类process_item方法
3、process_item方法处理万item之后必须返回给引擎。

示例1:直接打印数据
	import json

	class LufeitestPipeline:
	    # 爬虫文件中提取数据的方法每yield一次item,就会运行一次
	    # 该方法为固定名称函数
	    def process_item(self, item, spider):
	        print(item)
	        return item

示例2:将数据写入文件

	import json
	
	class LufeitestPipeline:
	
	    def __init__(self):   # 创建并打开文件
	        self.file = open('itcast.jsons','w')
	
	    def process_item(self, item, spider):
	
	        # 爬虫文件中提取数据的方法每yield一次item,就会运行一次
	        # 该方法为固定名称函数
	        print('itcast',item)   # 直接打印
	
	        # 将数据序列化
	        json_data = json.dumps(item,ensure_ascii=False) + ',\n'   # ",\n"加上换行符,ensure_ascii=False转换为中文。
	
	        # 将序列化的数据写入文件
	        self.file.write(json_data)
	
	        return item
	
	    def __del__(self):   # 关闭文件
	        self.file.close()

6.2 在settings.py配置启用管道

	ITEM_PIPELINES = {
	   'lufeitest.pipelines.LufeitestPipeline': 300,
	}

说明:
	配置项中键为使用的管道类,管道类使用.进行分割,第一个为项目目录,第二个为文件,第三个为定义的管道类。
	配置项中可以设置多个管道类;
	配置项中值为管道的使用顺序,设置的数值约小越优先执行,该值一般设置为1000以内。

7. 运行scrapy

命令:在项目目录下执行scrapy crawl <爬虫名字>
示例:scrapy crawl itcast   或scrapy crawl itcast --nolog

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

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

相关文章

采用抓包的方式逆向获得谷歌翻译的API

文章目录最开始的尝试2022.12.26谷歌翻译API相关信息发送网址提交的数据不过不出意外的失败了实验去掉参数去掉Headers代码对返回结果进行解析完整代码最开始的尝试 谷歌的翻译API老是发生变化&#xff0c;我们需要自己动手来找到谷歌的翻译API&#xff0c;这样才是最稳妥的解决…

个人博客系统(前后端分离)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、项目简介二、项目效果三、项目实现1. 软件开发的基本流程2. 博客系统 需求分析3. 博客系统 概要设计4. 创建maven项目5. 编写数据库操作的代码四、项目代码总结普通小孩也要热爱生活&#xff01; 一、项目简介 …

Mac 音频转换器推荐 DRmare Audio Converter、Audi Free Auditor

Mac 音频转换器推荐 DRmare Audio Converter、Audi Free Auditor 给大家推荐两款 Mac 上的音频转换器&#xff0c;这两款转换器都可以转换苹果音乐&#xff0c;iTunes歌曲或者一些常规的音轨到MP3, FLAC, WAV, M4A, AAC格式等等&#xff0c;转换后我们就可以在所有的设备和播放…

stm32f407VET6 系统学习 day06 窗口看门狗, IIC 通信协议

1.独立看门狗&#xff0c;与窗口看门狗的差别 1. 差别1 &#xff1a; 窗口看门狗&#xff0c; 有上限 0x7F&#xff0c; 有下限 0x40 &#xff0c;&#xff0c; 独立看门狗只有下限 0 2. 差别2&#xff1a; 时钟源不同&#xff0c; 独立看门狗&#xff1a;LSI 窗口…

【iMessage苹果推群发】苹果相册推它由pushchatkey.pem和pushchatcert.pem作为单独的文件使用

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

cut与分层抽样

个人觉得&#xff0c; 把分层抽样称为“分类采样”会更贴切一些。通常最基本的采样手段是&#xff1a;随机抽样&#xff0c;但是在很多场景下&#xff0c;随机抽样是有问题的&#xff0c;举一个简单的例子&#xff1a;如果现在要发起一个啤酒品牌知名度的调查问卷&#xff0c;我…

Improved Unsupervised Lexical Simplification with Pretrained Encoders 论文精读

Improved Unsupervised Lexical Simplification with Pretrained Encoders 论文精读InformationAbstract1 Introduction2 System Description2.1 Simplification Candidate Generation2.2 Substitution Ranking2.3 Obtaining Equivalence Scores3 End-to-end System Performanc…

好书推荐《C++17 in Detail》

无意中发现作者的博客&#xff08;https://www.cppstories.com/&#xff09;和这本书。这本书算是对C17新增特性较为全面的介绍&#xff0c;而且从实战出发&#xff0c;不流于语法细枝末节&#xff0c;简洁清晰&#xff0c;可以作为Scott Meyers那本非著名的《Effective Modern…

2022环境电器年度行业分析报告:洗地机同比增长357%,扫地机器人销量197万+

在当前的大环境下&#xff0c;人们的消费观念不断变化&#xff0c;健康因素在购买决策中的比重逐渐增大&#xff0c;因此&#xff0c;与此挂钩的环境电器行业也迎来发展变化。 在这里&#xff0c;鲸参谋也综合了京东平台环境电器中一些重点类目的销售数据&#xff0c;主要包括吸…

Krita像素画教程

Krita Windows 上一款自由开源的绘画软件 Krita 是一款自由开源的免费绘画软件&#xff0c;使用 GPL 许可证发布。它的功能齐全&#xff0c;能胜任从起草、勾线、上色到最终调整的所有绘画流程&#xff0c;可以绘制概念草图、插画、漫画、动画、接景和 3D 贴图&#xff0c;支持…

云服务器部署内网穿透映射本地服务

项目开发时需要和前端联调&#xff0c;考虑使用内网穿透避免每次上传服务部署的过程 下载frp &#xff08;开源内网穿透、反向代理工具&#xff09; https://github.com/fatedier/frp/releases/上传云服务器并解压&#xff08;使用xftp等工具上传&#xff09; tar -zxvf frp_0…

尚硅谷JavaWeb教程

1、Servlet Server Applet 全称为&#xff1a;Java Servlet是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据&#xff0c;生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口&#xff0c;广义的Servlet是指任何实现了这个Servlet接口的类。 1.1、Ser…

李沐精读论文:DETR End to End Object Detection with Transformers

论文&#xff1a; End-to-End Object Detection with Transformers 代码&#xff1a;官方代码 Deformable DETR&#xff1a;论文 代码 视频&#xff1a;DETR 论文精读【论文精读】_哔哩哔哩_bilibili 本文参考&#xff1a; 山上的小酒馆的博客-CSDN博客 端到端目标检测DETR…

【javaSE】类和对象

希望各位老铁三连支持&#xff01; 文章目录 # 关于面向对象# 类的定义和使用# 构造方法的创建和初始化# 封装## 封装的概念## 访问限定符## 封装包的各种用法# 关键字static# 代码块一、关于面向对象 1.1面向对象的定义 简单来说&#xff0c;面向对象就是一种编程的思想&…

Compose 为什么可以跨平台?

这是我在 2022 Kotlin 中文开发者大会 中带来的一个分享&#xff0c;会后有网友反馈希望将 PPT 内容整理成文字方便阅读&#xff0c;所以就有了本篇文章。大家如果要了解本次大会更多精彩内容&#xff0c;也可以去 JetBrains 官方视频号查看大会的直播回放。 前言 Compose 不止…

Bean的生命周期流程-上

Bean的生命周期流程-上引言getBeangetSingletoncreateBean后置处理器类型区分doCreateBeancreateBeanInstance 是如何创建bean的实例的引言 Spring拥有一套完善的Bean生命周期体系,而使得这套生命周期体系具有高扩展性的关键在于Bean生命周期回调接口&#xff0c;通过这些接口…

层次分析法(AHP)

主要来解决评价类问题 什么是评价类问题&#xff1a;选择哪种方案最好&#xff0c;哪位运动员表现的更优秀。 评价类问题可以用打分解决 同一颜色的单元格权重之和为1 解决评价类问题&#xff0c;大家首先要想到以下三个问题&#xff1a; 1.我们评价的目标是什么&#xff1…

FineReport数据可视化图表-配置MySQL8外接数据库(1)

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 - 11.0.3 1&#xff09;首次配置外接数据库时&#xff0c;支持自行选择是否「迁移数据至要启用的数据库」 2&#xff09;迁移外接数据库的过程提示细化&#xff0c;方便用户了解迁移进度 1.2 功能简介 报表系统配置外接数…

USB TYPE C为什么能实现正反插

USB TYPE C接口在手机&#xff0c;电脑等移动终端中使用的非常多&#xff0c;它可以分为插头和插座&#xff0c;放在PCB板上一般是插座。 USB TYPE C的插座和插头引脚信号定义大家可以看下。引脚分为两排&#xff0c;上面一排是A&#xff0c;下面一排是B。标准的USB TYPE C总共…

YOLOV5融合SE注意力机制和SwinTransformer模块开发实践的中国象棋检测识别分析系统

本文紧接前文&#xff1a; 《基于yolov5s实践国际象棋目标检测模型开发》 《yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别》 首先来看下最终效果&#xff1a; 在我棋类检测系统开发之——五子棋检测那篇博文写完之后就萌生了想做一下基于目标…