基于Selenium的拉勾网就业招聘信息采集与分析
1 绪论
1.1研究背景
近年来,随着国家“互联网+”战略的深入实施以及数字经济的快速发展,互联网技术和大数据技术得到了广泛应用。线上招聘作为一种高效便捷的人才招聘模式,不仅打破了时间和空间的限制,还极大地提升了招聘和求职双方的效率。然而,随着招聘信息的快速增长,求职者在海量信息中找到与自己匹配的岗位变得愈加困难。同时,不同专业毕业生在面对就业选择时,往往对行业需求、岗位要求以及职业发展方向缺乏深入了解,这使得就业规划和专业发展面临更多挑战。
为解决这些问题,基于网络爬虫技术的就业信息采集与分析为信息处理提供了有效手段。通过对拉勾网等主流招聘网站的相关信息进行抓取,可以快速采集岗位的多维数据,如职位名称、招聘要求、薪资水平、地域分布等。这种基于网络爬虫和数据分析的技术手段,能够帮助求职者快速获取有价值的岗位信息,为择业和职业规划提供科学指导。
1.2 研究意义
首先,通过对拉勾网招聘信息的全面采集和分析,结合“大数据、人工智能、统计、计算机科学”等第一组专业,“机械、电子、自动化、通信”等第二组专业,以及“生物、医疗、化学、环境”等第三组专业的就业需求特点,系统比较不同专业的岗位要求、薪资水平、地域分布等信息,帮助求职者全面了解市场需求,为其提供精准的就业信息支持。再者,通过分析不同专业领域的技能需求和岗位要求,揭示行业发展趋势及未来方向,研究成果可以为高校优化课程设置和教学内容提供数据支撑,从而提升人才培养的针对性和适配性。
通过对不同专业岗位信息的深入分析,揭示区域经济发展与就业市场需求之间的关系,为企业和求职者之间的精准匹配提供指导。通过就业数据的可视化呈现,帮助求职者发现区域岗位特点与自身优势的契合点,从而促进就业市场的有效对接。而随着国家对数字化转型和人工智能产业的高度重视,大数据、人工智能等专业领域的人才需求不断增长,本研究以当前就业市场中的热点专业为切入点,为数字化转型中的人才供需平衡提供数据支持,同时也为国家相关政策的落实与完善提供参考依据。
2 相关技术理论要求
2.1相关技术环境要求
(1)技术环境要求:PyCharm 2024.2.4、Navicat Premium 15、VMware Workstation Pro 17、Google Chrome 131.0.6778.205
(2)技术栈:Selenium、Django、Spark、Hive、Echarts、HTML、CSS、JavaScript
2.2 Selenium WebDriver
Selenium是一款广泛使用的开源Web浏览器自动化工具,最初由 Jason Huggins于2004年开发,旨在支持Web应用程序的自动化测试。它允许开发者和测试人员使用多种编程语言(如 Java、Python、C#等)编写测试脚本,模拟用户与浏览器的交互,包括点击、输入文本、选择下拉框等操作。Selenium支持多种浏览器,如Chrome、Firefox、Safari和Internet Explorer,能够在不同的操作系统上运行,如Windows、Linux和macOS。 此外,Selenium 提供了丰富的功能,如支持并行测试执行、与其他测试框架的集成等,极大地提高了自动化测试的效率和可靠性。由于其强大的功能和广泛的支持,Selenium已成为Web自动化测试领域的标准工具之一。
图2-1 Selenium图标
2.3 Django架构
Django是一个高效、可扩展且易于使用的开源Web应用框架,采用Python编写,旨在简化Web开发过程。自2005年发布以来,Django提供了丰富的内建功能,如 ORM、用户认证、安全性保护和后台管理系统等,帮助开发者以最少的代码量快速构建复杂的Web应用。Django 强调可重用性和快速开发,采用 MTV(Model-Template-View)架构,支持高度模块化和灵活扩展。凭借其良好的文档支持和强大的社区,Django 被广泛应用于内容管理系统、社交平台、数据密集型应用等领域,适合开发从小型项目到大型企业级Web应用。
图2-2 Django图标
2.4 Spark+Hive数据操作
Spark是一个强大的分布式计算框架,专为大数据处理和分析而设计,支持高速的批处理和实时流处理。它基于内存计算,能够大幅提高数据处理效率,尤其在海量数据分析中表现卓越。Spark与Hive的结合发挥了两者的优势,Hive 作为一个数据仓库工具,提供了SQL查询的能力,而Spark提供了强大的计算引擎,使得数据可以更高效地存取和处理。在Spark和Hive的结合下,Spark可以通过Hive的接口直接读取和写入数据,支持对分布式数据进行复杂的分析和查询操作,同时享受Hive提供的结构化数据存储和查询能力。Spark和Hive的集成使得大数据分析流程更加流畅,既能够处理多种数据格式,又能够执行高效的数据操作,为大规模数据处理、机器学习以及数据可视化等应用提供了坚实的基础。
图2-3 Spark+Hive图标
2.5 Echarts
ECharts是一个基于JavaScript的开源可视化图表库,它通过简洁的配置方式提供强大而灵活的数据可视化能力,广泛应用于各类数据分析与展示场景。ECharts支持多种类型的图表,如折线图、柱状图、饼图、散点图、地图等,且具有丰富的交互功能,能够方便地与用户进行数据交互。ECharts提供了高性能的图形渲染,支持大规模数据的动态展示和快速渲染,适用于 Web 应用中的数据可视化需求。通过与前端框架结合使用,ECharts能够为用户提供直观、清晰、交互性强的数据展示,提升数据分析的效果。ECharts的高度可定制性和强大的扩展性,使其成为现代前端开发中不可或缺的可视化工具,广泛应用于商业分析、报表生成、市场趋势预测等领域。
图2-4 Echarts图标
3.需求分析
本项目旨在通过爬取拉勾网(www.lagou.com)的招聘数据,分析大数据、数据分析、人工智能和机器学习等岗位的市场情况。我们将使用Selenium进行网页爬取,获取包括公司名称、岗位名称、薪资范围、发布日期、工作区域、行业类别、学历要求、工作经验要求等信息。然后,利用Spark进行数据清洗和分析,并将处理后的数据存入Hive数据库中,再转移到MySQL库中。
为了实现数据的可视化展示,我将采用Django框架结合Echarts、HTML、CSS和JavaScript技术构建一个可视化大屏。通过这个大屏,可以直观地比较不同岗位的薪资差异、各地区对大数据类岗位的需求情况、以及不同公司对技能要求的差异。最终,根据数据分析结果,我们将给出针对大数据人才培养的建议,如哪些技能在当前招聘市场上更受欢迎,哪些地区的需求更为强劲,以及哪些职位对学历和经验的要求较高。这些分析结果将为大数据领域的人才培养和职业规划提供有价值的参考信息。
3.1设计思路
图3-1设计思路图
3.2采集与清洗
在本项目的数据采集与清洗阶段,运用Selenium、Spark和Hive技术栈实现高效自动化流程[1]。以拉勾网为目标,利用Selenium 作爬虫工具,针对“大数据、人工智能、统计、计算机科学”;“机械、电子、自动化、通信”;“生物、医疗、化学、环境”三组关键字进行搜索,每组设定至少一万条记录的爬取目标,涵盖公司、薪资、地点、学历、经验、规模等关键信息。
爬取时先初始化爬虫对象,设定职位类型、城市和起始页码,构建网址模板,创CSV文件并写表头,配置ChromeOptions启动浏览器,根据页码等构建目标网址访问,用XPath定位职位列表,遍历提取标题、公司等信息整理列表写入CSV,自动翻页爬取[2]。
初步采集后,Spark负责数据清洗与分析,利用其大数据处理能力进行去重、补缺、统一格式、筛选等操作,还通过Spark MLlib进行初步分析,如统计不同岗位平均薪资和学历分布。然后数据导Hive 数据仓库存储管理。最后,为方便可视化和报告生成,将清洗后数据导出至MySQL数据库,利用其关系型数据库特性进一步操作管理,从而为后续工作提供良好支持。
3.3可视化呈现
可视化呈现方面,采用Django框架结合 Echarts、HTML、CSS和JavaScript等技术来构建可视化大屏。借助这一组合,实现丰富且直观的呈现效果。在大屏上,针对不同岗位薪资差异进行对比呈现。通过清晰的图表形式,将各个岗位的薪资情况详细展示出来,让人们可以一目了然地看到不同岗位之间薪资的具体差异,这种直观的反映有助于深入了解岗位薪资的分布特点。
同时,对于各地区岗位的需求情况也做了直观展示。以直观的图形展示出不同地区在岗位需求上的显著差异,能使人们快速掌握各地区的需求态势。此外,还以特定形式对不同公司的技能要求差异进行呈现,明确地显示出各个公司在技能要求方面所具有的不同特点,这对于求职者了解不同公司的技能偏好以及企业了解市场竞争态势都具有重要意义。
3.4相关培养建议
通过以上对相关岗位人才招聘信息的数据采集,数据清洗以及数据可视化处理后。依据招聘信息数据各字段细致的可视化图形的呈现,结合各岗位的岗位背景知识资料结合各字段分析结果,全面认识总结相关岗位的概况,最后得出对培养相关人才的培养建议以及对相关专业人才未来规划给出指导意见。
4 数据预处理
4.1确定数据源
当今社会中互联网技术发达,从而导致信息斑杂冗余。国内招聘网站有很多类似于58同城,boss直聘,51job等一系列招聘网站。很多公司为了岗位招聘信息传播的渠道更为广泛,岗位招聘信息的更为迅速采取了在多个平台上发布招聘信息,为了防止数据冗余重复对分析结果产生影响,选择了拉勾网作为招聘岗位信息的爬取数据源,该网站信息量充足,招聘信息较为真实符合生活实际。
4.2招聘信息的采集
4.2.1采集网页信息
如图4-1所示,本文爬取拉勾网动态更新的招聘信息数据,首先打开拉勾网并登陆,搜索关键字,在网页上方复制 Url 并检索到所需爬取的相关关键字招聘信息。以“大数据”为例。
图4-1 拉勾网页面信息图
按F12键打开网页信息,再选择Network按F5键刷新页面获取网页动态信息,选择打开第一个文件,找到Request URL,Cookie(为辨别用户身份而储存在用户本地终端上的数据),以及User-Agent(用户浏览器的统一代理)并复制网页信息。
如图4-2所示,提取所需关键字字段的网页信息,按F12键打开网页信息面板,点击左上方箭头移动光标到想要的关键字段上,网页信息自动跳转到关键字标签处,复制并提取关键字段所对应的Xpath位置信息,图中以定位搜索框为例。
图4-2 网页信息元素提取图
4.2.2 数据采集代码的实现
首先通过__init__方法初始化了爬虫的基础配置:
图4-3 __init__方法代码
利用startBrowser方法启动一个Selenium Chrome浏览器实例,使用chromedriver 驱动,配置 ChromeOptions 以便在指定的调试端口(localhost:9222)运行,这样可以让浏览器处于调试模式,允许远程控制。
图4-3 startBrowser方法代码
利用核心方法遍历多个页面并提取页面中招聘信息的数据,通过XPath获取当前页面的招聘列表。对每个招聘信息(job)进行数据提取,包括职位标题、公司名称、薪资、工作经验、学历要求、公司规模、标签、福利等信息。使用save_to_csv方法将提取到的数据存储到CSV文件中,如果抓取完当前页的数据,则递归调用main(page)方法,抓取下一页的数据[3]。
在__main__块中,定义了要抓取的城市列表(citylist)和关键词组(keyword_groups)。通过遍历城市和关键词组合,为每个组合实例化一个spider对象,并调用main(30)方法进行抓取,由于网页限制,抓取最多30页的数据。
图4-4 __main__方法代码
而整个爬取过程中运用了反爬机制:
(1)在爬虫代码中,使用了time.sleep(32)来人为地延迟请求的间隔,这样做是为了防止爬虫请求频繁,避免服务器检测到异常流量而屏蔽或限制访问。很多网站会对短时间内大量请求的行为进行限制,设置延时有助于绕过这一反爬机制。
(2)代码中通过设置option.debugger_address='localhost:9222'来连接到本地的 Chrome 实例,用来绕过反爬工具或防火墙的。通过此方法,爬虫的IP地址可以隐藏,避免了反爬机制检测到请求来源于同一IP,绕过每个IP在短时间内访问过于频繁时可能会被封禁的问题。
4.3 招聘信息的清洗
在代码中涉及了多个数据清洗操作,主要体现在从爬取的原始数据中提取、清理和格式化信息。
4.3.1薪资数据清洗
原始数据:爬取到的薪资数据是一个字符串,通常包含文字和数字,例如:"10-15k"。
清洗操作:使用re.findall()提取薪资中的数字部分,例如从"10-15k"中提取10和15,将这些数字转换成整数,并乘以1000以得到最小薪资和最大薪资的实际值(单位:元)。
图4-5 薪资数据清洗代码
4.3.2工作经验数据清洗
原始数据:工作经验通常由"k"(千)字符分隔,示例格式为"1-3年" 或 "3年以上"。
清洗操作:通过 .split('k') 分割字符串并提取其中的工作经验部分。然后去掉多余的空格和其他字符,保留纯粹的工作经验信息。
图4-6 工作经验数据清洗代码
4.3.3公司规模数据清洗
原始数据:公司规模数据通常以“10-50人”或“50-150人”的形式出现。
清洗操作:使用re.findall()提取数字部分,得到公司人员数量的范围。
如果没有获取到完整的公司规模信息,设置默认值10或0来保证数据的一致性。
进一步检查是否有两个数字值(代表范围),并将其连接成一个范围字符串。
图4-7 公司规模数据清洗代码
4.3.4工作标签数据清洗
原始数据:工作标签通常是一个列表,爬取时为多个<span>标签。
清洗操作:提取所有标签的文本内容并将它们组合成一个用斜杠/分隔的字符串。
图4-8 工作标签数据清洗代码
4.3.5福利数据与公司行业数据清洗
原始数据:福利信息和行业信息可能为空或包含引号等特殊字符。
清洗操作:使用replace(' " ',"") 去除字符串中的引号,以确保数据干净。如果没有福利信息,则设置为"无"。
图4-9 福利数据与公司行业数据清洗代码
4.4 数据处理与计算
在获取到jobData.csv后,接着通过pycharm远程连接虚拟机centos系统,虚拟机打开hadoop,spark以及hive进程,编写代码,使用Spark分布式计算进一步处理数据。
4.4.1数据加载、清洗及存储
(1)初始化Spark Session,运行本地模式,构建SparkSession用于配置应用程序的参数[4]。
图4-10 初始化Spark Session代码
(2)构建数据模式,定义了CSV数据的schema,用于数据读取时的字段类型指定。
图4-11 构建数据模式代码
(3)加载数据与数据清洗,使用.read.format("csv")加载CSV文件,指定了文件的分隔符、引用符、转义符等,接着去重并添加唯一标识符。
图4-12 加载数据与数据清洗代码
(4)数据存储,将清洗后的数据分别存储到MySQL数据库和Hive表中。
MySQL存储:通过JDBC接口将数据存储到MySQL数据库的jobData表。
Hive存储:将数据以parquet 格式存储到Hive表中,方便后续分析。
图4-13 数据存储代码
4.4.2基于需求的计算与分析
(1)城市平均工资前十
通过分组与聚合,使用groupBy("city")按城市进行分组,计算各个城市的最大工资的平均值,接着排序:按照平均工资avg_max_salary降序排列,并使用limit(10)获取前十个城市。
图4-14 城市平均工资前十代码
(2)工资区间分类
通过工资区间分类:使用when()条件判断将最大工资分为几个区间:0-5k,5k-7k,7k-10k,10k-20k,20k以上,再进行聚合:对每个工资区间进行统计,计算每个区间内的职位数量。
图4-15 工资区间分类代码
(3)工资与工作经验分析
根据工作经验分析:按workExperience分组,计算各工作经验类别的最大工资和最小工资的平均值。
图4-16 工资与工作经验分析代码
(4)人口区间分类
使用正则表达式提取公司人数区间,将其划分为多个区间:0-10,10-50,50-150,150-500,500-1000,1000以上。
图4-17 人口区间分类代码
(5)行业薪资分布
根据行业分类统计不同薪资区间的职位数量。
图4-18 行业薪资分布代码
最终数据如图4-19所示。
图4-19 采集数据结果
5 数据的可视化处理
5.1数据可视化大屏开发
5.1.1后端服务开发
在Django中集成MySQL数据库,进行数据库连接与配置。在Django中使用PyMySQL库进 MySQL的连接配置。在settings.py中配置数据库的连接信息,包括数据库类型、数据库名、用户名、密码和主机等。Django内建的ORM会通过这些配置自动管理数据库连接及SQL执行。在settings.py中指定DATABASES配置项,明确Django使用MySQL。
最后,在后端与前端的集成上,我通过Django的模板渲染(render函数)来返回数据。具体而言,后端通过getIndexData()和getsalaryTop() 等函数获取数据,并将这些数据以上下文的形式传递给模板(home.html)。然后,Django会根据提供的模板渲染出最终的HTML页面,并将数据嵌入到页面中。Django架构如图5-1所示[5]。
图5-1 Django架构图
5.1.2 Echarts 图表初始化
在前端请求Django提供的API数据后,利用Echarts渲染可视化图表,在提前获取的模板中添加不同id的模块,分别部署渲染对应的可视化图表。大屏模板如图5-2所示。
图5-2 可视化大屏模板
如图5-3所示,将展示在网页上通过ECharts渲染图表,使用柱状图来展示城市平均工资TOP10的运行代码。
图5-3 城市平均工资TOP10运行代码
最终效果展示,如图5-4所示:
图5-4 数据可视化大屏效果图
5.2数据挖掘分析
为进一步探究三组专业的就业情况,将使用数据挖掘算法进行综合性评述,运用关联规则算法,对相关专业学生的就业前景进行客观评价。
5.2.1 关联规则介绍
关联规则(Association Rule)是一种数据挖掘技术,用于发现数据集中项之间的有趣关系。它的主要目标是寻找项与项之间的关联模式,以揭示潜在的规律和趋势,广泛应用于市场篮子分析、推荐系统等领域。
关联规则通常由两部分组成:前提是规则的左侧部分,表示已发生的事件或条件。而结论则是规则的右侧部分,表示在前提发生的情况下,可能发生的事件或条件。
常用的衡量标准包括支持度,即规则在数据集中的出现频率;置信度,即在前提发生时,结论发生的条件概率以及提升度(Lift),是衡量前提与结论之间的独立性,提升度越大表示前提和结论越相关,通过这些指标,可以筛选出具有实际意义的关联规则。
5.2.2数据分析及可视化
首先通过读取不同专业组的数据文件并对其进行数据预处理,包括处理缺失值、转换薪资字段、解析公司规模等。然后根据关键词筛选相关的职位数据,进一步填补缺失值。在此基础上,采用了关联规则挖掘方法,具体来说,通过apriori算法提取职位福利字段的频繁项集,并通过lift指标挖掘出有意义的关联规则。
此外,还进行了回归分析,通过将教育和工作经验等变量进行编码并训练线性回归模型,评估不同因素对薪资水平的影响。最后,对特征重要性进行了可视化展示,以便进一步了解哪些因素对薪资水平的影响最为显著。关联规则代码如图5-5所示。
图5-5 关联规则运行代码
通过运行结果,可视化图表如图5-6所示。
图5-6 各组回归模型特征重要性
从可视化结果可以看出:
(1)第一组模型特征重要性
特征权重最高的变量:教育背景(博士、硕士)对薪资回归模型影响最大;工作经验(10年以上、5-10年)显著提升薪资水平;本科背景对薪资水平也有较强影响。
重要性较低的变量:公司规模(companyPeople)权重最低,说明在第一组数据中,公司规模对薪资影响较弱;而工龄较低(1年以下、经验不限)的薪资影响权重也偏低。
(2)第二组模型特征重要性
特征权重分析:高学历(博士、硕士)依然是最重要的因素,表明高等教育背景在第二组专业领域尤为重要;长期工作经验(10年以上)对薪资提升作用显著;本科和5-10年的工作经验影响力也较高。
低影响变量:公司规模依然是最低的重要性指标;较低工龄(经验不限、1年以下)对薪资的提升效果微弱。
(3)第三组模型特征重要性
特征权重分析:工作经验10年以上的权重最高,这表明在第三组专业中,行业经验是决定薪资的核心因素;高学历(博士、硕士)依然重要,但相较于第一组、第二组,略显逊色。工作经验5-10年、本科背景权重紧随其后。
低影响变量:公司规模和较低工龄(1年以下)的影响仍然可以忽略不计。
6 结论与展望
6.1结论
根据当前就业市场特征分析可以看出:
(1)教育水平的作用
从三组模型的分析结果可以看出,高等学历(尤其是硕士、博士)对薪资的提升有着显著影响。这充分说明,企业在招聘时,往往将高学历视为衡量候选人学术能力和专业素养的重要指标。尤其在知识密集型行业或技术型岗位中,高学历的毕业生更容易获得高薪机会。此外,博士学历的显著作用表明,部分岗位更倾向于从事科研、技术开发和创新型工作的高端人才。
对于本科及以下学历的毕业生来说,薪资提升的路径相对受限。低学历学生在市场竞争中处于劣势,可能需要付出更多的时间和精力来提升自己的专业能力和经验。如果有条件,通过考研深造或申请博士学位,将是增加就业竞争力的重要方式。
(2)工作经验的积累
工作经验对薪资水平的影响在三组数据中均表现显著,尤其是拥有10年以上工作经验的员工薪资水平显著高于其他组别。长期的行业积累意味着员工不仅具备专业技术能力,还拥有丰富的项目经验和行业洞察力,这些都是企业高度看重的核心能力。
此外,5-10年的经验在模型中也显示出较高的权重。这表明,该阶段的职场人士通常已完成职业能力的初步培养,进入价值创造的高效期,因此能获得更高的市场认可。
对于刚毕业或工作经验不足的学生来说,实习和项目经历的重要性不容忽视。它们不仅可以帮助学生弥补工作经验的不足,还能为正式入职提供过渡路径。
(3)公司规模的弱化
模型结果显示,企业规模(公司人数,即 companyPeople)对薪资水平的影响微弱。这一现象反映出,企业在薪资评定时,更多依据员工的个人能力和经验,而非仅关注其是否来自大型公司。这一点尤为重要,因为这说明即使是在中小企业起步的毕业生,只要具备扎实的专业能力和良好的工作表现,依然能够获得与大企业员工相当的薪资待遇。
(4)专业间的差异
三组模型中体现了明显的专业差异:
第一组和第二组中,高学历背景的作用尤为突出,表明这类专业可能更偏向学术研究型或技术型岗位。企业更看重候选人的学术能力和科研潜力,岗位对理论知识的要求较高。
第三组中,工作经验的重要性高于学历,说明该专业更偏向实践性和技能性岗位,行业内更注重员工的技术积累和经验传承。
6.2展望
通过就业市场趋势与学生发展路径,可以看出:
(1)对第一组和第二组专业的学生
1.深造与学术提升:
第一组和第二组专业对学历的高要求,表明这些领域仍属于“知识驱动型”。未来,随着社会对高端人才需求的增加,这类岗位的准入门槛可能进一步提高。因此,相关专业的学生应重视自身的学术研究能力,优先考虑继续深造(如考研或攻读博士学位),以保持职业竞争力。
此外,高校提供的科研项目或合作企业的研发机会,都是提升专业技能的重要路径。学生应充分利用在校期间的资源,积累科研经历,并以高质量的论文发表或项目成果为目标。
2.实践能力提升:
虽然高学历是关键,但模型显示,5年以上的工作经验也具有显著影响力。建议学生在攻读高学历的同时,注重实习和实践经历。例如,参与产学合作项目、企业实习等方式,可以在提高专业素养的同时培养实际操作能力。
(2)对第三组专业的学生
1.重视早期经验积累:
第三组专业对工作经验的依赖性更高,这意味着相关领域的学生需要尽早进入行业积累经验。建议学生在毕业前主动参与实习或培训,快速适应职场需求。通过亲身参与项目,可以加速培养实际解决问题的能力。
此外,针对经验积累阶段的职业规划,学生可以从基础岗位做起,循序渐进地培养技术深度,避免急于求成。
2.适应行业新兴需求:
随着技术的快速更新换代,该领域可能会出现新兴技术或岗位需求。例如,某些传统行业正在与人工智能、大数据等技术融合,这对技能型岗位提出了新的要求。学生需要保持对行业趋势的敏感性,主动学习与时俱进的新技术。
参考文献
-
张晨祥,宁璐,冯明歌.基于Python的涉农职位招聘信息爬取与可视化分析[J].计算机时代,2023(2):51-54.
-
李泽文,陈晓柱.基于Selenium+Python+Tableau的BOSS直聘数据的爬取与分析——以“软件”专业为例[J].广州城市职业学院学报,2023(2):87-91
本项目属于本人课设项目,如需完整代码,需有偿提供+V:18755607352【备注:CSDN爬虫代码】