scrapy爬取昆明理工大学信自学院导师信息

  • 1.爬取目的
  • 2.技术可行性
  • 3.scrapy爬虫
  • 4.爬取过程及结果
    • 4.1 根据要抓取的信息首先创建一个Item实体
    • 4.2 解析出Item,并将Item交给Pipeline管道
    • 4.3 在Pipeline实现对于爬取信息的保存
    • 4.4 关于程序的执行
  • 5.程序运行截图
  • 6.最后如果有人想要此次爬取的资料(照片+excel),可以私聊我,看到后肯定会回复的。

1.爬取目的

\qquad关于昆明理工大学研究生导师信息的收集是因为昆工学校的官网经常不定时关闭,导致一些学生想要查看一些老师的信息,结果却查看不到。正好我的一位同学也刚好想要搜集老师的相关信息。这些信息都在这个学院的官网上放着,http://xzy.kmust.edu.cn/MHWZ/MHWQTGL/jslist.do?ywlbdm=001&lmlxdm=02&lmlbdm=0205&zc=05但是当他看到有一百多位老师的时候,想必谁都会犯怵吧
于是,就想着能不能写一个程序将这些信息全部收集起来呢。

2.技术可行性

\qquad现如今随着网络技术的发展,以及数据量的急剧增大,就萌生了一种新的技术,称之为爬虫。我所了解到的很多从事大数据行业的以及做数据分析的从业者,都有需要进行爬虫的需求。这也就使得这项爬虫技术很快的发展,正好在此处也为我们的此次“偷懒”提供了可能。

3.scrapy爬虫

\qquad多番调研之后我们采用了很多人都会使用的scrapy爬虫框架,接下来我来简单介绍一下该框架的运行机制:
Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下:

\qquad从上边的示意图中我们也可以看出,scrapy是由这几个不同的功能模块相互协作,一起完成爬取动作的,接下来我来简单介绍一下其各个功能模块的作用:

功能模块 作用
引擎(Scrapy) 处理整个系统的数据流、触发事务(框架核心)
调度器(Scheduer) 接收引擎发过来的请求,压入队列,在引擎再次请求的时候返回。(其中这个队列指的是要抓取网页的Url地址,可以去除重复网址。)
下载器(Downloader) 用于下载页面内容,并将页面内容返回给spiders
爬虫(Spiders) 在这一部分完成爬取工作的大部分,即在网页中提取出用户需要的数据,并将其赋值给Item实体。也可以在这里进行翻页操作。
项目管道(Pipeline) 处理刚才传递的Item实体,验证实体有效性。
下载器中间件(Downloader Middlewares) 处理Scrapy引擎与下载器(Downloader)之间的请求及响应
爬虫中间件(Spider Middlewares) 处理蜘蛛的响应输入和请求输出。
调度中间件(Scheduer Middlewares) 从Scrapy引擎发送到调度的请求和响应。

从上边的表格中我们也可以明白整个scrapy框架的工作流程可以简单表述成:

  1. 引擎在调度器中抽取一个网址(URL)用于下一步的抓取
  2. 引擎把网址(URL)封装成一个Request请求传给下载器
  3. 下载器把资源下载下来,并且封装成Response应答包
  4. Spiders爬虫解析应答包Response
  5. 解析出Item实体后,将Item实体交给实体管道进行进一步的处理
  6. 如果解析出的是链接,则把新的URL压入调度器中,等待抓取。

4.爬取过程及结果

\qquad此次爬取,暂且略去scrapy整个爬虫框架环境的搭建,如果以后有机会的话,我会再为大家写一个详细教程的。此次博客仅以这个小抓取实验展开。

4.1 根据要抓取的信息首先创建一个Item实体

\qquad首先我们先参照一下需要存取的信息,包括:教师姓名,性别,职称…个人简介等等。

按照上边的需求我们在items.py内定义一下实体:

