scrapy构造并发送请求

news2024/11/15 8:30:21

scrapy数据建模与请求

学习目标:
  1. 应用 在scrapy项目中进行建模
  2. 应用 构造Request对象,并发送请求
  3. 应用 利用meta参数在不同的解析函数中传递数据

1. 数据建模

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

1.1 为什么建模

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

1.2 如何建模

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

class MyspiderItem(scrapy.Item): 
    name = scrapy.Field()   # 讲师的名字
    title = scrapy.Field()  # 讲师的职称
    desc = scrapy.Field()   # 讲师的介绍

1.3 如何使用模板类

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

job.py:

from myspider.items import MyspiderItem   # 导入Item,注意路径
...
    def parse(self, response)

        item = MyspiderItem() # 实例化后可直接使用

        item['name'] = node.xpath('./h3/text()').extract_first()
        item['title'] = node.xpath('./h4/text()').extract_first()
        item['desc'] = node.xpath('./p/text()').extract_first()
        
        print(item)

注意:

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

1.4 开发流程总结

  1. 创建项目

    scrapy startproject 项目名
  2. 明确目标

    在items.py文件中进行建模
  3. 创建爬虫

    3.1 创建爬虫

    scrapy genspider 爬虫名 允许的域
    3.2 完成爬虫

    修改start_urls
    检查修改allowed_domains
    编写解析方法
  4. 保存数据

    在pipelines.py文件中定义对数据处理的管道

    在settings.py文件中注册启用管道

2. 翻页请求的思路

对于要提取如下图中所有页面上的数据该怎么办?

在这里插入图片描述

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

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

scrapy实现翻页的思路:

  1. 找到下一页的url地址
  2. 构造url地址的请求对象,传递给引擎

3. 构造Request对象,并发送请求

3.1 实现方法

  1. 确定url地址
  2. 构造请求,scrapy.Request(url,callback)
    • callback:指定解析函数名称,表示该请求返回的响应使用哪一个函数进行解析
  3. 把请求交给引擎:yield scrapy.Request(url,callback)

3.2 网易招聘爬虫

通过爬取网易招聘的页面的招聘信息,学习如何实现翻页请求

地址:https://hr.163.com/position/list.do

思路分析:
  1. 获取首页的数据
  2. 寻找下一页的地址,进行翻页,获取数据
注意:
  1. 可以在settings中设置ROBOTS协议
# False表示忽略网站的robots.txt协议,默认为True
ROBOTSTXT_OBEY = False
  1. 可以在settings中设置User-Agent:
# scrapy发送的每一个请求的默认UA都是设置的这个User-Agent
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'

3.3 代码实现

在爬虫文件的parse方法中:

......
	# 提取下一页的href
	next_url = response.xpath('//a[contains(text(),">")]/@href').extract_first()

	# 判断是否是最后一页
	if next_url != 'javascript:void(0)':

        # 构造完整url
        url = 'https://hr.163.com/position/list.do' + next_url

		# 构造scrapy.Request对象,并yield给引擎
		# 利用callback参数指定该Request对象之后获取的响应用哪个函数进行解析
    	yield scrapy.Request(url, callback=self.parse)
......

3.4 scrapy.Request的更多参数

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

4. meta参数的使用

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

在爬虫文件的parse方法中,提取详情页增加之前callback指定的parse_detail函数:

def parse(self,response):
    ...
    yield scrapy.Request(detail_url, callback=self.parse_detail,meta={"item":item})
...

def parse_detail(self,response):
    #获取之前传入的item
    item = resposne.meta["item"]
特别注意
  1. meta参数是一个字典
  2. meta字典中有一个固定的键proxy,表示代理ip,关于代理ip的使用我们将在scrapy的下载中间件的学习中进行介绍

小结

  1. 完善并使用Item数据类:
  2. 在items.py中完善要爬取的字段
  3. 在爬虫文件中先导入Item
  4. 实力化Item对象后,像字典一样直接使用
  5. 构造Request对象,并发送请求:
  6. 导入scrapy.Request类
  7. 在解析函数中提取url
  8. yield scrapy.Request(url, callback=self.parse_detail, meta={})
  9. 利用meta参数在不同的解析函数中传递数据:
  10. 通过前一个解析函数 yield scrapy.Request(url, callback=self.xxx, meta={}) 来传递meta
  11. 在self.xxx函数中 response.meta.get(‘key’, ‘’) 或 response.meta[‘key’] 的方式取出传递的数据

参考代码

wangyi/spiders/job.py

import scrapy


