(python)1:1爬取并保存大学学院官网教师信息,简单可视化直观分析
·
相信每个大学的学院在自己的官网上都有介绍自己学院教师的信息,可是自己的大学生涯却又接触不到自己学院的所有老师,再次对学院的官网下手啦,这次想分析一下学院教师的男女比例啦,等等一系列的东西…当然,其实我感觉这是一个有意思的事情,大家也可以爬取自己学院的官网信息,可视化分析试一试😁
爬取学院官网教师信息
1. 分析目标网页
- 打开目标网页(相信每个大学的每个学院官网都有这一栏信息)


- 可以很直观的看出,所有教师的信息保存在一个表格当中,查看网页源码验证一下自己的想法:

直接定位元素的源码位置,可以看出确实保存在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 教师毕业大学整合(柱状图)


在这里,我真诚的感谢每一位我在大学遇到的每一位老师,谢谢!
更多推荐
所有评论(0)