【Python从入门到进阶】46、58同城Scrapy项目案例介绍

news2024/11/24 8:29:49

接上篇《45、Scrapy框架核心组件介绍》
上一篇我们学习了Scrapy框架的核心组件的使用。本篇我们进入实战第一篇,以58同城的Scrapy项目案例,结合实际再次巩固一下项目结构以及代码逻辑的用法。

一、案例网站介绍

58同城是一个生活服务类平台,涉及广泛的服务领域,从找工作、租房、买卖二手物品,到寻找兴趣伙伴,它都为用户提供了便捷的通道。58同城网站的信息量巨大,每天都有大量的用户在这里发布和浏览信息,包含丰富的生活服务选择。无论是家政服务、维修服务,还是教育培训、旅游出行,用户都能在58同城上找到对应的合作伙伴。

二、抓取案例分析

我们在58同城首页上方的搜索框中,搜索“后端开发”词条,可以看到跳转到了招聘板块,并在下方可以看到相应的职位推荐信息:

该信息是一个自上而下的列表,我们F12查看开发者信息,再次点击“搜职位”按钮,发现没有找到对饮的接口信息:

这说明该页面的搜索结果不是ajax异步的,而是请求服务器后,直接渲染出带结果的html界面了。所以该页面的地址栏信息,就是我们需要获取数据的请求地址:
https://zz.58.com/quanzhizhaopin/?key=%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91&classpolicy=strategy%2Cuuid_939eb358a0a14d338d323bb1480419b1%2Cdisplocalid_342%2Cfrom_674%2Cto_jump%2Ctradeline_job%2Cclassify_E&search_uuid=939eb358a0a14d338d323bb1480419b1&final=1
这个地址返回的就是带有职位信息的html报文:

三、创建58同城的Scrapy项目

我们来创建一下58同城Scrapy爬虫项目。首先我们打开PyCharm编辑器,在命令控制台咱们的代码文件夹下,运行“scrapy startproject scrapy_58tc_01”指令,创建Scrapy项目:

前往左侧项目区域,可以看到项目已经创建成功:

这里我们再回顾一下项目下每一个目录和文件的作用:

然后我们创建爬虫文件,进入项目文件夹的spiders文件夹,然后通过“scrapy genspider tc https://zz.58.com/quanzhizhaopin/?key=%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91&classpolicy=strategy%2Cuuid_939eb358a0a14d338d323bb1480419b1%2Cdisplocalid_342%2Cfrom_674%2Cto_jump%2Ctradeline_job%2Cclassify_E&search_uuid=939eb358a0a14d338d323bb1480419b1&final=1”指令,创建一个58同城招聘页面的爬虫文件:

我们发现报错了,需要咱们将&符号,用双引号括起来,因为&是scrapy命令中的的运算符,需要与字符串作区分:
scrapy genspider tc https://zz.58.com/quanzhizhaopin/?key=%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91"&"classpolicy=strategy%2Cuuid_939eb358a0a14d338d323bb1480419b1%2Cdisplocalid_342%2Cfrom_674%2Cto_jump%2Ctradeline_job%2Cclassify_E"&"search_uuid=939eb358a0a14d338d323bb1480419b1"&"final=1
我们修改后重新执行:

发现创建成功:

基础代码:

import scrapy


class TcSpider(scrapy.Spider):
    name = "tc"
    allowed_domains = ["zz.58.com"]
    start_urls = ["https://zz.58.com/quanzhizhaopin/?key=%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91&classpolicy=strategy%2Cuuid_939eb358a0a14d338d323bb1480419b1%2Cdisplocalid_342%2Cfrom_674%2Cto_jump%2Ctradeline_job%2Cclassify_E&search_uuid=939eb358a0a14d338d323bb1480419b1&final=1"]

    def parse(self, response):
        pass

然后我们把setting.py配置文件的遵守robot协议的配置,改成False,防止反扒协议导致爬取不成功:

ROBOTSTXT_OBEY = False

接下来我们就可以在爬虫文件中,编写我们获取职位列表信息的代码了。

四、编写爬虫的案例

这里我们在上面创建好的爬虫程序中,编写获取职位列表的代码逻辑。这里我们主要用到了response的以下几个方法:

response的属性和方法
●response.text  获取的是响应的字符串
●response.body  获取的是二进制数据
●response.xpath  可以直接使用xpath方法来解析response中的内容
●response.extract()  提取seletor对象的data属性值
●response.extract_first()  提取的seletor列表的第一个数据

下面我们先来通过网页的xpath工具,获取职位列表的xpath语句(具体xpath使用及浏览器插件安装,详见我之前的博文《【Python从入门到进阶】28、xpath的安装以及使用》)。
首先我们获取职位的list列表,这里我们F12打开开发者模式,定位到职位列表代码,copy一下职位列表的xpath:

代码://*[@id="list_con"]
然后我们剖析里面的每一个li,发现他们的对应关系:

此时我们用xpath工具测试一下,我们获取其中一个字段的效果:

此时我们就知道了每个内容的获取方式,下面开始写代码:

import scrapy


class TcSpider(scrapy.Spider):
    name = "tc"
    allowed_domains = ["zz.58.com"]
    start_urls = ["https://zz.58.com/quanzhizhaopin/?key=%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91&classpolicy=strategy%2Cuuid_939eb358a0a14d338d323bb1480419b1%2Cdisplocalid_342%2Cfrom_674%2Cto_jump%2Ctradeline_job%2Cclassify_E&search_uuid=939eb358a0a14d338d323bb1480419b1&final=1"]

    def parse(self, response):
        print("=======爬虫结果开始=======")
        text = response.text
        if text.find("访问过于频繁") != -1:
            print("访问过于频繁,等5-10分钟后再试")
        else:
            list_con = text.xpath('//*[@id="list_con"]/li')
            _id = 0
            for con in list_con:
                _id += 1
                print(f"【第{_id}份工作信息】:")
                job_name = con.xpath('.//div[@class="job_name clearfix"]/a/text()')  # 获取工作名称
                print("【工作名称】:",
                      str(job_name[0]).replace('\r', '').replace('\n', '').replace(' ', ''))  # 去除换行符和回车符,以及多余空格
                job_salary = con.xpath('.//p[@class="job_salary"]/text()')  # 获取工作薪水
                print("【工作薪水】:", job_salary[0])
                job_wel_list = con.xpath('.//div[@class="job_wel clearfix"]/span')  # 获取工作标签
                job_wel = ""
                for job_wel_item in job_wel_list:
                    job_wel += str(job_wel_item.text).strip() + " "
                print("【工作标签】:", job_wel)
                comp_name = con.xpath('.//div[@class="comp_name"]/a/text()')  # 获取招聘公司名称
                print("【招聘公司名称】:",
                      str(comp_name[0]).replace('\r', '').replace('\n', '').replace(' ', ''))  # 去除换行符和回车符,以及多余空格
                job_require_list = con.xpath('.//p[@class="job_require"]/span')  # 获取招聘要求
                job_require = ""
                for job_require_item in job_require_list:
                    job_require += str(job_require_item.text).strip() + " "
                print("【招聘要求】:", job_require)
        print("=======爬虫结果结束=======")

执行“scrapy crawl tc”运行爬虫程序,效果:

结果信息(以前三个为例):
=======爬虫结果开始=======
【第1份工作信息】:
【工作名称】: 高新区|web前端
【工作薪水】: 4000-6000
【工作标签】: 五险一金 周末双休 年底双薪 包住 房补
【招聘公司名称】: 河南云和数据信息技术有限公司
【招聘要求】: Web前端 大专 不限
【第2份工作信息】:
【工作名称】: 新通桥|后端软件开发
【工作薪水】: 5000-8000
【工作标签】: 五险一金 周末双休 年底双薪 包住 房补
【招聘公司名称】: 郑州氪亘信息技术有限公司
【招聘要求】: JAVA开发 大专 不限
【第3份工作信息】:
【工作名称】: 高新区|JAVA开发带薪实习
【工作薪水】: 4000-6000
【工作标签】: 五险一金 包住 周末双休 年底双薪 饭补
【招聘公司名称】: 河南猫匠网络科技有限公司
【招聘要求】: JAVA开发 大专 不限
................
如果调试次数过多,会报这个错:

这是58同城前端为了防止爬虫抓取的屏蔽措施,这里我们需要等一段时间再实验(或者换一个网络或者使用代理访问,换网络后,上面的url地址要重新复制)。
注:如果访问不到页面,可以下载我保存好的html页面,并用直接获取html文件的方式先测试一下,下面是html文件和测试爬虫逻辑代码的下载:

58同城搜索页静态html代码爬虫xpath测试demoicon-default.png?t=N7T8https://download.csdn.net/download/u013517797/88713719

至此,58同城的Scrapy项目案例讲解完毕。

转载请注明出处:https://guangzai.blog.csdn.net/article/details/135440258

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

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

相关文章

Elasticsearch:Search tutorial - 使用 Python 进行搜索 (三)

这个是继上一篇文章 “Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (二)” 的续篇。在今天的文章中,本节将向你介绍一种不同的搜索方式,利用机器学习 (ML) 技术来解释含义和上下文。 向量搜索 嵌入 (embed…

文件系统与日志分析

一,文件系统 (一)inode 和block概述 1,文件数据包括元信息与实际数据 2,文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节 3,block (块) 连续的八个扇区组成一…

OCP NVME SSD规范解读-5.命令超时限制

在"4.7 Command Timeout"章节中,详细定义了NVMe命令的超时要求和限制。 CTO-1:NVMe管理命令和TCG(可信计算组)命令从提交到完成不应超过10秒,且没有其他命令未完成(QD1)。CTO-1不适用…

【Python机器学习】构造决策树

通常来说,构造决策树直到所有叶结点都是纯的叶结点,但这会导致模型非常复杂,并且对于训练数据高度过拟合。 为了防止过拟合,有两种常见策略: 1、尽早停止树的生长,也叫预剪枝 2、先构造树,但…

微信小程序实战-01翻页时钟-1

文章目录 前言需求分析功能设计界面设计界面结构设计界面样式设计 逻辑设计 单页功能实现运行结果 前言 我经常在手机上用的一款app有一个功能是翻页时钟,基于之前学习的小程序相关的基础内容,我打算在微信小程序中也设计一个翻页时钟功能,J…

专业图表分析网页模板,让你轻松打造震撼的大数据可视化大屏电子沙盘

源码介绍 基于html/css/js,包含行业: 智慧政务 智慧社区 金融行业 智慧交通 智慧门店 智慧大厅 智慧物流 智慧医疗 通用模板 大数据分析平台 实时数据K线图(可自由配置多种行业模式) 可切换式大屏展示 翻牌效果 自定义字体

CCF模拟题 202305-1 重复局面

试题编号: 202305-1 试题名称: 重复局面 时间限制: 1.0s 内存限制: 512.0MB 题目背景 国际象棋在对局时,同一局面连续或间断出现3次或3次以上,可由任意一方提出和棋。 问题描述 国际象棋每一个局面可以用…

(生物信息学)R语言绘图初-中-高级——3-10分文章必备——点阵图(初级)

生物信息学文章的发表要求除了思路和热点以外,图片绘制是否精美也是十分重要的,本专栏为(生物信息学)R语言绘图初-中-高级——3-10分文章必备,主要通过大量文献,总结3-10分文章中高频出现的各种图片,并给大家提供图片复现的R语言代码,及图片识读。 本专栏将向大家介绍…

Android Matrix (三)矩阵组合和应用变换

在 Android 开发中,Matrix 类不仅提供了 mapPoints 方法来变换点坐标,还提供了多种其他用法,使其成为处理图像和视图变换的强大工具。以下是 Matrix 类的一些关键用法: 1. 变换方法 setTranslate(float dx, float dy): 设置矩阵…

二 数据查询

1、实验目的 理解SQL成熟设计基本规范,熟练运用SQL语言实现数据基本查询,包括但表查询、分组统计查询和连接查询。 2、实验内容及要求 针对数据库设计各种单表查询SQL语句、分组统计查询语句;设计单个表针对自身的连接查询,设计…

Vue2:通过props给组件传数据

一、业务场景 我们在使用Vue组件时,常常会复用Vue组件,那么,问题来了,复用的时候,业务数据不相同,怎么办了? 这里我们就需要学习新的属性:props来实现这个功能。 这样,组…

在Windows上使用VScode阅读kernel源码

有一说一,在Windows上使用Source Inside阅读kernel源码真的很舒服,但是有时候带着轻薄本出去,又不想往轻薄本上安装很多的软件,就使用VS code临时阅读kernel源码。如果不能进行跳转,阅读kernel源码就很难受&#xff0c…

计算机缺失vcomp120.dll文件怎么办?总结多种解决方法分享

在使用电脑过程中,难免会遇到各种问题,其中vcomp120.dll丢失问题就是其中之一。这个问题可能会给用户带来诸多不便,导致某些应用程序无法正常运行。在这篇文章中,我们将详细介绍vcomp120.dll文件的重要性,以及遇到丢失…

基于yolov2深度学习网络的车辆行人检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 .......................................................... load yolov2.mat% 加载训练好的…

李沐-《动手学深度学习》--03-注意力机制

一、注意力机制 1 . 注意力提示 1)框架 **随意:**跟随自己的想法的,自主的想法,例如query **不随意:**没有任何偏向的选择,例如 Keys 如何得到 k v q 2)Nadaraya-Watson核回归 就是一个so…

