网络爬虫框架Scrapy的入门使用

Scrapy的入门使用

  • Scrapy
    • 概述
    • 引擎(Engine)
    • 调度器(Scheduler)
    • 下载器(Downloader)
    • Spider
    • Item Pipeline
  • 基本使用
    • 安装scrapy
    • 创建项目
    • 定义Item数据模型对象
    • 创建爬虫(Spider)
    • 管道pipeline来保存数据
    • 启动爬虫
  • 其他
    • 解析函数对象
    • 实现多请求
  • scrapy终端(Scrapy shell)
    • 启动终端
    • 可用Scrapy对象
    • 快捷命令

Scrapy

概述

Scrapy是一个用Python编写的开源网络爬虫框架,专门设计用于快速、高效地提取网站数据。它提供了一整套工具和库,可以帮助开发人员创建和管理网络爬虫,用于抓取特定网站的数据并进行处理。

英文文档:https://docs.scrapy.org/en/latest/

GitHub:https://github.com/scrapy/scrapy

中文文档:https://scrapy-chs.readthedocs.io/zh_CN/latest/

Scrapy是一个基于Python的Web爬虫框架,由多个组件组成,包括了引擎(Engine)、调度器(Scheduler)、下载器(Downloader)、Spider、Item Pipeline等。

引擎(Engine)

引擎是Scrapy的核心组件之一,负责调度和协调各个组件的工作。它接收Spider返回的初始请求,并将其传递给调度器,再由调度器根据一定的策略进行调度,最终将请求发送给下载器进行下载。在下载器将响应内容返回后,引擎将调用Spider的回调函数进行处理,再将处理后的数据交给Item Pipeline进行处理。

调度器(Scheduler)

调度器负责对Spider的请求进行调度,决定请求的顺序和时间。它维护了一个请求队列,并根据一定的调度策略,将请求传递给下载器进行下载。在下载完成后,调度器将下载器返回的响应对象传递给Spider进行处理。

下载器(Downloader)

下载器负责从互联网上下载页面和资源。它接收调度器传递的请求对象,并根据请求中的URL和请求头信息进行下载。下载器可以通过设置代理、Cookies和请求头等信息,模拟浏览器的行为,避免被服务器拒绝访问。在下载完成后,下载器将响应对象返回给调度器。

Spider

Spider是用户编写的爬虫代码,定义了如何爬取和处理页面数据。它通过yield关键字返回请求对象或者Item对象,并可以定义一个或多个回调函数,在下载器返回响应对象后进行解析和处理。Spider可以通过设置start_urls或者start_requests方法返回一个或多个初始请求对象。

Item Pipeline

Item Pipeline负责处理Spider返回的Item对象,可以对数据进行过滤、清理、验证等操作。它将Item对象传递给一系列的管道处理器,每个管道处理器可以对Item对象进行一些处理操作,然后将处理后的Item对象传递给下一个管道处理器。在最后一个管道处理器处理完成后,Item Pipeline将Item对象输出到文件或者数据库中。

基本使用

安装scrapy

pip install scrapy

查看帮助命令

> scrapy --help
Scrapy 2.8.0 - no active projectUsage:scrapy <command> [options] [args]Available commands:bench         Run quick benchmark testfetch         Fetch a URL using the Scrapy downloadergenspider     Generate new spider using pre-defined templatesrunspider     Run a self-contained spider (without creating a project)settings      Get settings valuesshell         Interactive scraping consolestartproject  Create new projectversion       Print Scrapy versionview          Open URL in browser, as seen by Scrapy[ more ]      More commands available when run from project directoryUse "scrapy <command> -h" to see more info about a command

创建项目

scrapy startproject 项目名称

会在当前目录下创建一个名为project_name的目录,包含了Scrapy项目的基本结构。
在这里插入图片描述
项目目录结构:

scrapy.cfg: 项目的配置文件demo: 项目的python模块,之后将在此加入代码demo/spiders/: 爬虫组件目录demo/items.py: 定义数据模型demo/middlewares.py: 自定义中间件demo/pipelines.py: 自定义管道,保存数据demo/settings.py: 爬虫配置信息

定义Item数据模型对象

Item是保存爬取到的数据的容器。通过创建一个 scrapy.Item 类, 并且定义类型为scrapy.Field的类属性来定义一个Item

定义item即提前规划好哪些字段需要抓,防止在爬取数据过程中写错。

配合注释一起可以清晰的知道要抓取哪些字段,

数据模型对象类定义以后需要在爬虫中导入并且实例化,使用方法和使用字典相同

在items.py中定义模型对象,定义要提取的字段:

import scrapyclass DemoItem(scrapy.Item):# 标题title = scrapy.Field()# 数量count = scrapy.Field()

在这里插入图片描述

创建爬虫(Spider)

Spider是编写用于从单个网站(或者一些网站)爬取数据的类。其包含一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 item 的方法。

创建一个Spider,必须继承scrapy.Spider类, 且定义一些属性、方法:

name:

用于区别Spider。 该名字必须是唯一的,不可以为不同的Spider设定相同的名字。

start_urls:

包含Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。

parse() :

parse()是spider的一个方法。 被调用时,每个初始URL完成下载后生成的Response对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。

demo/spiders目录下创建demospider.py文件,需要定义一个Spider类,继承自scrapy.Spider类,并重写start_requests()parse()方法。

import scrapyfrom demo.items import DemoItem# 继承自爬虫类
class DemospiderSpider(scrapy.Spider):# 定义爬虫名称name = "demospider"# 设置允许爬取的范围allowed_domains = ["www.runoob.com"]# 设置开始爬取的请求地址start_urls = ["https://www.runoob.com/"]# 实现解析函数,提取数据或者提取URL,并提交给引擎def parse(self, response):# scrapy的response对象可以直接进行xpathlist = response.xpath('/html/body/div[4]/div/div[2]/div/h2/text()').extract()print("--------------------------------")index = 1for title in list:div = "div[" + str(index) + "]"index = index + 1count = response.xpath('/html/body/div[4]/div/div[2]/' + div + '/a/h4/text()').extract()item = DemoItem()item['title'] = titleitem['count'] = len(count)# 提交数据给引擎# yield能够传递的对象只能是:BaseItem, Request, dict, Noneyield item

使用命令方式可以快速创建一个爬虫编写的基本结构

cd 项目目录scrapy genspider 爬虫名称 允许域名>scrapy genspider demospider www.runoob.com
Created spider 'demospider' using template 'basic' in module:demo.spiders.demospider

在这里插入图片描述

管道pipeline来保存数据

数据在被抓取后,被发送到管道,接着进行管道操作,比如:

清理 HTML 数据验证抓取的数据(检查项目是否包含某些字段)检查重复项(并删除它们)将抓取的项目存储在数据库中

在运行爬虫时添加 -o参考可以将数导出

scrapy crawl 爬虫名称 -o 导出文件

在pipelines.py文件中创建DemoPipeline管道类,打印爬虫的parse() 方法提取的数据

class DemoPipeline:# 爬虫文件中提取数据的方法每yield一次item,就会运行一次def process_item(self, item, spider):print("title: {} , count: {}".format(item['title'], item['count']))return item

在这里插入图片描述

完整管道实现如下:

# 1.在pipelines.py中编写管道实现# 2.定义管道类
class DemoPipeline:# 3.必须实现process_item(self,item,spider),在管道接收数据对象时回调,用于接收和处理每个数据对象def process_item(self, item, spider):print("title: {} , count: {}".format(item['title'], item['count']))return item# 4.可选实现def open_spider(self, spider):print("爬虫启动时回调,用于初始化操作")def close_spider(self, spider):print("爬虫关闭时回调,用于释放操作")

接着在settings.py中开启管道

配置项中键为使用的管道类,参数的值是一个权重,越小越优先执行

