| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 课程笔记1-Scrapy框架的基础用法 -> 正文阅读 |
|
[网络协议]课程笔记1-Scrapy框架的基础用法 |
作者:color:#fe2c24; |
简介:Scrapy是一个基于Twisted的异步处理框架,是纯Python实现的爬虫框架。 优势:架构清晰、模块之间耦合度程度低,可扩展性强,可以灵活完成各种需求。只需要定制开发几个模块就能轻松实现一个爬虫。 架构介绍:Engine(引擎),处理整个系统的数据流处理、触发事务,是整个框架的核心。 Item(项目),定义爬取结果的数据结构,爬取的数据会被赋值成该Item的对象。 Scheduler(调度器),接受引擎发过来的请求并将其加入到队列中,在引擎再次请求的时候,将请求提供给引擎。 Downloader(下载器),下载网页内容,并将网页内容返回给蜘蛛。 Spiders(爬虫),定义爬取的逻辑和网页的解析规则,负责解析响应并生成提取结果和新的请求。 Item Pipeline(项目管道),负责处理由蜘蛛从网页中抽取的项目(数据的清洗、验证和存储)。 Downloader Middlewares(下载器中间件),位于引擎和下载器之间的钩子框架,负责处理引擎和下载器之间的请求和响应。 Spider Middlewares(爬虫中间件),位于引擎和蜘蛛之间的钩子框架,负责处理向蜘蛛输入的响应和输出的结果及新的请求。 数据流:
示例:目标:爬取网站(Quotes to Scrape),试用命令行和MongoDB数据库两种形式保存数据。 环境需求:Scrapy框架、PyMongo库和MongoDB服务。 在命令行中创建项目框架:
ps:quotes_2022是自定义的项目名 在命令行中创建Spider:
ps:quotes是自定义的爬虫名;quotes.toscrape.com?????是目标网站的域名 在PyCharm中查看项目的文件结构?在PyCharm中查看自定义的Spider文件(quotes.py)
其中包含了一个刚刚自定义的类(QuotesSpider),这个类继承自Scrapy提供的Spider类(scrapy.Spider)。Scrapy用它来从网页抓取内容,并解析抓取的结果。 在类下面包含了三个属性(name、allowed_domains、start_urls)和一个方法(parse)。 name:用来区分不同的Spider,在同一个项目里面不能重复 allowed_domains:设定允许爬取的域名,如果初始或者后续的请求链接不是这个域名下的,则请求链接会被过滤掉 start_urls:用来定义初始请求,包含Spider在启动时爬取的url列表 parse:它是Spider的一个方法,负责解析返回的响应、提取数据或者进一步生成要处理的请求。(默认情况下被调用时,start_urls里面的链接构成的请求在完成下载执行后,返回的响应会作为唯一的参数传递给parse函数。) 创建Item在PyCharm中查看items.py文件
其中包含了一个自定义的Item(Quotes2022Item),这个Item继承自scrapy.Item类。Item是保存爬取数据的容器,使用方法和字典类似。相比字典,Item多了额外的保护机制,可以避免拼写错误或者定义字段错误。 此时观察网站,确定需要获取的目标为text、author、tags。 ?此时将item.py修改一下,添加上需要的字段(类名太挫了,顺手修改下)
解析response在PyCharm中查看自定义的Spider文件在Spider中可以看到,parse方法的参数response时start_urls里面的链接爬取后的结果。所以在parse方法中,可以直接对response变量包含的内容进行解析。 此时查看网页结构,可以发现每一页都有多个class为quote的区块,同时每个区块内都包含text、author、tags。那么就简单了,找出所有的quote,然后再提取每一个quote里面的内容。 提取的方式可以是CSS选择器或者XPath选择器(或者两者其一再配合上正则表达式)。? 使用CSS选择器的话,parse()改写如下:
如果想要获取的是author的主页链接,可以用:
输出结果:'/author/Albert-Einstein' 使用XPath选择器的话,parse改写如下:
如果想要获取的是author的主页链接,可以用:
输出结果:'/author/Albert-Einstein' ps: get()可以用extract_first()替换,选取首个元素; getall()可以用extract()替换,选取全部元素。 使用Item在上上一步中,已经定义好了Item,现在就要使用了。依次用刚才解析到的结果赋值Item中的每一个字段,最后将Item返回即可。 ps:需要先导入QuoteItem函数并实例化
后续Request这一步需要从当前页面找到信息来生成下一个请求,然后在下一个请求的页面里找到信息再构造下一个请求,如此循环往复,实现整个网站的爬取。 拉网网站底部,找到【下一页】按钮。检查源代码,链接为/page/2,完整链接就是http://quotes.toscrape.com/page/2/,通过这个链接我们就可以构造下一个请求。 构造请求时需要用到scrapy.Request,并且这里需要传递两个参数:url和callback。 url:请求链接 callback:回调函数。(当指定了该回调函数的请求完成之后,获取到响应,引擎会将该响应作为参数传递给这个回调函数。回调函数进行解析或生成下一个请求。) 由于新旧页面的结果是一样的,所以可以继续用parse方法来做页面解析。 在parse方法后追加上如下代码:
在命令行中试运行&保存到文件
ps:quotes是自定义的爬虫名 截至目前,数据都只能在控制台查看。但其实只要Scrapy提供的Feed?Exports可以轻松将抓取结果输出到本地文件中。 例如,如果想将上面的结果保存成JSON文件,可以执行以下命令:
?输出格式还支持很多种:
对于小型项目来讲,这可能就已经足够了,但是想要更复杂的输出,比如输出到数据库,那就需要通过Item?Pipeline来完成了。 使用Item?Pipeline导出到MogonDB数据库Item?Pipeline(项目管道),当Item生成后,会被自动送到Item?Pipeline进行处理。Item?Pipeline的基本功能:
要想使用Item?Pipeline需要定义好一个类及其下的process_item方法(process_item方法必须返回包含数据的字典或Item对象,或者抛出DropItem异常)。 在PyCharm中查看pipelines.py文件
可以看到,process_item方法有两个参数,一个是item(每次Spider生成的Item都会作为参数传递过来),另一个是spider(就是Spider实例)。 修改一下代码,实现:将item中的text字段的长度限制在50个字符以内,超长的部分用“...”代替。
定义一个新类,实现:将处理后的item存入MongoDB。
__init__:定义构造函数,完成连接MongoDB时需要用到的地址链接和数据库名称两个对象的初始化。 from_crawler:通过crawler拿到全局配置(settings.py)中的各项配置信息。(需要在全局配置中定义好【MONGO_URI】和【MONGO_DB】) open_spider:当Spider开启时,调用这个方法,完成一些初始化操作 process_item:执行数据插入操作 close_spider:当Spider关闭时,调用这个方法,关闭数据库的连接 在PyCharm中查看settings.py文件最后还需要在全局配置文件里面补充上MongoDB的链接信息以及激活前面定义的两个Pipeline类。
在ITEM_PIPELINES字典中,键名就是Pipeline类的名字,键值代表的事调用优先级(数字越小越早调用)。 在命令行中正式运行
等爬取结束后,在MongoDB?Compass中刷新一下,可以查看到爬取到的数据了。 目录 ?在PyCharm中查看自定义的Spider文件(quotes.py) <完> |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 11:46:01- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |