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

接上篇《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 scrapyclass 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 scrapyclass 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.textif text.find("访问过于频繁") != -1:print("访问过于频繁,等5-10分钟后再试")else:list_con = text.xpath('//*[@id="list_con"]/li')_id = 0for con in list_con:_id += 1print(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.hqwc.cn/news/330091.html

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

相关文章

qt-C++笔记之QProcess

qt-C笔记之QProcess code review! 文章目录 qt-C笔记之QProcess一.示例:QProcess来执行系统命令ls -l命令并打印出结果说明 二.示例:QProcess来执行系统命令ls -l命令并打印出结果,代码进一步丰富三.示例:使用 QProcess 在 Qt 中…

el-date-picker日期时间选择器限制可选的日期范围

业务场景&#xff1a;需要限制日期时间选择器可选择的日期&#xff0c;有两种模式&#xff0c; 一种是已知范围&#xff0c;只能选已知范围内的日期&#xff0c; 另一种是知道最近天数&#xff0c;只能选今天往前的天数内的日期&#xff0c;超出不能选。 <el-date-picker v-…

高性能、可扩展、分布式对象存储系统MinIO的介绍、部署步骤以及代码示例

详细介绍 MinIO 是一款流行的开源对象存储系统&#xff0c;设计上兼容 Amazon S3 API&#xff0c;主要用于私有云和边缘计算场景。它提供了高性能、高可用性以及易于管理的对象存储服务。以下是 MinIO 的详细介绍及优缺点&#xff1a; 架构与特性&#xff1a; 开源与跨平台&am…

加密流量:成功 NDR 策略的关键因素

IT 决策者之间一直在就基于网络的可视性日益增长的需求进行对话。然而&#xff0c;由于超过 95% 的基于互联网的流量都被加密&#xff0c;因此需要实时解密作为成功的网络检测和响应(NDR) 策略的要求&#xff0c;这在某种程度上是一个棘手的问题。 此外&#xff0c;决策者还面…

【C++核心编程(四)】

一、继承 继承是面向对象三大特性之一。 有些类与类之间存在特殊的关系&#xff0c;例如下图中: 我们发现&#xff0c;定义这些类时&#xff0c;下级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性。 这个时候我们就可以考虑利用继承的技术&#xff0c;减少重复代…

python统计分析——箱线图(plt.boxplot)

参考资料&#xff1a;用python动手学统计学 使用matplotlib.pyplot.boxplot()函数绘制箱线图 import numpy as np import pandas as pd from matplotlib import pyplot as pltdata_set1np.array([2,3,3,4,4,4,4,5,5,6]) data_set2np.array([[2,3,3,4,4,4,4,5,5,6],[5,6,6,7,7…

十八:爬虫-JS逆向(下)

一&#xff1a;AES与DES DES对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥&#xff0c;信息的发送者。和信息的接收者在进行信息的传输与处理时&#xff0c;必须共同持有该密钥(称为对称密码),是一种对称加密算法。一般来说加密用的是encrypt()函…

[redis] redis的安装,配置与简单操作

一、缓存的相关知识 1.1 缓存的概念 缓存是为了调节速度不一致的两个或多个不同的物质的速度&#xff0c;在中间对速度较慢的一方起到加速作用&#xff0c;比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据&#xff0c;内存是保存CPU经常访问硬盘的数据&#xff0c;而且…

给您的应用添加弹窗

概述 在我们日常使用应用的时候&#xff0c;可能会进行一些敏感的操作&#xff0c;比如删除联系人&#xff0c;这时候我们给应用添加弹窗来提示用户是否需要执行该操作&#xff0c;如下图所示&#xff1a; 弹窗是一种模态窗口&#xff0c;通常用来展示用户当前需要的或用户必须…

OpenVINS学习6——VioManagerHelper.cpp,VioManagerOptions.h学习与注释

前言 VioManager类里还有VioManagerHelper.cpp,VioManagerOptions.h这两个文件&#xff0c;也包含了一些函数&#xff0c;这次接着看这个 。 整体分析 void VioManager::initialize_with_gt(Eigen::Matrix<double, 17, 1> imustate) 给一个状态&#xff0c;然后初始化…

学生信息管理系统(录入、查找、删除、修改、排序、统计等功能实现)超详细完整代码,建议保存。

许多老师都会布置Python期末大作业&#xff0c;作业题目很多就是学生信息管理系统&#xff0c;以前都是练习小题目&#xff0c;几十行代码就能搞定&#xff0c;而完整的写完这个系统我用了差不多400行代码。完整写完这个系统&#xff0c;是对一个学期所学知识的进一步深入了解于…

【知识点】:ECMAScript简介及特性

一.简介 什么是ECMAScript&#xff1f; ECMAScript是由网景的布兰登艾奇开发的一种脚本语言的标准化规范&#xff1b;最初命名为Mocha&#xff0c;后来改名为LiveScript&#xff0c;最后重命名为JavaScript。1995年12月&#xff0c;升阳与网景联合发表了JavaScript。1996年11月…