scrapy 库复习

scrapy的概念:Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架

scrapy框架的运行流程以及数据传递过程:

  1. 爬虫中起始的url构造成request对象–>爬虫中间件–>引擎–>调度器
  2. 调度器把request–>引擎–>下载中间件—>下载器
  3. 下载器发送请求,获取response响应---->下载中间件---->引擎—>爬虫中间件—>爬虫
  4. 爬虫提取url地址,组装成request对象---->爬虫中间件—>引擎—>调度器,重复步骤2
  5. 爬虫提取数据—>引擎—>管道处理和保存数据

创建项目和爬虫

scrapy startproject <项目名称>
scrapy genspider <爬虫名字>  <允许爬取的域名>

网上找的简单实例

import scrapyclass ItcastSpider(scrapy.Spider):# 爬虫名字name = 'itcast'# 允许爬取的范围allowed_domains = ['itcast.cn']# 开始爬取的url地址start_urls = ['http://www.itcast.cn/channel/teacher.shtml']# 数据提取的方法,接受下载中间件传过来的responsedef parse(self, response):# scrapy的response对象可以直接进行xpathnames = response.xpath('//div[@class="tea_con"]//li/div/h3/text()')print(names)# 获取具体数据文本的方式如下# 分组li_list = response.xpath('//div[@class="tea_con"]//li')for li in li_list:# 创建一个数据字典item = {}# 利用scrapy封装好的xpath选择器定位元素,并通过extract()或extract_first()来获取结果item['name'] = li.xpath('.//h3/text()').extract_first()  # 老师的名字item['level'] = li.xpath('.//h4/text()').extract_first()  # 老师的级别item['text'] = li.xpath('.//p/text()').extract_first()  # 老师的介绍print(item)

运行方式,在文件所在目录内运行 scrapy crawl <爬虫名>

注意:

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

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

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

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

在pipelines.py文件中定义对数据的操作

  1. 定义一个管道类
  2. 重写管道类的process_item方法
  3. process_item方法处理完item之后必须返回给引擎
import json
class ItcastPipeline():# 爬虫文件中提取数据的方法每yield一次item,就会运行一次# 该方法为固定名称函数def process_item(self, item, spider):print(item)return item

在settings.py配置启用管道

ITEM_PIPELINES = {'myspider.pipelines.ItcastPipeline': 400
}

配置项中键为使用的管道类,管道类使用.进行分割,第一个为项目目录,第二个为文件,第三个为定义的管道类。

配置项中值为管道的使用顺序,设置的数值约小越优先执行,该值一般设置为1000以内。

scrapy 构造并发送请求

数据建模

通常在做项目的过程中,在 items.py 中进行数据建模

1、为什么建模
  • 定义item即提前规划好哪些字段需要抓,防止手误,因为定义好之后,在运行过程中,系统会自动检查
  • 配合注释一起可以清晰的知道要抓取哪些字段,没有定义的字段不能抓取,在目标字段少的时候可以使用字典代替
  • 使用scrapy的一些特定组件需要Item做支持,如scrapy的ImagesPipeline管道类,百度搜索了解更多
2、如何建模

在 item.py 文件中定义要提取的字段:

class MyspiderItem(scrapy.Item):name = scrapy.Field()  #名字title = scrapy.Field() #职称desc = scrapy.Field()  #介绍
3、如何使用建好的模板

模板类定义以后需要在爬虫中导入并且实例化,之后的使用方法和使用字典相同

from mySpider.mySpider.items import MyspiderItem  #导入itemclass ItcastSpider(scrapy.Spider):……# 数据提取的方法,接受下载中间件传过来的responsedef parse(self, response):……for li in li_list:# 创建一个数据字典item = MyspiderItem()# 利用scrapy封装好的xpath选择器定位元素,并通过extract()或extract_first()来获取结果item['name'] = li.xpath('.//h3/text()').extract_first()  # 老师的名字item['level'] = li.xpath('.//h4/text()').extract_first()  # 老师的级别item['text'] = li.xpath('.//p/text()').extract_first()  # 老师的介绍yield item

