ComputerSystemNetworkingandTelecommunications计算机系统网络和电信,2019,1(2)ISSN:2661-3719(Print);2661-3727(Online)277Python-basedWebCrawlerYuchaoWUZhengdeBAOYawenTANGSchoolofComputerandSoftware,JinchengCollege,SichuanUniversity,Chengdu,611731AbstractThewebcrawlerhastheabilitytoautomaticallyobtainusefuldataaccordingtotherules.Inthispaper,atargetedcrawlersystemwasdesignedandsuccessfullyrunbyusingPythonlanguagefortherecruitmentsectionpageofanITwebsite.Theresultsshowthatthecrawlerprogramhastheadvantagesofaccuratecollectionresults,highefficiencyandstrongscalability.Theuseofcrawlertocollectdatacaneffectivelysavethetimeofdatacollectionandimproveworkefficiency.KeyWordsPython,WebCrawlers,XpathDOI:10.18686/jsjxt.v1i2.696基于Python的网络爬虫巫宇超鲍正德唐娅雯四川大学锦城学院计算机与软件学院,四川成都,611731摘要网络爬虫具有根据规则自动获取有用数据的能力,本文针对某IT网站招聘版块页面,使用Python语言设计了一个定向爬虫系统并成功运行。运行后的结果表明:本爬虫程序具有采集结果准确、效率高、可扩展性强等优点,使用爬虫采集数据,可以有效节约数据收集的时间,提高工作效率。关键词Python;网络爬虫;Xpath1.引言随着互联网的迅猛发展,网络信息量的规模以指数级飞速增长,但是由于网站本身的多样化和异构性,很多数据都被嵌入到网页复杂的结构中,如何从如此海量而又复杂的信息中有效地提取出有价值的数据,目前已经成为一个巨大的挑战。[1]为了能够有效解决上述问题,一种能够针对特定网站、高效爬取相关需求的数据的计算机程序逐渐得到了广泛应用,这就是网络爬虫。本文以某网站的招聘板块作为爬取对象,介绍了爬虫系统从分析系统需求到具体实现的思路,设计了一个定向爬取的爬虫系统,从互联网抓取数据,进行结构化处理后存储到本地,为以后进一步的数据分析和挖掘提供了基础。2.网络爬虫网络爬虫(WebSpider)又叫WebCrawler,通常简称为爬虫,是一种由计算机语言编程实现,能够自动访问指定的网络地址并获取、清理网页中指定数据的一种脚本程序。[2]根据数据采集范围的大小不同,爬虫分为通用网络爬虫和定向网络爬虫,通用网络爬虫在网络中最重要的应用就是搜索引擎,它将互联网上所有符合条件的网站都视为爬取对象,将爬取到的丰富信息存储在数据库中。[3]从而支撑整个搜索引擎,如Google、百度等。定向网络爬虫更有针对性,面向特定的主题,目标是爬取符合特定主题的网页,并将爬取到的内容进行筛选、清理,保证爬取的信息与主题相关,然后提供给用户。相对人工通过浏览器逐个获取数据,网络爬虫在速ComputerSystemNetworkingandTelecommunications计算机系统网络和电信,2019,1(2)ISSN:2661-3719(Print);2661-3727(Online)278度、准确性、后续操作空间等方面都有明显的优势。随着信息时代数据的作用越来越大,各行各业对于数据的采集和整理的需求也越来越迫切,网络爬虫地位也越来越重要。3.Python语言1989年,荷兰国家数学和计算机科学研究院的一名程序员GuidovanRossum创立了Python语言,Python是一种功能强大的高级计算机编程语言,广泛用于数据挖掘、Web开发、科学计算等领域,能高效地实现面向对象编程。Python语言作为一种热门语言,具有以下特点:1)语法简洁清晰、易读易学。2)应用广泛,具有丰富的标准库和庞大的第三方库支持。3)可移植性强,易于操作各种存储数据的文本文件和数据库。4)面向对象,支持开源思想。Python具有的这些特点,使得Python非常适合用于快速开发应用。在使用Python之前,需要先安装和操作系统对应的Python版本,并在系统环境变量中配置Python所在的路径,然后选择合适的开发工具进行开发。目前Python的版本有2.X和3.X两种,两个版本的区别主要在语法、编码、模块,目前Python3已经成为主流,绝大多数的第三方库也已经支持Python3,所以建议使用Python3进行开发。[4]本文中的爬虫程序是在Python3.6环境下开发调试完成的。4.爬虫系统需求的分析和设计4.1系统需求分析网络爬虫系统的设计需要解决以下几个问题:(1)需要爬取数据的网址的提取。首先初始化网址,然后通过对网页DOM(DocumentObjectModel,文档对象模型)的分析获取同层级或下一层级的网页地址。(2)对获取到的具体网页地址进行访问,页面上有我们需要获取的信息,如职位名称、公司名称、薪资等等。Python系统库中自带HTTP库urllib、urllib2等,这里使用功能强大的Python第三方模块requests实现。(3)对网址进行管理。保证能爬取到每个网页,同时记录已爬取过的网页,防止重复爬取。(4)目标网页源信息的分析和整理。通过对网页的分析获取信息,进行清洗,去除不必要的部分,将整理好的有用信息保存到本地数据库或其他文件中。对于网页的解析可以通过使用正则表达式(RegularExpression,RE),或者使用BeautifulSoup、lxml等第三方库来实现,本文中选择使用lxml模块通过Xpath(XML路径语言)来解析出我们需要的信息供爬虫下载。本文将以爬取CSDN招聘版块的职位信息为例说明定向爬虫系统的具体实现过程,系统处理逻辑图见图1。图1爬虫处理逻辑图ComputerSystemNetworkingandTelecommunications计算机系统网络和电信,2019,1(2)ISSN:2661-3719(Print);2661-3727(Online)2794.2爬虫中使用到的模块Python具有丰富的系统库,能够快速实现我们想要的功能,而且由于Python语言是完全开源的,所以全世界有成千上万的开发者针对Python开发出了数量丰富、功能强大的第三方模块,使用这些模块能大大提高我们的开发效率。1)requestsrequests是目前最流行的HTTP库,它采用Apache2.0开源协议,使用起来比urllib更加高效、方便,开发人员使用requests可以轻松地使用HTTP请求与网站服务器交互。2)lxmllxml是Python的一个第三方解析库,使用Cython编写,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。3)csvcsv模块是Python自带的标准库,提供了基本的csv文件读写功能。5.爬虫功能实现爬虫系统由三个模块组成,分别是页面抓取模块、页面分析模块、数据保存模块,对应整个爬取工作的三个步骤。[5]首先在开发环境下安装本文中使用到的requests和lxml库,并将所有需要使用的库导入到工程中。代码如下(以#开始的为注释行):#导入程序中所使用到的库importrequestsfromlxmlimportetreeimportcsv5.1页面抓取模块页面抓取模块是爬虫系统的第一个模块,通过模拟浏览器发送GET请求给Web服务器返回包括数据的页面。为了保证获取到的页面是正确的,首先要保证我们发送给目标站点的信息是正确而全面的,使站点认为是合法的访问用户。比如有些站点会根据HTTP请求的头信息来判断访问请求是否正常,那我们就需要设置爬虫的头信息,在请求中添加User-Agent、Host、Referer等必要的信息。还有一种常见情况是,有些站点提供的信息是针对用户的,那么首先要通过模拟登录后才能获得想要的数据。这种情况下需要将用户的用户名、密码、cookies等所有登录所需要的信息以POST请求发送给站点进行登录,成功登陆后使用返回的session和cookies与站点进行交互,进行爬虫爬取。本文中由于招聘信息是公开可见的,所以不需要模拟登录。先使用浏览器浏览目标网页,需要爬取的页面见图2。使用requests的get方法向目标网址发送HTTP请求,从返回的响应状态码和内容来看,已经成功返回了我们需要的原始数据,下一步进入页面分析阶段。部分代码如下:#设置请求头header={‘user-agent’:’Mozilla/5.0(WindowsNT10.0;WOW64)’,‘host’:’job.csdn.net’}url==requests.get(url)print(resp.status_code)print(resp.text)图2浏览器页面显示ComputerSystemNetworkingandTelecommunications计算机系统网络和电信,2019,1(2)ISSN:2661-3719(Print);2661-3727(Online)2805.2页面分析模块从页面抓取模块返回的数据是网页的HTML代码,包含大量的…和/…,这样的成对结构称为标签(Tag),所有数据都包含在成对的标签当中,那么如何从原始的网页DOM源代码中解析出我们需要的职位、公司名称、薪资、发布时间等数据呢?有几种方式可以做到:(1)正则表达式(Re)。正则表达式匹配是将所有HTML代码视为一个字符串,根据设定好的特殊字符及字符组合,通过组合的“规则字符串”进行搜寻和匹配,从而获取用户想要的特定内容。正则表达式使用灵活,功能强大,但是语法相对晦涩、复杂,在待匹配字符串较长的情况下效率较低。(2)Xpath方式。Xpath适用于定位HTML/XML文档中节点的技术,它将网页DOM视为树形结构,分析节点信息,通过各个节点之间的层次关系解析出数据,效率比较高,这里我们通过第三方模块lxml的Xpath方式来解析数据。使用开发者工具确定在页面中的数据所在的位置,对应的标签和class值,然后编写xpath匹配式进行匹配。如每条职位信息所在的位置都是在一个class=job_descjob_desc_un_frist]的div标签中,那么我们使用语句result=tree.xpath('//div[@class=job_descjob_desc_un_frist]')就能匹配出页面中所有的职位信息,再逐个遍历职位信息,同样使用Xpath分别向下提取出相应字段的数据,如从每条职位信息中提取出招聘链接的Xpath语句为xpath(./a)[1].get(‘href’),经过提取后,最终可以得到一个包含职位、公司、薪资、发布时间、链接这几个字段的嵌套列表,最终传递到数据保存模块进行保存。部分代码如下:#将页面HTML文档建立树形结构tree=etree.HTML(resp.text)result=tree.xpath('//div[@class=job_descjob_desc_un_frist]')job_info=[[职位名称,招聘公司,薪资,发布时间,招聘链接]]foriteminresult:x=item.xpath(./a)jobname=x[1].text.strip()company=x[2].text.strip()wage=x[3].text.st