基于Python的拉勾网网络爬虫设计与实现
2023-06-25冯晓磊
摘 要:随着科学技术的发展,网络资源对人们的生活产生巨大的影响,为了进一步简化查找和精准定位网络资源,网络爬虫技术日渐兴起。由于Python语言的强兼容性,基于Python的网络爬虫技术成为了一种主流爬虫技术。针对学生求职的需求,文章采用基于Python的网络爬虫技术,设计拉勾网的岗位信息爬取程序,实现了对岗位信息的保存,为后续的查看使用提供便利。
关键词:Python;网络爬虫;数据解析
中图分类号:TP311 文献标识码:A 文章编号:2096-4706(2023)06-0085-04
Design and Implementation of Web Crawler for Lagou APP Based on Python
FENG Xiaolei
(Wuhan University of Communication, Wuhan 430205, China)
Abstract: With the development of science and technology, network resources have a huge impact on people's lives. In order to further simplify the search and accurately locate the network resources, Web crawler technology is rising day by day. Due to the strong compatibility of Python language, Web crawler technology based on Python has become a mainstream crawler technology. In response to the needs of seeking jobs of students, this paper adopts the Web crawler technology based on Python to design the job information crawling program of Lagou APP, which realizes the saving of job information and provides convenience for the subsequent viewing and using.
Keywords: Python; Web crawler; data parsing
0 引 言
近年來,Python语言作为一种新的流行语言,由于其强大的功能模块和平台兼容性,尤其在网络爬虫中的应用越来越普遍。随着互联网的飞速发展,给日常生活带来了较多的便利,也形成了依赖的惯性。但是目前网络资源质量参差不齐,数量巨大,往往存在资源查找难,数据获取难得情况,例如,目前应用较广得求职和招人的网站拉勾网,为了解决这一难题,本文利用Python语言设计拉勾网的网络爬虫,便于进一步的数据整合提供规范有效的数据源。
大数据时代已经到来,网络爬虫技术已成为这个时代不可或缺的一项技术,企业需要数据来分析用户行为、产品的不足之处以及竞争对手的信息等,而这一切的首要条件就是数据的采集。在互联网社会中,数据是无价之宝,一切皆为数据,谁拥有了大量有用的数据,谁就拥有了决策的主动权。如何有效地采集并利用这些信息成了一个巨大的挑战,而网络爬虫是自动采集数据的有效手段。网络爬虫是一种按照一定的规则,自动抓取互联网海量信息的程序或脚本。网络爬虫的应用领域很广泛,如搜索引擎、数据采集、广告过滤、大数据分析等。
1 相关概念
1.1 Python
根据IEEE Spectrum 2021最新的研究报告显示依然是世界上最受欢迎的语言。Python社区提供了丰富的第三方模块,它们的使用方式与标准库类似,相对简单,容易使用和学习。它们的功能同样丰富多样,资料全面,覆盖数据分析,深度学习,金融分析等多个领域,并且已形成稳定的使用机制。Python有着非广泛的应用,几乎所有大中型互联网公司都在使用Python,例如国外的Google、Youtube、Dropbox,国内的百度、新浪、搜狐、腾讯、阿里、网易、淘宝、知乎、豆瓣、汽车之家、美团,等等。Python 语言很早就用来编写网络爬虫。Google等搜索引擎公司大量地使用Python语言编写网络爬虫。从技术层面上将,Python 提供有很多服务于编写网络爬虫的工具,例如urllib、Selenium 和 BeautifulSoup等,还提供了一个网络爬虫框架Scrapy。
1.2 网络爬虫
随着大数据时代的到来,网络爬虫在互联网中的地位越来越重要。网络爬虫技术针对互联网中的海量数据,如何自动高效地获取互联网中我们感兴趣的信息进行程序设计。网络爬虫,又称为网页蜘蛛、网络机器人,是一种按照一定的规则,自动请求万维网网站并提取网络数据的程序或脚本。目前的互联网已经迈入大数据时代,通过对海量的数据进行分析,能够产生极大的商业价值,因此网络爬虫技术兴起。网络爬虫通过源码获取、数据解析、数据保存等步骤,实现对互联网数据的提取。通过网络爬虫对数据信息进行自动获取采集,比如应用于搜索引擎中对站点进行爬取收录,应用于数据分析与挖掘中对数据进行采集,应用于金融分析中对金融数据进行采集,除此之外,还可以将网络爬虫应用于舆情监测与分析、目标客户数据的收集等各个领域。
网络爬虫的工作原理为:首先根据业务需求选出待爬取的目标网页,将这些网页的URL地址作为种子URL,通过DNS服务器将URL地址转换为对应网站服务器的IP地址;然后将种子URL放入待抓取的URL队列中,爬虫程序从待抓取的URL队列中逐个顺次读取URL地址;网页下载器通过网站服务器对网页进行下载,获取URL地址对应的页面源码,下载到的网页为网页文档形式;根据爬取规则对网页文档中的URL进行抽取,将获取到URL存入爬取队列中;将获取到的源码进行数据解析,获取需要的信息;对未进行抓取的URL继续循环抓取,直至待抓取URL队列为空。
2 拉勾网爬虫程序设计思路
本文设计需求主要针对毕业生应聘工作,充分利用基于Python的网路爬虫相关技术,对所需网页数据进行获取,以便后期分析和查找。本次网络爬虫程序设计思路包括:确定目标网址、请求网站源码、解析岗位信息、保存岗位信息,其中程序功能流程图如图1所示。
在图1中,首先爬取的目标网页为“https://www.lagou.com/wn/zhaopin”,其次岗位信息为公司名称、岗位名称,最后保存岗位信息为json格式文件。
3 功能模块实现
基于拉勾网爬虫程序设计思路,程序功能模块实現主要包括请求网址源码、解析岗位信息、保存岗位信息,详细实现方式如下。
3.1 请求网址源码
URL是互联网上标准资源的地址,它包含了文件的位置以及浏览器处理方式等信息,URL地址由协议头、服务器地址、文件路径三部分组成,请求网址源码首先通过浏览器自带的源码检查工具,查看页面request的信息和源码,然后编写Python脚本进行页面网址请求。其中通过浏览器自带的检查工具获取的信息为:Request Method: GET;User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36;Request URL:https://www.lagou.com/wn/zhaopin。获取网页请求的相关信息,除了可以使用浏览器自带的检查工具,也可以使用Fiddler插件工具,进行网页发起请求的相关信息进行捕获。
基于以上检查网页,获取的请求网页的相关信息,利用Python自带的urllib库的request方法进行网页的url请求,其中url为“https://www.lagou.com/wn/zhaopin”,urllib库是Python内置的HTTP请求库,它可以看作是处理URL的组件集合。将获取的响应response信息进行读取和编码转换,形成html信息,将其记录在程序根目录下的lagou.html文件中,对获取的源码进行保存,其中相关代码如下所示:
url = "https://www.lagou.com/wn/zhaopin"
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
with open('./lagou.html', 'w', encoding='utf-8') as f:)
f.write(html)
上述源码中,调用的是urllib.request模块中的urlopen方法,它传入了一个百度首页的URL,使用的协议是HTTP,这是urlopen方法最简单的用法。urlopen方法可以接收多个参数,定义格式如下:urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None),其中,url -- 表示目标资源在网站中的位置;data -- 用来指明向服务器发送请求的额外信息;timeout -- 该参数用于设置超时时间,单位是秒;context -- 实现SSL加密传输,该参数很少使用。使用urlopen方法发送HTTP请求后,服务器返回的响应内容封装在一个HTTPResponse类型的对象中。HTTPResponse类属于http.client模块,该类提供了获取URL、状态码、响应内容等一系列方法。
3.2 解析岗位信息
了解网页的数据和结构以后,我们可以借助网页解析器(用于解析网页的工具)从网页中解析和提取出有价值的数据,或者是新的URL列表。Python支持一些解析网页的技术,分别为正则表达式、XPath、Beautiful Soup和JSONPath。本文基于Python的拉勾网网络爬虫设计和实现使用XPath方法,XPath即为XML路径语言,用于确定XML树结构中某一部分的位置。XPath技术基于XML的树结构,能够在树结构中遍历节点(元素、属性等)。XPath使用路径表达式选取XML文档中的节点或者节点集,这些路径表达式代表着从一个节点到另一个或者一组节点的顺序,并以“/”字符进行分隔。XPath使用路径表达式在文档中进行导航,它从某个节点开始,之后顺着文档树结构的节点进一步查找。
使用Google Chrome浏览器打开目标网址网页,在岗位信息上面右击选择“检查”,浏览器底部打开一个窗口,并显示选中元素周围的HTML层次结构,定位之后进行层级结果分析,编写XPath语句。
3.2.1 XPath解析
利用浏览器的XPath插件工具,对网页页面的元素进行XPath分析,其中定位到的岗位和公司信息的XPath为“//div[@id="jobList"]/div/div/div/div/div/a”,如图2所示,页面中高亮的信息为对应的XPath可以定位的信息。
利用如上的XPath信息进行岗位信息定位解析,首先利用etree中的parse方法,将获取的lagou.html文件转化为html文档,然后对html文档利用xpath方法,对其进行解析,获取对应的有效岗位信息,其中源码如下所示:
html = etree.parse('lagou.html')
result = html.xpath('//div[@id="jobList"]/div/div/div/div/div/a')
以上源码中,在调用函数时,如果没有提供解析器,那么就使用默认的解析器,函数会返回一个ElementTree类型的对象。在ElementTree类或Elements类的API文档中,提供了find()、findall()、iterfind()三个常用的方法,可以满足大部分搜索和查询需求,并且这些方法的参数都是XPath语句。
3.2.2 BeautifulSoup解析
除了以上使用XPath方法解析数据,还可以使用BeautifulSoup对数据进行解析,将复杂的HTML文档转换成树结构(HTML DOM),这个结构中的每个节点都是一个Python对象。首先创建Soup对象,根据HTML或者XML文件创建BeautifulSoup对象;然后根据DOM树进行各种节点的搜索,只要获得了一个节点,就可以访问节点的名称、属性和文本,在搜索节点的时候,我们也可以按照节点的名称、节点的属性或者节点的文字进行搜索。通过分析网页源码,可以岗位信息在标签a下,因此,使用find_all方法获取a标签下的信息,进而获取岗位信息,其中源码如下所示:
soup = BeautifulSoup(html, 'lxml')
result = soup.find_all('a')
如上源码中,在创建BeautifulSoup对象时,明确解析器为lxml,如果没有明确地指定解析器,那么BeautifulSoup对象会根据当前系统安装的库自动选择解析器,解析器的选择顺序为:lxml、html5lib、Python标准库。
3.3 保存岗位信息
对于这种针对小范围用户以及小规模的爬虫而言,可以将爬虫结果汇合到一个文件进行持久化存储即可,无需通过数据库进行存储,因此本文中将获取的岗位信息进行保存时,是保存在json文件中,首先非常轻量,只有几个方括号和花括号会占用额外空间。其次json能够无限拓展数据的关系层次,就像树状图,树的根部能无止境的分叉。这就很大程度解决了csv、xlsx这种只有行列两个维度的局限性,非常适合现在复杂关系的数据存储。在Python中,json格式的文件可以用json库或者pandas中的read_json来处理。其中保存岗位信息的源码如下:
items = {"position": position,"company": company}
local_file = open("job.json", "a")
local_file.write(json.dumps(items, ensure_ascii=False) + "\n")
通过运行脚本保存为job.json,其中文件如图3所示。
除了以上保存为文件之外,另外还可以保存到数据库中,如关系型数据库MySQL非关系型数据库MongoDB、Redis等。MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
4 结 论
本文针对毕业生查找工作信息过程中,存在岗位信息相对需求分散的问题,通过Python语言设计网络爬虫系统,通过获取源码、岗位信息解析和岗位信息保存,在拉勾网中获取有效的相关岗位信息,最终对岗位信息进行保存,为进一步使用分析作为准备工作。
参考文献:
[1] 李杰秦.基于Python语言下网络爬虫的技术特点及应用设计 [J].数字通信世界,2020(1):209-210.
[2] 张宇超.基于标签路径和关键词特征的Web新闻抽取方法研究与实现 [D].西安:西安电子科技大学,2021.
[3] 孙握瑜.基于Python的新浪微博爬虫程序设计与实现 [J].科技资讯,2022,20(12):34-37.
[4] 裴丽丽.基于Python对豆瓣电影数据爬虫的设计与实现 [J].电子技术与软件工程,2019(13):176-177.
[5] 李传科.基于Python的网页数据爬虫设计分析 [J].信息与电脑:理论版,2020,32(24):130-132.
[6] 简悦,汪心瀛,杨明昕.基于Python的豆瓣网站数据爬取与分析 [J].电脑知识与技术,2020,16(32):51-53.
[7] 李鑫欣,关菁华.基于Python的豆瓣读书网站用户信息采集 [J].电脑知识与技术,2019,15(8):4-6.
作者簡介:冯晓磊(1988—),女,汉族,河南汝州人,中级工程师,硕士研究生,研究方向:大数据与人工智能。
收稿日期:2022-10-29