注意:

  1. from myspider.items import MyspiderItem这一行代码中 注意item的正确导入路径,忽略pycharm标记的错误
  2. python中的导入路径要诀:从哪里开始运行,就从哪里开始导入
翻页请求

requests模块是如何实现翻页请求的:

  1. 找到下一页的URL地址
  2. 调用requests.get(url)

scrapy实现翻页的思路:

  1. 找到下一页的url地址
  2. 构造url地址的请求对象,传递给引擎
构造 Request 对象,并发送请求
1、 实现方法
  1. 确定url地址
  2. 构造请求,scrapy.Request(url,callback)
    • callback:指定解析函数名称,表示该请求返回的响应使用哪一个函数进行解析
  3. 把请求交给引擎:yield scrapy.Request(url,callback)
2、招聘爬虫实例

通过网易招聘页面爬取招聘信息,并实现翻页请求

步骤:

1、获取首页的数据

2、寻找下一页的地址,进行翻页,获取数据

spider 文件

import scrapyclass mySpider(scrapy.Spider):name = "joblistspider"allowed_domains = ["gz.gov.cn"]start_urls = ["https://www.gz.gov.cn/zwgk/zcjd/zcjd/index.html"]base_url = "https://www.gz.gov.cn/zwgk/zcjd/zcjd/index_"offset = 1end = '.html'def parse(self, response):#提取下一页的hrefnex_url = response.xpath("//ul[@class='news_list']/li")for url in nex_url:item = {}item['name'] = url.xpath("./a/text()").extract_first()item['time'] = url.xpath("./span/text()").extract_first()item['link'] = url.xpath("./a/@href").extract_first()yield itemif self.offset <=40:self.offset += 1url = self.base_url+str(self.offset)+self.endyield scrapy.Request(url, callback=self.parse)

pipelines.py

import jsonclass JoblistspiderPipeline:def __init__(self):#self.f = open('joblist.json','w')self.f = open('joblist.csv','w',encoding='utf-8')def process_item(self, item, spider):content = json.dumps(dict(item), ensure_ascii=False) + ',\n'self.f.write(content)return itemdef close_spider(self, spider):self.f.close()

setting.py

ITEM_PIPELINES = {'Gzgov.pipelines.GzgovPipeline': 300,
}ROBOTSTXT_OBEY = False

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

参数解释:

  • 中括号里的参数为可选参数
  • callback:表示当前的url的响应交给哪个函数去处理
  • meta:实现数据在不同的解析函数中传递,meta默认带有部分数据,比如下载延迟,请求深度等
  • dont_filter:默认为False,会过滤请求的url地址,即请求过的url地址不会继续被请求,对需要重复请求的url地址可以把它设置为Ture,比如贴吧的翻页请求,页面的数据总是在变化;start_urls中的地址会被反复请求,否则程序不会启动
  • method:指定POST或GET请求
  • headers:接收一个字典,其中不包括cookies
  • cookies:接收一个字典,专门放置cookies
  • body:接收json字符串,为POST的数据,发送payload_post请求时使用(在下一章节中会介绍post请求)
meta 参数使用

meta可以实现数据在不同的解析函数中的传递

    ……yield scrapy.Request(url, callback=self.parse,meta={"item":item})

特别注意

meta参数是一个字典

meta字典中有一个固定的键proxy,表示代理ip

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

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

相关文章

Objective-C实现iOS平台微信步数修改指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;本文介绍如何在iOS平台上使用Objective-C语言&#xff0c;通过苹果的HealthKit框架读取和修改微信步数以及相关健康数据。首先介绍如何引入和使用HealthKit框架&#xff0c;包括请求权限、读取步数数据、写入步…

【ElementPlus】深入探索ElementPlus:前端界面的全能组件库