class JobSpider(scrapy.Spider):
    name = 'job'
    # 2.检查允许的域名
    allowed_domains = ['163.com']
    # 1 设置起始的url
    start_urls = ['https://hr.163.com/position/list.do']

    def parse(self, response):
        # 获取所有的职位节点列表
        node_list = response.xpath('//*[@class="position-tb"]/tbody/tr')
        # print(len(node_list))

        # 遍历所有的职位节点列表
        for num, node in enumerate(node_list):
            # 索引为值除2取余为0的才是含有数据的节点,通过判断进行筛选
            if num % 2 == 0:
                item = {}

                item['name'] = node.xpath('./td[1]/a/text()').extract_first()
                item['link'] = node.xpath('./td[1]/a/@href').extract_first()
                item['depart'] = node.xpath('./td[2]/text()').extract_first()
                item['category'] = node.xpath('./td[3]/text()').extract_first()
                item['type'] = node.xpath('./td[4]/text()').extract_first()
                item['address'] = node.xpath('./td[5]/text()').extract_first()
                item['num'] = node.xpath('./td[6]/text()').extract_first().strip()
                item['date'] = node.xpath('./td[7]/text()').extract_first()
                yield item

        # 翻页处理
        # 获取翻页url
        part_url = response.xpath('//a[contains(text(),">")]/@href').extract_first()

        # 判断是否为最后一页,如果不是最后一页则进行翻页操作
        if part_url != 'javascript:void(0)':
            # 拼接完整翻页url
            next_url = 'https://hr.163.com/position/list.do' + part_url

            yield scrapy.Request(
                url=next_url,
                callback=self.parse
            )

wangyi/items.py

class WangyiItem(scrapy.Item):
    # define the fields for your item here like:

    name = scrapy.Field()
    link = scrapy.Field()
    depart = scrapy.Field()
    category = scrapy.Field()
    type = scrapy.Field()
    address = scrapy.Field()
    num = scrapy.Field()
    date = scrapy.Field()

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

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

相关文章

【Linux】操作系统(Operator System)

目录 一、操作系统是什么 1、操作系统概念 2、操作系统的定位 3、设计OS的目的 4、操作系统的重要性 二、 理解操作系统 三、系统调用 系统调用和库函数的关系 一、操作系统是什么 1、操作系统概念 任何计算机系统都包含一个基本的程序集合,称为操作系统…

【网络设备排障怎么破?这五个命令申请出战!】

1.网络排错常用诊断工具介绍 主流网络设备产品提供了一套完整的命令集,可以用于监控网络互联环境的工作状况和解决基本的网络故障。主要包括以下命令: Ping命令 Traceroute命令 Show命令 Clear命令 Debug命令 1.1 Ping命令 1.原理: “ping”…

vue+element-ui项目搭建记录

一. 安装vue(省略) 二. 新建vue项目并启动 1. 命令行执行新建项目命令: vue init webpack TestElemntUI3 //TestElemntUI3为项目名称执行结果发现有问题: 2. 需要安装一个全局加载项,执行命令: npm i…

ARM+DSP!全志T113-i+玄铁HiFi4开发板硬件说明书(1)

前 言 本文档主要介绍开发板硬件接口资源以及设计注意事项等内容,测试板卡为全志T113-i+玄铁HiFi4开发板。由于篇幅问题,本篇文章共分为上下两集,点击账户可查看更多内容详情,开发问题欢迎留言,感谢关注。 T113-i处理器的IO电平标准一般为1.8V和3.3V,上拉电源一般不超过…

DSTL与PA咨询公司助力英国国防部发展“量子+军事”领域

DSTL的量子实验室(图片来源:网络)如何充分利用国防和安全领域的资源并确保人员安全?快速准确的决策至关重要。人类虽然是决策过程的重要参与者,但是快节奏的决策过程对人类来说变得越来越复杂。国防科学技术实验室&…

18种可以提高接口性能的方案

之前工作中,遇到一个504超时问题。原因是因为接口耗时过长,超过nginx配置的10秒。然后 真枪实弹搞了一次接口性能优化,最后接口从11.3s降为170ms。本文将跟小伙伴们分享接口优化的一些通用方案。 1. 批量思想:批量操作数据库 优化…

分布式系统架构解决方案—Dubbo

文章目录什么是分布式系统?系统架构Dubbo简介RPC的概念dubbo节点角色dubbo节点调用关系Dubbo 安装管理端Dubbo-监控统计中心什么是分布式系统? “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”分布式系统&…

第一次创业,注册什么类型的公司更好?

前言 几乎每一个打工者都有一颗当老板的心,大喊一声:"大丈夫生居天地间,岂能郁郁久居人下",于是一拍桌子就辞职创业,现实往往都是潦草收场,看下面一段统计数据: 中国小微企业平均存活周期4.13年&…

2023牛客寒假算法基础集训营4(10/13)

