爬虫系列(1):爬取北邮网研院导师的联系方式

2024-03-09 00:10

本文主要是介绍爬虫系列(1):爬取北邮网研院导师的联系方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 想法与目的
    • 所用环境
    • 代码
    • 截图解释
    • 运行结果

想法与目的

考研的小伙伴们大家好,受今年疫情影响,2020考研的复试到5月份才进行,北邮网研院的计算机科学与技术专业的分数线也提高了12分,到达了312分,不得不找调剂的小伙伴就会面临一个问题——提前联系导师。而北邮网研院导师的介绍是在中心分组里面的,报考的时候却根本不知道老师是属于哪个中心的。那么就产生了一个想法,如果能获取网研院官网上的导师联系方式,那是不是会方便很多呢?(PS:获取了导师的联系方式,也就可以去实现自动给导师发邮件的功能了,哈哈哈,不用做一个没有感情的发邮件机器了)

所用环境

window系统
python 3.7版本
pycharm编辑器

第三方依赖库作用
urllib网址解析
requests网络请求
scrapy使用xpath表达式进行信息提取(scrapy安装有点复杂,也可以使用别的库)
xlsxwriter将信息保存到Excel表格中(也可以保存到txt文件中)

代码

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:tzy
@File:爬取北邮网研院导师信息.py
@Time:2020/5/8 12:37
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
参考文档
python:往列表中添加字典时碰到的问题https://blog.csdn.net/Sheldomcooper/article/details/82258006
【Python实例学习】用Python的xlsxwriter模块操作Excel表格,包括写入数据、样式设置、插入图片等https://blog.csdn.net/woshiyigerenlaide/article/details/103976391
"""
import refrom urllib import parse
import requests
from scrapy import Selector
import xlsxwriter#定义链接,用于后文拼接完整URL
DOMAIN = 'https://int.bupt.edu.cn'#获取导师的中心信息,存储到teacherList中
def getTeacherCentre(url, teacherList):#每个导师信息分别存储在teacherDict中teacherDict = dict()#网络请求res_text = requests.get(url).text#使用xpath表达式进行分析sel = Selector(text=res_text)divs = sel.xpath('//div[@class="padl20 ovhi clear"]/div')for div in divs:#所属中心的访问链接以及名称centre_url = div.xpath('./a[1]/@href').extract()[0]centre_url = parse.urljoin(DOMAIN, centre_url)centre_name = div.xpath('./a[1]/text()').extract()[0]teacherDict['centre_url'] = centre_urlteacherDict['centre_name'] = centre_nameprint('centre_url:{}'.format(centre_url))print('centre_name:{}'.format(centre_name))getTeacherName(centre_url, teacherList, teacherDict)# break#测试#获取导师的姓名,存储到teacherList中
def getTeacherName(url, teacherList, teacherDict):res_text = requests.get(url).textsel = Selector(text=res_text)divs = sel.xpath('//div[@class="content padtb10"]/div')for div in divs:#可能获取不到,先设置一个默认值teacher_url = '空'teacher_name = '空'try:teacher_url = div.xpath('./a[2]/@href').extract()[0]#拼接成为一个完整的URLteacher_url = parse.urljoin(DOMAIN, teacher_url)teacher_name = div.xpath('./a[2]/text()').extract()[0]#去掉职称信息teacher_name = re.search('(\S.+?)\s', teacher_name).group(1)#去掉姓名中间的空格teacher_name = re.sub('\s', '', teacher_name)except Exception as e:#有的导师信息的网页书写与其他导师的不同,这里也考虑了部分的不同#不考虑也行,之后全部去手动填补print('='*20+'error'+'='*20)print(e)teacher_url = div.xpath('./a/@href').extract()[0]teacher_url = parse.urljoin(DOMAIN, teacher_url)teacher_name = div.xpath('./a/text()').extract()if len(teacher_name) != 0:#有的获取不到,会是一个空列表或者空值,就要try或者if判断一下teacher_name = re.search('(\S.+?)\s', teacher_name[0])if teacher_name is not None:teacher_name = teacher_name.group(1)teacher_name = re.sub('\s', '', teacher_name)else:#如果书写规则与上述的还是不同,就放弃,之后手动填补teacher_name = '无'finally:print('teacher_url:{}'.format(teacher_url))print('teacher_name:{}'.format(teacher_name))teacherDict['name'] = teacher_nameteacherDict['url'] = teacher_urlgetTeacherInfo(teacher_url, teacherList, teacherDict)# break#测试#获取导师的邮件信息,存储到teacherList中
def getTeacherInfo(url, teacherList, teacherDict):res_text = requests.get(url).textsel = Selector(text=res_text)tbody = sel.xpath('//tbody/tr')email = 'null'#现在只提取邮件,其他信息之后再说for tr in tbody:email_name = tr.xpath('./td[1]//text()').extract()#连接成字符串再判断,有的是Email:,有的是email,有的是电子邮件字段email_name = ''.join(email_name)if 'mail' in email_name or '邮件' in email_name:email = tr.xpath('./td[2]/p//text()').extract()email = ''.join(email).strip()print('email为:{}'.format(email))teacherDict['email'] = email#获取到了所需的全部信息,存储到列表中# 向列表中添加字典值,需要进行深拷贝teacherList.append(teacherDict.copy())#保存信息到excel表格中
#这里是获取完全部数据在进行保存的,因为数据量不大
def saveTeacherInfo(teacherList):workbook = xlsxwriter.Workbook('./teacher1.xlsx')worksheet = workbook.add_worksheet('teacher')heading = ['centre_name', 'centre_url', 'name', 'url', 'email']worksheet.write_row('A1', heading)for i in range(0,len(teacherList)):row = i + 1worksheet.write(row, 0, teacherList[i]['centre_name'])worksheet.write(row, 1, teacherList[i]['centre_url'])worksheet.write(row, 2, teacherList[i]['name'])worksheet.write(row, 3, teacherList[i]['url'])worksheet.write(row, 4, teacherList[i]['email'])workbook.close()print('数据保存完毕')#有关Excel表格的美化就懒得研究了(自适应列宽),反正信息到手了def main():teacherList = []# teacherDict = {}url = 'https://int.bupt.edu.cn/list/list.php?p=6_28_1'getTeacherCentre(url, teacherList)# url = 'https://int.bupt.edu.cn/content/content.php?p=6_28_82'# getTeacherName(url, teacherList, teacherDict)# url = 'https://int.bupt.edu.cn/content/content.php?p=6_16_114'# getTeacherInfo(url, teacherList)#测试-此处注释内容用作代码测试print('teacherList:{}'.format(teacherList))saveTeacherInfo(teacherList)if __name__ == '__main__':main()

截图解释

这里就是爬虫的入口链接-获取导师的所属中心
这里就是爬虫的入口链接-获取导师的所属中心
在这里获取导师的姓名
在这里获取导师的姓名
在这里获取导师的联系方式
在这里获取导师的联系方式

运行结果

在pycharm上的输出结果
在这里插入图片描述
输出为excel表格
在这里插入图片描述

PS:
1、第一次写博文,不喜勿喷,有啥建议直接提,共同进步
2、参考的博文链接在代码中,这里就不放了
3、插入的图片做了遮盖,虽然这些信息在官网上都能直接看,但我有点怕,还是做个遮盖(如果不做遮盖会不会有什么不好的影响呀?)

这篇关于爬虫系列(1):爬取北邮网研院导师的联系方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/788882

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式