&#x1f4da; 引言在现代 Web 开发中&#xff0c;创建既美观又功能强大的用户界面是一项挑战。Element Plus&#xff0c;作为 Vue 3 生态中的明星 UI 组件库&#xff0c;以其丰富的组件、优秀的性能和易用性赢得了广大开发者的青睐。本文将全面覆盖 Element Plus 的 常用核心组…

Json Jsoncpp

文章目录Json 介绍Jsoncpp 介绍Json::Value序列化接口反序列化接口序列化操作反序列化操作Json 介绍 JSON&#xff08;JavaScript Object Notation&#xff0c;JavaScript 对象表示法&#xff09;是一种轻量级的数据交换格式&#xff0c;具有简洁、易读、跨平台等特点&#xff…

openwrt下安装istore(基于pve)

openwrt下安装istore&#xff08;基于pve&#xff09;ssh连接到openwrt&#xff0c;用如下命令安装istore&#xff1a;opkg update || exit 1cd /tmpwget https://github.com/linkease/openwrt-app-actions/raw/main/applications/luci-app-systools/root/usr/share/systools/i…

2025年Python Web框架之争:Django、Flask还是FastAPI,谁将主宰未来?

文章概要 作为一名Python开发者&#xff0c;我经常被问到同一个问题&#xff1a;在2025年&#xff0c;Django、Flask和FastAPI哪个框架更值得使用&#xff1f;随着技术的快速发展&#xff0c;这个问题的答案也在不断变化。本文将全面比较这三个主流Python Web框架的特点、性能、…

高级11-Java日志管理:使用Log4j与SLF4J

在现代Java应用开发中&#xff0c;日志&#xff08;Logging&#xff09;是系统监控、调试、故障排查和性能分析的核心工具。一个高效、灵活、可配置的日志系统&#xff0c;不仅能帮助开发者快速定位问题&#xff0c;还能为运维团队提供宝贵的运行时信息。在Java生态系统中&…

sc-atac的基础知识(0)

sc-atac的基础知识 **fragment**是ATAC-seq实验中的一个重要概念&#xff0c;它指的是通过Tn5转座酶对DNA分子进行酶切&#xff0c;然后经由双端测序得到的序列。根据Tn5插入导致的偏移从read比对得到的位置推断出fragment的起始和结束位置。根据之前的报道&#xff0c;Tn5转座…

Python从入门到精通计划Day01: Python开发环境搭建指南:从零开始打造你的“数字厨房“

目录一、配置你的「魔杖」&#xff1a;Python 3.x安装1.1 跨平台安装指南1.2 验证你的「法力值」二、选择你的「魔法工坊」&#xff1a;IDE配置2.1 VS Code&#xff1a;轻量级实验室2.2 PyCharm&#xff1a;专业级法师塔三、施展第一个「魔咒」&#xff1a;Hello World3.1 基础…

MCP Agent 工程框架Dify初探

目录引言一、Dify是什么二、为什么使用Dify三、使用Dify要怎么做1、聊天助手2、Agent2.1 Function calling&#xff08;函数调用&#xff09;和 ReAct 两种推理模式的区别2.1.1 技术本质与工作流程对比2.1.2 优缺点对比2.1.3 适用场景与选择依据2.2 LangChain 的 Agent 实现原理…

无人机光伏巡检漏检率↓78%!陌讯多模态融合算法实战解析

原创声明本文为原创技术解析&#xff0c;核心技术参数与架构设计引用自《陌讯技术白皮书》&#xff0c;转载请注明来源。一、行业痛点&#xff1a;无人机光伏巡检的 "识别困境"光伏电站的大规模铺设推动了无人机巡检的普及&#xff0c;但实际作业中仍面临三大技术瓶颈…

机动车占道识别准确率提升 29%:陌讯动态轮廓感知算法实战解析