# -*- coding: utf-8 -*-# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class CoinPicsItem(scrapy.Item):# define the fields for your item here like:url=scrapy.Field()#老师独立介绍界面name=scrapy.Field()#姓名gender=scrapy.Field()#性别position=scrapy.Field()#职称type=scrapy.Field()#email=scrapy.Field()#电子邮件phone=scrapy.Field()#电话office_address=scrapy.Field()#办公地址eduction_background=scrapy.Field()#教育背景search_derection=scrapy.Field()#研究方向description=scrapy.Field()#老师描述img_url=scrapy.Field()#老师照片存储地址

4.2 解析出Item,并将Item交给Pipeline管道

这里才是对于数据进行处理的重头戏,以下为其代码:

# -*- coding: utf-8 -*-
import scrapy
from coin_pics.items import CoinPicsItem
from scrapy.http import Request
from selenium import webdriver
from time import sleep
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import re
import os
from selenium.common.exceptions import TimeoutExceptionclass CoinPicSpider(scrapy.Spider):name = 'coin_pic'allowed_domains = ['xzy.kmust.edu.cn']start_urls = ['http://xzy.kmust.edu.cn/MHWZ/MHWQTGL/jslist.do?ywlbdm=001&lmlxdm=02&lmlbdm=0205&zc=05',]#起始抓取网页地址,也就是我们所说的URL队列def parse(self, response):# print(response)items = []for i in range(136):item = CoinPicsItem()url=response.xpath('//*[@id="jslist"]/tr/td/a/@href').extract()[i]item['url'] = 'http://xzy.kmust.edu.cn' + urlyield scrapy.http.Request(item['url'], meta={'item': item}, callback=self.parse1)def parse1(self,response):item = response.meta['item']#开始接收返回的数据#获取老师姓名ccc = response.xpath('//*[@id="jsxxread"]/tr[1]/td[2]/text()').extract()[0]item['name']=self.get_need_name(ccc)#获取老师性别ccc = response.xpath('//*[@id="jsxxread"]/tr[1]/td[4]/text()').extract()[0]item['gender']=self.get_need_name(ccc)#获取老师职称ccc = response.xpath('//*[@id="jsxxread"]/tr[2]/td[2]/text()').extract()[0]item['position'] = self.get_need_name(ccc)#获取老师所属教研室ccc = response.xpath('//*[@id="jsxxread"]/tr[2]/td[4]/text()').extract()[0]item['type'] = self.get_need_name(ccc)#获取老师电子邮箱ccc = response.xpath('//*[@id="jsxxread"]/tr[3]/td[2]/text()').extract()[0]item['email'] = self.get_need_name(ccc)#获取老师电话ccc = response.xpath('//*[@id="jsxxread"]/tr[3]/td[4]/text()').extract()[0]item['phone'] = self.get_need_name(ccc)#获取老师办公地址ccc = response.xpath('//*[@id="jsxxread"]/tr[4]/td[2]/text()').extract()[0]item['office_address'] = self.get_need_name(ccc)#获取老师教育背景ccc=response.xpath('//*[@id="jsxxread"]/tr[5]/td[2]/p/text()').extract()item['eduction_background']='暂无描述'if(len(ccc)!=0):item['eduction_background'] = response.xpath('//*[@id="jsxxread"]/tr[5]/td[2]/p/text()').extract()[0]#获取老师研究方向ccc = response.xpath('//*[@id="jsxxread"]/tr[6]/td[2]/text()').extract()[0]item['search_derection'] = self.get_need_name(ccc)#获取老师描述bbb=response.xpath('//*[@id="jsxxread"]/tr[8]/td/div/div/span/text()').extract()description=''for b in bbb:description=description+bitem['description']=description#获取老师图片连接地址aaa=response.xpath('//*[@id="div1"]//@src').extract()item['img_url']='暂无图片'if(len(aaa)!=0):img_url= response.xpath('//*[@id="div1"]//@src').extract()[0]lists=re.split(r'../',img_url)item['img_url'] = 'http://xzy.kmust.edu.cn/' + lists[2] + 'os/' + lists[3]yield item#http://xzy.kmust.edu.cn/Servletphoto?path=teacherphotos/cwg001.jpg#../../Servletphoto?path=teacherphotos/cwg001.jpgdef get_need_name(self,str):lists = re.split(r'\r\n', str)list=re.split(r' ',lists[1])result = list[-1]return result

