爬虫应用开发(python课程设计Ⅰ)

目录

一、选题背景

二、爬虫原理

2.1网络爬虫的类型

2.2网络爬虫的使用要求

2.3 Scrapy框架工作流程

三、常用爬虫框架比较

四、数据爬取(腾讯招聘岗位数据)

4.1模型建立

4.2基于Scrapy的腾讯招聘网站爬虫实现

4.3数据查询

4.4遇到的难点

五、总结


一、选题背景

近些年来,随着人类社会的进步,互联网行业快速发展,社会的信息量不断地累计,呈现爆炸式增长,可以说大数据时代已经全面到来。同时,网络招聘作为企业招聘人才的一种重要方式,相对于流程繁琐,耗费大量时间,沟通渠道狭窄的线下招聘,网络招聘成本低,灵活性、针对性强,资源充足,覆盖面较广,通常是当代高校学生在求职时需要密切关注的信息来源。随着网络招聘规模的增长,大量招聘网站出现,而这些网站中包含的招聘信息也为研究者提供了大量的数据。在信息浩如烟海的大数据时代,如何高效获取万维网上所需的信息,是抢占先机的关键。本文基于Scrapy的框架及工作原理展开论述,使用Scrapy定向爬取腾讯招聘网站当中的相关招聘信息数据,对所爬取的招聘信息数据进行处理分析,分析结果可为毕业生就业前招聘信息提供参考。

本文选取了腾讯招聘作为招聘数据采集的网站,总体抓取了不同地区的不同职位的分布情况,不同岗位的职位要求以及岗位招聘的截止日期和申请网址。通过对不同岗位的数据进行分析,可以清晰的了解公司对不同岗位的具体要求,能够为求职者提供一个比较客观的参考标准,可以帮助求职者比较直观的了解当前该公司对人才需求的标准。

二、爬虫原理

2.1网络爬虫的类型

网络爬虫是作为一种计算机程序,具有自动下载网页功能,可以在互联网里采集数据,满足科学计算、数据处理以及网页开发等多个方面的用途,网络爬虫有着通用网络爬虫、聚焦网络爬虫、增量式网络爬虫以及深层网络爬虫等多种类型。

(1)通用网络爬虫∶是根据URL指向爬行的过程中,采取深度优先、广度优先的策略。由URL扩充至Web,逐级、逐层访问网顶页链接,适用于某一主题的广泛搜索,一般应用于搜萦引擎。在大型Web务商中,往往也需要应用通用网络爬虫。

(2)聚焦网络爬虫:是根担内容评价、链接结构评价,按照预设的主题,有选择性地爬行。在输入某一个查间词时,所查间、下载的网络页面均是以查询词作为主题。而在评价链接的过程中,需要应用到半结构化文档的Web页面,应用Page Rank算法。在聚焦网络爬虫中,引入增强学习、建立语境图,均是制定爬行策略的有效途径。

(3)增星式网络腿虫∶其在爬行过程中,网页发生增星式的更新变化。应用统一更新法,按照固定的频率进行网页访问,不会因网页的更新、变化而改变频率。应用个体更新法,道循个体网页的频率,根据频率的改变情况,进行各页面的重新访问。或根据网页变化频率的差异性进行分类更新。

(4)深层网络爬虫:通过传统搜索引擎和静态链按获现的页面多为表是页面,而为了获取深度页面,则需要利用深层网络爬虫。深层网络爬虫在爬行过程中,基于领城知识,进行表单填写,然后进行语义分析,获取关键词,提交关键词后,获取Web页面。或是基于网络结构分析,进行表单填写,利用DOM树形式,表示HTML网页。

2.2网络爬虫的使用要求

网络爬虫技术的应用,无论是个人使用,还是科学研究和商业用途,必须遵循合法、合规的要求。爬虫爬取的数据中,个人隐私、受到版权保护的数据是禁止爬取的内容。对于加密的数据信息,在未获得权限的情况下,禁止爬虫爬取,不得随意转载,更不能获取商业利益。另外,爬虫在爬取网络数据的过程中,需要遵循Robot协议,并明确网页中爬虫可爬取数据和禁止爬取数据。

