哈工大深圳计算机学院老师信息的爬取
目录
1.实验目标概述
本次作业要求学习、理解爬虫技术并进行简单地应用。
- 利用爬虫爬取学院官网老师的简历信息, 可以使用例如scrapy的爬虫框架 (http://cs.hitsz.edu.cn/szll/qzjs.htm);
- 将爬取的信息进行清理(也可以在爬取的时候就定义好匹配规则), 然后将爬取的数据存入一个合理设计表项的数据库,对应简历中的各项信息:例如姓名、任职、电话等等;
- 完成实验报告,介绍爬虫的基本原理以及使用的基本方法、实验流程和实验心得等。
2.实验环境配置
Win10 + Scrapy 2.4.1 + python3.6.6 + MySQLdb
3.实验过程
3.1Scrapy框架的使用介绍
- Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。
- 用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常方便。
- Scrapy 使用了 Twisted异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。
3.1.1Scrapy架构图

- Scrapy Engine(引擎): 负责
Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。 - Schduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理- Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
- Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
- Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
- Spider Middlewares(Spider中间件):可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)。
3.1.2 Item Pipeline
当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。
每个Item Pipeline都是实现了简单方法的Python类,比如决定此Item是丢弃而存储。以下是item pipeline的一些典型应用:
- 验证爬取的数据(检查item包含某些字段,比如说name字段)
- 查重(并丢弃)
- 将爬取结果保存到文件或者数据库中(本次实验将结果保存到文件中,代码见后续分析)
为了启用Item Pipeline组件,必须将它的类添加到 settings.py文件ITEM_PIPELINES 配置。本次实验的配置如下所示

分配给每个类的整型值,确定了他们运行的顺序,item按数字从低到高的顺序,通过pipeline,通常将这些数字定义在0-1000范围内(0-1000随意设置,数值越低,组件的优先级越高)
3.1.3Spider
Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。
class scrapy.Spider是最基本的类,所有编写的爬虫必须继承这个类。
主要用到的函数及调用顺序为:
__init__(): 初始化爬虫名字和start_urls列表start_requests() :调用make_requests_from url():生成Requests对象交给Scrapy下载并返回responseparse(): 解析response,并返回Item或Requests(需指定回调函数)。Item传给Item pipline持久化 , 而Requests交由Scrapy下载,并由指定的回调函数处理(默认parse()),一直进行循环,直到处理完所有的数据为止。
3.1.4 Settings
Scrapy设置(settings)提供了定制Scrapy组件的方法。可以控制包括核心(core),插件(extension),pipeline及spider组件。比如 设置Json Pipeliine、LOG_LEVEL等。
- DEPTH_LIMIT:默认0,爬取网站最大允许的深度(depth)值。如果为0,则没有限制。
- DOWNLOAD_TIMEOUT:默认:180,下载器超时时间(单位: 秒)。
ITEM_PIPELINES:默认{}。保存项目中启用的pipeline及其顺序的字典。该字典默认为空,值(value)任意,不过值(value)习惯设置在0-1000范围内,值越小优先级越高。- LOG_ENABLED:认: True。是否启用logging。
- LOG_ENCODING:认: 'utf-8',logging使用的编码。
- LOG_LEVEL:认: 'DEBUG',log的最低级别。可选的级别有: CRITICAL、 ERROR、WARNING、INFO、DEBUG 。
COOKIES_ENABLED = False禁用Cookies
3.1.5 Scrapy运作流程
- 引擎接收Spider需要处理的网站的URL
- 引擎将request请求交给调度器处理,调度器处理完成后将request交给引擎
- 引擎将reque请求交给下载器下载,下载器按照下载中间件的设置将下载好的请求发送给引擎(如果下载失败,引擎告诉下载器记录一下,过一定时间重新下载)。
- 引擎将下载好的东西交给Spider,Spider将数据处理完成之后,如果有需要跟进的URL会继续交给引擎按以上步骤处理。并且将获取得到的item数据交给引擎。
- 引擎将Spider处理得到的item交给管道进行处理,将得到的需要跟进的URL交给调度器接着处理。然后接着循环。
3.1.6 制作Scrapy爬虫步骤
新建项目 (scrapy startproject xxx):新建一个新的爬虫项目
设置目标 (编写items.py):明确需要抓取的目标
制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页
存储内容 (pipelines.py):设计管道存储爬取内容
3.2 实验流程
3.2.1 新建项目
创建一个爬虫项目,命令为 Scrapy startproject xxxx名称