\qquad当然如果你只做到这里我们知识完成了对于Item实体的赋值,其实如果你没有声明一下的话,下一步Pipeline管道是永远不会得到要进一步处理的实体Item的。因此这就需要我们在setting.py文件里边加入如下声明,我要将Item传入哪个管道进行处理。(此处我们的项目因为比较小,所以只开设了一个管道,但如果项目管道多的时候,计算机就不知道我们要将Item实体传入到哪个管道了,所以此处非常重要!!)

# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {'coin_pics.pipelines.CoinPicsPipeline': 300,
}

代码中的管道数值,可以随意设置,一般设置为1~1000皆可。主要用于区分不同的管道(至少我是这么理解的)。

4.3 在Pipeline实现对于爬取信息的保存

\qquad在管道内得到Item实体传过来的信息以后,我们需要在对应的pipelines进行数据的进一步处理(比如保存,存入数据库等等),但如果是网页地址的话,可以按照需求选择是否传回之前的等待爬取的URL网址队列。
\qquad此处我们就直接将导师的图片直接下载到本地。pipelines.py代码如下:

# -*- coding: utf-8 -*-# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
import openpyxl
from openpyxl import Workbook
from openpyxl.drawing import image
import requests
import urllib.request
from time import sleep
#存储到本地数据
class CoinPicsPipeline(object):def __init__(self):#创建excel,填写表头self.wb = Workbook()self.ws = self.wb.activeself.ws.append(['姓名', '性别', '职位', '所在院系','电子邮件','电话','办公地址','教育背景','研究方向','描述','图片'])  # 设置表头def process_item(self, item, spider):line = [item['name'], item['gender'], item['position'], item['type'],item['email'],item['phone'],item['office_address'],item['eduction_background'],item['search_derection'],item['description'],item['img_url']]  # 把数据中每一项整理出来self.ws.append(line)  # 将数据以行的形式添加到xlsx中self.wb.save('kmust_teachers2.xlsx')  # 保存xlsx文件#以下将图片爬取下来存储到本地if(item['img_url']!='暂无图片'):imgres = requests.get(item['img_url'])with open(r'K:/数据存档/scrapy项目/coin_pics/coin_pics/teachers/'+str(item['name'])+'.jpg', "wb") as f:f.write(imgres.content)return item

\qquad例如在这个管道中,我就讲导师的全部信息先存到一个excel表格中,并且又单独对各个导师的图片进行了下载。

4.4 关于程序的执行

\qquad由于scrapy框架的特殊,我们在启动该爬虫时,还需要在同级目录下自己创建一个python文件来启动该爬虫模块。例如我自己创建了一个run.py文件,其内容如下:

# @Time : 2019/5/4 11:17
# @Author : kingback
# @File : run.py
# @Software: PyCharm
from scrapy import cmdline
cmdline.execute("scrapy crawl coin_pic".split())

\qquad我们需要调用cmd命令窗口来执行名字为“coin_pic”的爬虫。这个名字是在我们一开始要创建爬虫时必须为起的一个名字,就像是一个小孩的出生,你得给他起个名字一样。这样该命令一执行,就会启动我们的爬虫。

5.程序运行截图

6.最后如果有人想要此次爬取的资料(照片+excel),可以私聊我,看到后肯定会回复的。