2.3 Scrapy框架工作流程

爬虫应用开发(python课程设计Ⅰ)

Scrapy是一套纯Python语言开发的,用于爬取网页内容或各种图片并提取结构化数据的开源网络爬虫框架,可以应用于数据挖掘、信息处理或者存储数据等一系列的操作中,是目前Python中使用最受欢迎和最广泛的爬虫框架。其框架主要由以下为5部分组成:Scrapy Engine(引擎)、Scheduler(调度器)、Spiders (蜘蛛)、Item Pipeline(数据处理流水线)和Downloader(下载器)如图所示。 

具体流程是:首先,引擎(Engine )将初始URL ( s)交给处理该网站的 Spider,并在调度器( Scheduler )以 Request 调度,之后引擎向调度器请求下一个要爬取的URL,调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件转发给下载器(Downloader ),一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件发送给引擎,引擎从下载器中接收到 Response 并通过Spider中间件发送给Spider 处理,Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎,引擎将爬取到的Item给Item Pipeline,将( Spider返回的) Request 给调度器,重复执行直到调度器中没有更多地request,引擎关闭该网站。

三、常用爬虫框架比较

Beautiful Soup框架:名气大,整合了一些常用爬虫需求。缺点:不能加载JS。

Scrapy框架:Scrapy框架是一套比较成熟的Python爬虫框架,是使用Python开发的快速、高层次的信息爬取框架,可以高效的爬取web页面并提取出结构化数据。Scrapy应用范围很广,爬虫开发、数据挖掘、数据监测、自动化测试等。

Portia框架:Portia框架是一款允许没有任何编程基础的用户可视化地爬取网页的爬虫框架。

newspaper框架:newspaper框架是一个用来提取新闻、文章以及内容分析的Python爬虫框架。

Python-goose框架:Python-goose框架可提取的信息包括:<1>文章主体内容;<2>文章主要图片;<3>文章中嵌入的任heYoutube/Vimeo视频;<4>元描述;<5>元标签。

Mechanize框架:优点:可以加载JS。缺点:文档严重缺失。不过通过官方的example以及人肉尝试的方法,还是勉强能用的。

Selenium框架:这是一个调用浏览器的driver,通过这个库你可以直接调用浏览器完成某些操作,比如输入验证码。

Cola框架:一个分布式爬虫框架。项目整体设计有点糟,模块间耦合度较高,不过值得借鉴。

PySpider框架:PySpider是binux做的一个爬虫架构的开源化实现。主要的功能需求是:抓取、更新调度多站点的特定的页面。需要对页面进行结构化信息提取。灵活可扩展,稳定可监控。

那么为什么要使用Scrapy框架呢?Scrapy框架主要有以下优点:

1.更容易构建大规模抓取项目;

2.异步处理请求的速度快

3.使用自动调节机制自动调整爬取速度

4.通过管道的方式存入数据库

四、数据爬取(腾讯招聘岗位数据)

4.1模型建立

(1)使用Scrapy提供的全站爬取类,方便在爬虫在工作的时候能自动根据定义的一些规则判断探测到的ur1链接是否需要下载。

(2)为了避免字段出错,提高数据传递过程的准确性,使用Scrapy 中的 item文件集中创建需要爬取的字段属性类,在其他需要的地方实例化该类即可,通过此种方式的被实例化的类的字段可直接被传递到pipelinet文件中集中处理字段值的保存事项。本爬虫中需要在item中定义的字段有六个,当前职位的名称RecruitPostName,当前职位的工作地点LocationName,职位的类别CategoryName,职位的职责Responsibility,职位招聘的截止日期LastUpdateTime和职位申请的网址PostURL。

(3)在 setting文件中打开自动接收并处理的pipeline管道,并在pipelines中设置所有数据的存储和处理,本爬虫采用的是mysql存储。

(4)突破反爬虫机制,当前大部分网站的反爬虫策略会对访问用户的User Agent进行检查,为保证爬虫的有效进行,收集当前用户还在使用的浏览器的User Agent,并在爬虫配置中添加UA。