ITEM_PIPELINES = {"demo.pipelines.DemoPipeline":1
}

注意事项:

在管道实现函数中process_item必须有返回值,传递给下一个管道多管道实现时可以通过类型判断或爬虫名称判断区分存储的数据

启动爬虫

在命令行中,进入目录,并输入以下命令,运行Spider:

scrapy crawl 爬虫名称scrapy crawl demospider

控制台打印了爬虫提取数据日志与管道保存数据日志,如下所示:

--------------------------------
title:  HTML / CSS , count: 9
2023-02-22 14:07:26 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.runoob.com/>
{'count': 9, 'title': ' HTML / CSS'}
title:  JavaScript , count: 18
2023-02-22 14:07:26 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.runoob.com/>
{'count': 18, 'title': ' JavaScript'}
title:  服务端 , count: 26
2023-02-22 14:07:26 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.runoob.com/>

其他

解析函数对象

response对象

response响应对象封装从互联网上返回的响应,具有如下常用属性

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

Selector对象

Selector对象封装数据操作的对象

xpath:可以使用 xpath 提取数据,返回 SelectorList 对象css:可以使用 css 样式选择器提取数据,返回 SelectorList 对象extract:从selector对象中提取内容

SelectorList对象

返回 Selector 对象的合集

extract_first :取列表中第一个元素的内容,如果元素不存在返回 Noneextract :提取列表中selector对象中所有内容

提交数据给引擎

使用关键词 yield,在爬虫组件的解析函数中提交数据给引擎

提交数据类型:BaseItem、Request、dict、None

def parse(self,response):...item = {}item["data"] = "数据"yield item

实现多请求

构造Request对象,继续发送请求,从而实现多请求

scrapy.Request构建方式

scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])

注意:中括号里的参数为可选参数,具体意思如下:

callback: 表示当前的url的响应交给哪个函数去处理method:指定POST或GET请求headers:接收一个字典,其中不包括cookiescookies:接收一个字典,专门放置cookiesbody:接收json字符串,为POST的数据,发送payload_post请求时使用meta: 实现数据在不同的解析函数中传递,meta默认带有部分数据,比如下载延迟,请求深度等dont_filter: 默认会过滤请求的url地址,即请求过的url地址不会继续被请求,对需要重复请求的url地址可以把它设置为Turemeta的作用:meta可以实现数据在不同的解析函数中的传递

meta参数的使用

利用meta参数在不同的解析函数中传递数据

def parse(self,response):...yield scrapy.Request(detail_url, callback=self.parse_detail,meta={"item":item})...def parse_detail(self,response):# 获取传入的itemitem = resposne.meta["item"]

使用关键词 yield,提交请求给引擎

    # 实现解析函数,提取数据或者提取URL,并提交给引擎def parse(self, response):for title in response.xpath('//title').getall():item = DemoItem()item['title'] = titleyield itemfor href in response.xpath('//a/@href').getall():yield scrapy.Request(response.urljoin(href), self.parse)

scrapy终端(Scrapy shell)

Scrapy终端是一个交互终端,在未启动spider的情况下尝试及调试爬取代码,如用来测试XPath或CSS表达式

启动终端

scrapy shellscrapy shell 爬取地址scrapy shell www.runoob.com

可用Scrapy对象

Scrapy终端根据下载的页面会自动创建一些方便使用的对象

