相信每个大学的学院在自己的官网上都有介绍自己学院教师的信息,可是自己的大学生涯却又接触不到自己学院的所有老师,再次对学院的官网下手啦,这次想分析一下学院教师的男女比例啦,等等一系列的东西…当然,其实我感觉这是一个有意思的事情,大家也可以爬取自己学院的官网信息,可视化分析试一试😁

1. 分析目标网页

  1. 打开目标网页(相信每个大学的每个学院官网都有这一栏信息)
    在这里插入图片描述
    在这里插入图片描述
  2. 可以很直观的看出,所有教师的信息保存在一个表格当中,查看网页源码验证一下自己的想法:
    在这里插入图片描述
    直接定位元素的源码位置,可以看出确实保存在table标签当中,再看每一个元素的位置,都是在span标签中保存,但自己观察数据和源码,会发现在名字一栏,其若是两个字的名字的话,中间是由空格隔开的,这对于使用xpath提取的话,在进行数据清洗保存的时候会比较麻烦,而且下面的有数据为空,对于爬取下来的数据进行分类也比较麻烦。我采用了一种简单粗暴的方法用来提取这表格保存的数据,下面我会给出解决的方法。
    在这里插入图片描述

2. 暴力爬取表格存储的教师信息

此次爬取使用的是Scrapy框架。

2.1 创建工程

scrapy startproject rjxyInfo

2.2 创建Spider

在Pycharm下端的Terminal中执行即可:(可以指定域名)

scrapy genspider rjxy 

2.3 暴力爬取表格信息

2.3.1 分析如何爬取

网页的源码并没有什么特殊的地方,但是在使用xpath爬取的时候,直接进行爬取,会因为源码在编写的时候使用了回车符,或者有的表格中的信息没有填写,直接进行爬取返回的数据不易整理成组存入数据库。但通过直接查看其xpath源码,会发现其中的规律:

    # 性别
    # //*[@id="vsb_content"]/div/div/table/tbody/tr[2]/td[3]/p/span
    # //*[@id="vsb_content"]/div/div/table/tbody/tr[103]/td[3]/p/span

    # 序号
    # //*[@id="vsb_content"]/div/div/table/tbody/tr[2]/td[1]/p/span
    # //*[@id="vsb_content"]/div/div/table/tbody/tr[103]/td[1]/p/span

    # 姓名
    # result = ''.join(response.xpath('//*[@id="vsb_content"]/div/div/table/tbody/tr[3]/td[2]/p/span/text()').extract()).strip()

    # 毕业学校
    # //*[@id="vsb_content"]/div/div/table/tbody/tr[2]/td[5]/p/span

    # 现从事专业
    # //*[@id="vsb_content"]/div/div/table/tbody/tr[2]/td[6]/p/span

    # 备注
    # //*[@id="vsb_content"]/div/div/table/tbody/tr[2]/td[7]/p/span

2.3.2 编写spider中的parse()方法

    def parse(self, response):
        for i in range(2,104):
            i = str(i)
            item = TeachersItem()
            item['id'] = response.xpath('//*[@id="vsb_content"]/div/div/table/tbody/tr[' +i + ']/td[1]/p/span/text()').extract()
            item['name'] = ''.join(response.xpath('//*[@id="vsb_content"]/div/div/table/tbody/tr[' +i+ ']/td[2]/p/span/text()').extract()).strip()
            item['sex'] = ''.join(response.xpath('//*[@id="vsb_content"]/div/div/table/tbody/tr[' +i+ ']/td[3]/p/span/text()').extract()).strip()
            item['degree'] = response.xpath('//*[@id="vsb_content"]/div/div/table/tbody/tr[' +i+ ']/td[4]/p/span/text()').extract()
            item['graduated_school'] = ''.join(response.xpath('//*[@id="vsb_content"]/div/div/table/tbody/tr[' +i+ ']/td[5]/p/span/text()').extract()).strip()
            item['now_Teachproject'] = ''.join(response.xpath('//*[@id="vsb_content"]/div/div/table/tbody/tr[' +i+ ']/td[6]/p/span/text()').extract()).strip()
            item['remark'] = response.xpath('//*[@id="vsb_content"]/div/div/table/tbody/tr[' +i+ ']/td[7]/p/span/text()').extract()
            yield item

3. 将数据存入数据库

class PymysqlPipeline(object):
    #连接数据库
    def __init__(self):
        self.connect = pymysql.connect(
            host = 'localhost',
            database = 'teachersinfo',
            user = 'root',
            password = '123456',
            charset = 'utf8',
            port = 3306
        )
        # 创建游标对象
        self.cursor = self.connect.cursor()

    # 此方法是必须要实现的方法,被定义的 Item Pipeline 会默认调用这个方法对 Item 进行处理
    def process_item(self,item,spider):
        # 判断item是哪一类的item

            cursor = self.cursor
            sql = 'insert into teachers(id,name,sex,degree,graduated_school,now_Teachproject,remark) values (%s,%s,%s,%s,%s,%s,%s)'
            cursor.execute(sql,(
               item['id'],item['name'],item['sex'],item['degree'],item['graduated_school'],item['now_Teachproject'],item['remark'],
            ))
            # 提交数据库事务
            self.connect.commit()
            return item

在这里插入图片描述

4. 通过sql语言查询,得到数据进行数据可视化

4.1 sql语言查询举例

在这里插入图片描述

4.2 全部老师男女比例(柱状图)

在这里插入图片描述

4.3 专职老师男女比例(柱状图)

在这里插入图片描述

4.4 师资力量(柱状图)

在这里插入图片描述

4.5 师资力量(饼图)

在这里插入图片描述

4.6 不同备注教师比例(柱状图)

在这里插入图片描述

4.7 不同备注教师比例(饼图)

在这里插入图片描述

4.8 教师毕业大学整合(柱状图)

在这里插入图片描述
在这里插入图片描述
在这里,我真诚的感谢每一位我在大学遇到的每一位老师,谢谢!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