scrapy爬取昆工信自院导师信息相关推荐

  1. 网络爬虫之scrapy爬取某招聘网手机APP发布信息

    1 引言 过段时间要开始找新工作了,爬取一些岗位信息来分析一下吧.目前主流的招聘网站包括前程无忧.智联.BOSS直聘.拉勾等等.有段时间时间没爬取手机APP了,这次写一个爬虫爬取前程无忧手机APP岗位 ...

  2. scrapy爬取某招聘网手机APP发布信息

    1 引言 ​ 过段时间要开始找新工作了,爬取一些岗位信息来分析一下吧.目前主流的招聘网站包括前程无忧.智联.BOSS直聘.拉勾等等.有段时间时间没爬取手机APP了,这次写一个爬虫爬取前程无忧手机APP ...

  3. 关于scrapy爬取51job网以及智联招聘信息存储文件的设置

    通过这两个文件,,可以存储数据(但是注意在爬虫文件中也在写相应的代码 具体参考51job网和智联招聘两个文件) 1.先设置items文件 # -*- coding: utf-8 -*-# Define ...

  4. Scrapy爬取拉勾网职位信息

    很多网站都用了一种叫做Ajax(异步加载)的技术,通常我们会发现这种网页,打开了,先给你看上面一部分东西,然后剩下的东西再慢慢加载,也就是局部加载.所以你可以看到很多网页,浏览器中的网址没变,但是数据 ...

  5. python从网上获取数据失败怎么解决_求助:scrapy爬取数据失败,反复调试都不成功...

    目标:爬取某一学习网站上课程信息,前期调试仅获取课程名称 爬虫文件: import scrapy from xtzx.items import XtzxItem from scrapy.http im ...

  6. 【爬虫】Scrapy爬取腾讯社招信息

    目标任务:爬取腾讯社招信息,需要爬取的内容为:职位名称,职位的详情链接,职位类别,招聘人数,工作地点,发布时间. 一.预备基础 1.Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站 ...

  7. Python scrapy爬取京东,百度百科出现乱码,解决方案

    Python scrapy爬取京东 百度百科出现乱码 解决方案 十分想念顺店杂可... 抓取百度百科,出现乱码 把页面源码下载下来之后,发现全是乱码,浏览器打开 但是浏览器链接打开就没有乱码 以下是浏 ...

  8. Scrapy爬取姓名大全,看看那个名字最受父母青睐

    点击上方"AI搞事情"关注我们 最近在做的项目需要用到名字的数据,可哪儿有这么多名字给我用呢?经一通搜索,不仅找到一个神奇的网站姓名大全,还有人开源了爬虫的代码.让我一番修改,得到 ...

  9. 四十三、Scrapy 爬取前程无忧51jobs

    @Author:Runsen 之前爬了拉钩,爬了boss ,你认为我会放过51jobs 吗 这是不可能的,今日用下scrapy 来爬 51jobs,前程无忧 关于新建项目和spider 不说了,今日用 ...

最新文章

  1. vs code 列编辑模式
  2. 五大晶元厂的内存型号命名方式
  3. 布袋除尘器过滤风速多少_布袋除尘器处理风量、过滤风速、过滤面积及阻力的选型计算...
  4. 几种存储器的主要应用
  5. Java 8流中的数据库CRUD操作
  6. Apache Spark:更改架构之前必须解决的5个陷阱
  7. R-CNN 物体检测第一弹
  8. STM32 Cortex-M3 NMI异常
  9. android 打开免打扰模式,Android 6.0设置模块免打扰功能浅析
  10. linux 数据转为曲线图,Linux系统下生成TPS,ResponseTime曲线图
  11. 第18章 基于物理的渲染
  12. Win10修改有线网卡的MAC地址
  13. 橡皮擦的英语_英语单词这样写,老师想扣卷面分都难!(建议收藏学习)
  14. _crol_和左移的区别
  15. 经典网络模型 —— 盘点 22篇必读论文与网络模型 + 5种常见数据集
  16. 计算个人所得税的html,实验3-6 计算个人所得税 (10 分)
  17. 永久免费!永洪科技发布桌面智能数据分析工具Desktop,推动数据应用平民化
  18. python筛选出csv满足某条件的行_Python之根据条件筛选特定行
  19. android学习笔记----多线程断点续传下载原理设计
  20. tableau 颜色设置汇总

热门文章

  1. C++ 函数重载(第三章)
  2. TF报错及解决方法 Error: TF_DENORMALIZED_QUATERNION
  3. 内存屏障中的读写屏障——并发问题
  4. Linux下make cmake 编译等啥意思?
  5. GetDocument()
  6. 安装部署启动Metricbeat,Windows
  7. 时间复杂度_《羊卓的杨的算法笔记》_Quentin
  8. 警冲标和绝缘节的那些事儿
  9. 【MacBook M1录屏方法 (只录电脑或者同时录电脑和麦克风人声)】
  10. 含金量较高的国际计算机编程竞赛有哪些?USACO、CCC、UK EBRAS、Kaggle、IOI