[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    <scrapy.crawler.Crawler object at 0x00000114BB2603A0>
[s]   item       {}
[s]   request    <GET http://www.runoob.com>
[s]   response   <200 https://www.runoob.com/>
[s]   settings   <scrapy.settings.Settings object at 0x00000114BB260940>
[s]   spider     <DemospiderSpider 'demospider' at 0x114bb6f6dc0>
[s] Useful shortcuts:
[s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser

快捷命令

shelp() - 打印可用对象及快捷命令的帮助列表
fetch(request_or_url) - 根据给定的请求(request)或URL获取一个新的response,并更新相关的对象
view(response) - 在本机的浏览器打开给定的response
>>> fetch(request)
2023-02-22 15:52:11 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET https://www.runoob.com/> from <GET http://www.runoob.com>
2023-02-22 15:52:11 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.runoob.com/> (referer: None)>>> view(response)
True

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

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

相关文章

霸榜京东数据库图书热卖榜!《图数据库:理论与实践》热销中

《图数据库&#xff1a;理论与实践》自2月上市以来&#xff0c;受到了数据库行业的广泛关注与热烈支持&#xff0c;问世两周便销量破千本&#xff01;近期还荣登京东 “数据库图书榜”热卖榜第二名&#xff0c;广获好评&#xff01; 在此&#xff0c;真挚的感谢各位读者的认可…

实现定时任务

定时任务的实现方式有很多&#xff0c;比如XXL-Job等。但是其实核心功能和概念都是类似的&#xff0c;很多情况下只是调用的API不同而已。 这里就先用SpringBoot为我们提供的定时任务的API来实现一个简单的定时任务&#xff0c;让大家先对定时任务里面的一些核心概念有个大致的…

基于微信小程序的民宿短租系统设计与实现(论文+源码)_kaic

摘 要 随着社会的发展&#xff0c;出差、旅游成为常态&#xff0c;也就造成民宿短租市场的兴起。人们新到陌生的环境里找民宿一般都是通过中介。中介虽然可以快速找到合适的民宿但会收取大量的中介费用&#xff0c;这对刚到新环境里的人们来说是一笔大的资金支出。也有一些人通…

elasticsearch 8.12+kibana 8.12

准备工作&#xff1a;1.下载相关的安装包放到/usr/local/ES下面 elasticsearch下载地址:Download Elasticsearch | Elastic elasticsearch-head-master下载地址:https://github.com/mobz/elasticsearch-head/archive/master.zip node下载地址:Index of /dist/ kibana地址:Downl…

网络服务练习题

综合练习&#xff1a;请给 openlab 搭建 web 网站 网站需求&#xff1a; 1. 基于域名 www.openlab.com 可以访问网站内容为 welcome to openlab!!! 2. 给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料 和缴费网站&#xff0c;基于&#xff0c; www.openlab.c…

正弦实时数据库(SinRTDB)的使用(5)-历史数据查询

前文已经将正弦实时数据库的使用进行了介绍&#xff0c;需要了解的可以先看下面的博客&#xff1a; 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

微服务概述

微服务 概述1.单体架构2.分布式架构3.微服务的架构特征&#xff1a; 服务拆分和远程调用提供者与消费者 概述 1.单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署。 单体架构的优缺点如下&#xff1a; 优点&#xff1a; 架构…

Vue-vue3

一、Vue3简介二、Vue3有那些优化性能的提升源码升级拥抱TypeScript新的特性 三、创建Vue3.0工程四、Vue3工程结构&#xff08;使用cli创建的vue3&#xff09;五、常用的Composition API&#xff08;组合式API&#xff09;setupsetup的两个注意点 ref函数reactive函数Vue3.0中的…

微服务(基础篇-004-Feign)

目录 http客户端Feign Feign替代RestTemplate&#xff08;1&#xff09; Feign的介绍&#xff08;1.1&#xff09; 使用Feign的步骤&#xff08;1.2&#xff09; 自定义配置&#xff08;2&#xff09; 配置Feign日志的两种方式&#xff08;2.1&#xff09; Feign使用优化…

架构整洁之道-读书总结

1 概述 1.1 关于本书 《架构整洁之道》&#xff08;Clean Architecture: A Craftsman’s Guide to Software Structure and Design&#xff09;是由著名的软件工程师Robert C. Martin&#xff08;又称为Uncle Bob&#xff09;所著。这本书提供了软件开发和架构设计的指导原则…

基于unbantu的nginx的配置

目录 前言: 1.安装nginx并进行测试 1.1使用nginx -v 命令查看版本 1.2开启服务 查看端口 1.3测试 2.nginx的静态资源访问配置 2.1创建静态资源存放的目录 2.2写入目录中测试文件对应的内容 2.3修改配置文件 2.4 测试 3.虚拟主机配置 3.1创建目录 3.2写入测试…

JoyPac:产品立项的5个思考及成功产品分析 | TopOn变现干货

5月26日&#xff0c;TopOn、罗斯基、广大大共同主办的《游戏赛道新机会》主题沙龙长沙站举办。活动邀请到多家头部平台和知名厂商的负责人&#xff0c;大家分别从自身的业务角度出发&#xff0c;分享了最新的行业变化和市场趋势。 在活动上&#xff0c;JoyPac产品VP王泽带来了…

HTML input 实现回车切换到下一个输入框功能

前言 遇到需求&#xff0c;在客户填写单子时&#xff0c;有多个输入框&#xff0c;为了省事&#xff0c;不需要频繁移动光标填写。 实现效果 实现方式一 HTML <input type"text" name"serialNumber1" onkeydown"cursor(this);"/><in…

DDos系列攻击原理与防御原理

七层防御体系 静态过滤 命中黑名单 对确定是攻击的流量直接加入黑名单&#xff08;源地址命中黑名单直接丢弃&#xff0c;缺乏机动性和扩展性&#xff09; 畸形报文过滤 畸形报文攻击 TCP包含多个标记位&#xff0c;排列组合有规律 • 现象&#xff1a;TCP标记位全为1 …

2015年认证杯SPSSPRO杯数学建模A题(第二阶段)绳结全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 A题 绳结 原题再现&#xff1a; 给绳索打结是人们在日常生活中常用的技能。对登山、航海、垂钓、野外生存等专门用途&#xff0c;结绳更是必不可少的技能之一。针对不同用途&#xff0c;有多种绳结的编制方法。最简单的绳结&#xff0c;有时称…

go发布包到github

1. 首先&#xff0c;我们在github上创建一个公有仓库并clone到本地 git clone https://github.com/kmust-why/gdmp-token.git cd gdmp-token/ 2. 在gdmp-token工程中初始化go.mod&#xff0c;其中后面的链接要跟github上创建的仓库和你的用户名对应 go mod init github.com…

谷歌seo怎么优化运营?

那些太大众的内容就不说了&#xff0c;在这里说一个后期谷歌seo可以去优化的一个方向&#xff0c;那就是电子邮件营销&#xff0c;这是一个间接营销seo的方案&#xff0c;电子邮件营销本身不会直接改变你在搜索结果中的排名&#xff0c;但它是一种强有力的工具&#xff0c;可以…

Scikit-Learn K近邻分类

Scikit-Learn K近邻分类 1、K近邻分类1.1、K近邻分类及原理1.2、超参数K1.3、K近邻分类的优缺点2、Scikit-Learn K近邻分类2.1、Scikit-Learn K近邻分类API2.2、K近邻分类实践(鸢尾花分类)2.3、交叉验证寻找最佳K2.4、K近邻分类与Pipeline1、K近邻分类 K近邻是一种常用的分类…

【单调栈】力扣84.柱状图中最大的矩形

上篇文章我们介绍了使用 无重复值 单调栈代码解决 含有重复值 的问题&#xff0c;在文章的最后&#xff0c;留下了一道考察相同思想的题目&#xff0c;今天我们来看看如何套路解决该题。 &#xff08;还没看过前几篇介绍的小伙伴赶快关注&#xff0c;在 「单调栈」 集合里查看…

用DataGrip连接hive时报错:User: root is not allowed to impersonate plck5,解决方法

你可以尝试关闭主机校验 修改hive安装目录下conf/hive-site.xml,将hive.server2.enable.doAs设置成false <property><name>hive.server2.enable.doAs</name><value>false</value><description>Setting this property to true will have H…