(5)将robot协议改为不要遵守,避免寻找网站里面的robots.txt,导致爬虫会很快停掉。

(6)创建start.py,作为爬虫程序启动脚本,避免每次手敲命令。

4.2基于Scrapy的腾讯招聘网站爬虫实现

4.2.1建立爬虫

由于Scrapy是一个框架,为了能正常使用这个框架的各个中间件和接口,需要项目自动创建,具体命令:

Scrapy startproject tencent

此时只是创建了一个工程框架,但还没有爬虫。接下来,创建爬虫文件,具体命令如下:

scrapy genspider tx tencent.com

其中,爬虫的名字是tx,要爬取的域名范围是tencnet.com。

4.2.2实现爬虫主文件

创建爬虫时,在爬虫主程序文件中重点只需编写两项内容。首先设置开始爬取的网址url,右键查看网页源代码发现网页主体内容是Query动态加载的数据,所以我们需要抓包。点击Network抓到传输的json数据。抓到数据后,然后分析翻页时这个url的变化,每一页不同的是timestamp(时间戳)和pageIndex(页数),我们可以使用fomat和for语句获取每一页的数据本页面主要代码如图所示。

爬虫应用开发(python课程设计Ⅰ)

4.2.3实现爬取字段

本例中采用的是TencentItem实例化在items中写好的本爬虫的item对象,包含六个字段。

爬虫应用开发(python课程设计Ⅰ)

在scrapy中定义结构化字段,都在items.py中。在数据通过return到此处。本爬虫在处理时使用了一个去除所有空格和换行符的函数,使得该字段存储的都是文本,具体如图所示。

4.2.4实现数据存储

在pipelines.py中创建本爬虫中使用的时mysql数据库进行存储,具体参考如图。

爬虫应用开发(python课程设计Ⅰ)

4.3数据查询

数据保存到数据库后可以通过sql语句进行相关查询,具体如图所示:

爬虫应用开发(python课程设计Ⅰ)

4.4遇到的难点

(1)一开始尝试用xpath解析网页文本内容,在网页端解析能拿到数据,但在python中怎么也拿不到数据,查询后发现自己参考的资料有点过时,腾讯的网站架构和以前也不一样了。前端展示数据时用过json传递动态生成的。其中的网页链接是通过js生成的。并不在原始网页写死的。

(2)本来想把数据存到oracle数据库中。报错多次查百度后还是报错应该是python版本和Oracle版本不匹配,32位/64位也不匹配。要重新安装太麻烦就换了mysql数据库。Mysql在拼接sql语句时也总报错重写了几次终于可以了。Python中不需要定义数据类型,每次都要不决定这是什么类型,不如java方便可以直接看到类型。

(3)mysql的数据文件不太确定,怎么也没找的这个数据库的.idb数据文件。查了下百度mysql有引擎有两种myisam和innodb。

在Myisam下,数据库的每个数据表都有*.frm、*.YMI和*.YMD三个文件,其中*.frm存储数据表的表结构,*.MYI存储数据表的索引,*.MYD存数数据表的记录数据。

在Innodb下,每个数据库下的每个数据表只有一个*.frm存储数据表的表结构,而所有数据库的所有表数据索引、数据记录都全部存储在ibdata1文件中,而ib_logfile0和ib_logfile1是日志文件。

五、总结

本文基于Scrapy爬虫框架实现了一个爬取招聘网站的招聘信息采集,达到了预期爬取数量和质量。从求职者的角度去进行数据分析,能满足本项目对招聘信息数据抓取的设计要求。求职者可以通过对不同岗位进行搜索的分析结果,进而判断招聘信息的有效性及准确性,有利于更好地选择就业岗位。

代码见附件

上一篇:2021/6/15爬虫第二十四次课(redis常用五大数据类型--set与zset、python操作redis、scrapy分布式爬虫实现)


下一篇:scrapy爬取起点中文网24小时热销榜单(将数据存到数据中)