清楚姐姐学信息论数学&#xff0c;只需要求x的y次方和y的x次方那个大选哪个&#xff0c;除了2和3时是3多&#xff0c;其他情况都是数越小能代表的数越多AC代码&#xff1a;#include <bits/stdc.h> using namespace std; using LL long long; int main() {ios::sync_with…

7年老码农,平凡的2022

前言 嗨&#xff0c;大家好&#xff0c;我是希留。一个被迫致力于成为一名全栈开发的菜鸟。 2022年对于大多数人而言是难忘的一年&#xff0c;受疫情影响、经历行业寒冬。裁员、失业等情况总是笼罩着本就焦虑不安的生活。 而我的2022&#xff0c;用一个关键词就可以概括&…

超大功率远程应急广播系统(大功率扬声器的应用)

系统概述 1、接收控制系统框图 超大功率远程应急广播系统是针对应急广播研发的一套通信系统&#xff0c;其接收控制系统框图如图&#xff08;1&#xff09;所示&#xff1a; 2、发射系统框图 发射系统框图如图&#xff08;2&#xff09;所示。 3、接收控制系统功能 接收控制…

【Spring源码】自动注入·名称:autowireByName()详解

进入方法autowireByName()首先调用了unsatisfiedNonSimpleProperties()方法进行属性过滤unsatisfiedNonSimpleProperties()其中PropertyDescriptor是JavaBean通过存储器导出一个的一个属性&#xff0c;用于获取bw的所有属性描述对象&#xff0c;遍历获取到的属性描述对象&#…

快鲸智慧楼宇:为楼宇智慧化、物联化、可视化、数字化运营赋能

根据国际数据公司(IDC)发布的《全球半年度智慧城市支出指南》显示&#xff0c;2023年全球智慧城市支出预计将达到1894.6亿美元&#xff0c;其中中国市场规模将达到389.2亿美元。这意味着2023年&#xff0c;建设智慧城市是世界各地许多城市的发展战略之一。智慧楼宇作为智慧城市…

二叉树(三)

我们之前对树和二叉树有了基本的了解&#xff0c;然后我们进一步对二叉树的性质进行分类。小伙伴们如果有疑问或者感兴趣的可以看一下我之前写的两篇博客。二叉树&#xff08;一&#xff09;&#xff1a;二叉树&#xff08;一&#xff09;_染柒_GRQ的博客-CSDN博客二叉树&#…

一文读懂卫星导航测量天线

1957年10月4日&#xff0c;前苏联发射了第一颗人造地球卫星&#xff0c;第二年&#xff0c;美国便启动了第一代卫星导航系统——子午仪卫星导航系统的研制。经过几十年的发展&#xff0c;全球各类航天器发射活动日益增多&#xff0c;全球卫星导航卫星系统&#xff08;GNSS&…

【go语言udp分析】

go语言udp分析serverclientudp相等于tcp来说是不可靠的协议&#xff0c;当然优点就是速度快&#xff0c;相对于包的首部来说比较小。然后接下来看一下对应的实现server package mainimport ("fmt""net" )// UDP服务端配置 func main() {//1:启动监听liste…

2023年中高级前端养成指南-需要关注和学习的13大类80余个前端技术栈与前端趋势-看这篇就够了系列

今天是兔年开工的第一个星期一&#xff0c;我们又要投入到忙碌的工作了。 以下是imqdcn研究整理的2023年中高级前端养成指南&#xff0c;收藏起来&#xff0c;从开工第一天起&#xff0c;立下全新的计划和目标&#xff0c;愿你在兔年大展宏兔&#xff0c;扬眉兔气。 文章目录一…

【SpringCloud】Sentinel的基础概念及使用

一、雪崩问题1.问题描述微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。如果服务提供者I发生了故障&#xff0c;当前的应用的部分业务因为依赖于服务I&#xff0c;因此也会被阻塞。此时&#xff0c;其它不依赖于服务I的业务似乎不…

SAP 实施新的金融工具 IFRS17规则解析

在实施新的金融工具 IFRS 规则的过程中&#xff0c;保险公司现在看到了保险负债的新标准。经过多年的长期讨论&#xff0c;IASB 于 2016 年 11 月承诺在 2021 年 1 月 1 日生效&#xff0c;并明确表示不会考虑进一步推迟法规的通过日期。由于有必要将 2020 年作为比较期&#x…

[思考进阶]05 人与人之间的差距,在于“自律”

除了要提升自己的技术能力&#xff0c;思维的学习和成长也非常非常重要&#xff0c;特推出此[思考进阶]系列&#xff0c;进行刻意练习&#xff0c;从而提升自己的认知。 我认识两个成功的长者。 其中有一个人&#xff0c;每天记录当天的重要事项&#xff0c;比如今天和谁签了什…