原创声明本文为原创技术解析&#xff0c;核心技术参数与架构设计引用自《陌讯技术白皮书》&#xff0c;禁止未经授权的转载与改编。一、行业痛点&#xff1a;机动车占道治理的技术瓶颈城市交通监控中&#xff0c;机动车占用应急车道、公交车道等违规行为已成为影响通行效率与交…

UNet改进(29):记忆增强注意力机制在UNet中的创新应用-原理、实现与性能提升

记忆增强注意力机制概述 记忆增强注意力是一种结合了外部记忆模块的注意力机制,它使神经网络能够存储和检索长期知识,而不仅仅是依赖当前的输入特征。这种机制特别适合需要保持长期依赖关系的任务,如医学图像分割,其中模型需要记住不同样本中出现的常见模式。 核心组件 记…

使用Python开发Ditto剪贴板数据导出工具

前言在日常工作中&#xff0c;我们经常需要处理大量的剪贴板数据。Ditto作为一款优秀的剪贴板管理软件&#xff0c;帮助我们保存了丰富的历史记录。但有时我们需要将这些数据导出进行进一步分析或备份&#xff0c;而Ditto本身并没有提供直观的批量导出功能。C:\pythoncode\new\…

【人工智能】提示词设计原则:简洁性、明确性、具体性如何平衡?

提示词设计原则&#xff1a;简洁性、明确性、具体性如何平衡&#xff1f;1. 提示词设计三大原则的核心内涵1.1 简洁性1.1.1 定义用最少的文字传递核心信息&#xff0c;避免冗余和不必要的描述。比如 “写 3 个春天的成语” 比 “我想让你写出来 3 个和春天有关系的成语词语” 更…

JS的作用域

文章目录一、为什么需要作用域&#xff1f;二、什么是 JS 作用域&#xff1f;2.1 什么是词法作用域和动态作用域&#xff1f;1. 词法作用域&#xff08;Lexical Scpoe&#xff09;2. 动态作用域2.2 JS 的作用域2.3 JS 作用域的分类1. 全局作用域2. 模块作用域3. 函数作用域4. 块…

OLTP,OLAP,HTAP是什么,数据库该怎么选

目录 OLTP&#xff08;Online Transaction Processing&#xff09;联机事务处理 OLAP&#xff08;Online Analytical Processing&#xff09;联机分析处理 非实时OLAP 实时OLAP HTAP&#xff08;Hybrid Transactional/Analytical Processing&#xff09; OLAP 和 OLTP 数…

【前端】CSS Flexbox布局示例介绍

CSS Flexbox&#xff08;弹性盒子&#xff09;简介 Flexbox 是一种一维布局模型&#xff0c;用于高效处理元素在容器内的空间分配、对齐和排序。它通过父容器&#xff08;flex container&#xff09;和子元素&#xff08;flex items&#xff09;的配合实现灵活响应式布局。核心…

Vue3核心语法基础

一、为什么要学 Composition API&#xff1f;在以前我们写代码用Vue2写&#xff1a;export default {data() {return { count: 0, msg: hello }},methods: {add() { this.count }},computed: {double() { return this.count * 2 }} }很明显 一个功能被拆成三块&#xff1a;data…

FSMC的配置和应用

一、FSMC 简介与工作原理FSMC&#xff08;Flexible Static Memory Controller&#xff09;是 STM32 微控制器中用于与外部静态存储器&#xff08;如 SRAM、PSRAM、NOR Flash、LCD 等&#xff09;进行通信的一个外设模块。1、支持的设备类型&#xff1a;SRAM / PSRAMNOR FlashNA…

Linux I/O 系统调用完整对比分析

Linux I/O 系统调用完整对比分析 1. 概述 Linux 提供了丰富的 I/O 系统调用&#xff0c;每种都有其特定的用途和优势。本文将详细分析这些系统调用的特点、使用场景和性能特征。 2. 系统调用详细对比 2.1 基本读写函数 pread/pwrite #include <unistd.h>// 位置指定…