Studio 3T客户端连接Mongodb数据库服务

这里需要注意 一定要先开Studio 3T 到 创建连接时才开Mongodb服务 不然 Studio 3T 会找不到Mongodb服务 不知道这是不是 Studio 3T官方问题 期待解决吧 我们打开 Studio 3T 然后点击 Create a new connection 开始创建连接 新弹出的窗口中选择 Manually configure my connec…

新火种AI|小冰摊牌了!大模型已获国内备案,克隆人发布箭在弦上...

作者:小岩 编辑:彩云 2024年国内AI圈的第一个重磅消息已然来袭。 1月4日,小冰公司宣布,已于去年12月成功获得“小冰大模型”的国内备案。结合此前公司在日本研发的Rinna大模型,小冰方面称,公司已实现不同…

云卷云舒:【实战篇】云主机/虚拟机迁移

1. 简介 用户原有业务通过不同版本型号、不同操作系统的主机承载,形式上包括物理服务器、虚拟机、公有云主机等。随着业务不断扩张,需要将其业务云化转型,必须保证上云过程数据完整,业务平滑过度。 如果将所有业务系统都重新部署…

算法32:针对算法31货币问题进行扩展,并对从左往右模型进行总结

本算法是在算法31的基础之上进行推理总结的,因此,在看本章之前,必须先去了解算法31,否则会觉得莫名其妙。 算法31的推理过程: 如果 x y1 y2 y3 y4 y5 y6. x1 y2 y3 y4 y5 y6 那么 x y1 x1. 根据以…

欧洲编程语言四巨头

从左往右,依次是 尼克劳斯沃斯 (Niklaus Wirth),迪杰斯特拉(Edsger Dijkstra),霍尔(Tony Hoare) 尼克劳斯沃斯 (Niklaus Wirth) 瑞士人,一生发明了8种编程语言,其中最著…