可以在目录 C:User\zrh\myProject中看到项目的文件结构如下所示

- scrapy.cfg :项目的配置文件
- myProject/ :项目的Python模块,将会从这里引用代码
- myProject/items.py :项目的目标文件
- myProject/pipelines.py :项目的管道文件
- myProject/settings.py :项目的设置文件
- myProject/spiders/ :存储爬虫代码目录
3.2.2 设置目标
首先打开网站http://cs.hitsz.edu.cn/szll/qzjs.htm,查看我们最终需要爬取的目标应该包含什么信息。

通过图片可以看到,每位教师应该包括姓名、任职、电话、传真、Email、研究方向六个属性信息。而根据上面的scrapy框架的运作流程机制可知,最终的提取的目标的数据字段结构是通过item来定义的,因此:
打开myProject目录下的items.py
创建1个MyprojectItem类,并且定义类型为scrapy.Field类属性来定义一个item.

3.2.3 制作爬虫
在当前目录下输入命令,将在myProject/spider目录下创建一个名为test的爬虫,并制定爬取域的范围:
scrapy genspider test “cs.hitsz.edu.cn”
- 打开 myProject/spider目录里的test.py,默认增加了下列代码:
- class ItcastSpider(scrapy.Spider):
- name = "test"
- allowed_domains = ["cs.hitsz.edu.cn "]
- start_urls = (
- 'http:// cs.hitsz.edu.cn/',
- )
- def parse(self, response):
- Pass
- name = "" :这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。
- allow_domains = [] 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。
- start_urls = () :爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。
start_urls=['http://cs.hitsz.edu.cn/szll/qzjs.htm','http://cs.hitsz.edu.cn/szll/qzjs/5.htm','http://cs.hitsz.edu.cn/szll/qzjs/4.htm','http://cs.hitsz.edu.cn/szll/qzjs/3.htm','http://cs.hitsz.edu.cn/szll/qzjs/2.htm','http://cs.hitsz.edu.cn/szll/qzjs/1.htm']
- parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
- 负责解析返回的网页数据(response.body),提取结构化数据(生成item)
- 生成需要下一页的URL请求。
为了能够顺利的爬到数据,需要更改配置信息,将是否遵循robots协议字段置为false。
![]()
首先观察页面源码

通过上图可以看出六个属性的标签的xpath路径都在/html/body/div[@class='grid_2']/div[@class='container']/div[@class='list']/div[@class='right']/div[@class='rightbox']/div[@class='listbox']/div[@class='teacher-content']/ul/li下
但是具体标签的路径略有不同


我们之前在mySpider/items.py 里定义了一个MyprojectItem类。 这里引入进来,然后将我们得到的数据封装到一个MyprojectItem对象中,可以保存每个老师的属性。将提取到的老师信息直接存入到数据库中。具体实现参考代码。

除了直接将获取的老师的信息直接写入数据库中,同时将获得的老师信息存入到文件中。



3.3 实验结果及数据库设计
因为老师的个人信息包括姓名、职称、电话、传真、邮箱、研究方向。经过分析,哈工大深圳计算机学院的老师存在姓名相同的情况,而且职称电话传真邮箱研究方向也存在为空的情况,因此数据库的设计如下所示:

最后的结果如下所示:




结果正确!
最终的结果见文件result.csv。
4. 个人心得
通过这次实验,对爬虫技术有了深刻的理解和体会,同时懂得了如何使用scrapy框架进行爬虫。另外,scrapy框架是真的好用,比用requests库爬虫方便多了。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)