用python爬取中南大学所有教师个人主页的个人简介

用python爬取中南大学所有教师个人主页的个人简介

  • 基于Anaconda的spyder运行
  • 前言
  • 使用说明:
  • 直接来代码:
  • 运行截图及结果:

基于Anaconda的spyder运行

前言

大三了,自己在搜索CSU老师的研究方向时,每次都需要用鼠标去访问各个网页。随萌发起用刚学皮毛的python,来试一试的想法。最开始仅支持单个院,现在支持自动化下载所有院的教师个人简介信息至txt中,爬取过程大约5min。
起初我用的时Chrome模拟器,支持模拟鼠标登录,后来节省时间,干脆去了。只有Requests库。不过以前注释过的代码我也放进去了。
当然,还得感谢该网站的反爬机制近乎为零,这些代码只需穿上皇帝的新装直接前往各个节点下载所需内容。
所用信息均为网络公开,仅做了信息的整理合并内容。如有侵权,立删。

使用说明:

对于下载所有院,直接下载即可。当然不排除网页更新,需要重新改动
对于下载单个院:只需更改下面代码中的main()函数这for循环i的值。i与学院对应关系如下:
用python爬取中南大学所有教师个人主页的个人简介_第1张图片

直接来代码:

# -*- coding: utf-8 -*-
"""
Created on Fri Aug 30 20:26:47 2019

@author: yiqing
"""

import re#python正则分割
from  bs4 import BeautifulSoup#网页美味汤
#from selenium import webdriver#模拟点击鼠标点击网页库
#import time#时间
import  requests#直接爬取网页库
'''
#--------------------------------------搜索中南大学教师主网页
def search_school(url,chromedrive):
    browser= webdriver.Chrome(chromedrive)
    browser.get(url)
    #开始定位至学院列表 休息15s
    browser.find_element_by_link_text("学院列表").click()
    time.sleep(5)
    return browser

#--------------------------------------由二级学院开始进行网上搜索
def search_2school(school,browser):
    browser.find_element_by_link_text(school).click()#开始定位至地信院 休息15s
    time.sleep(15)
    #承接内容 使用pytho"n正则表达式 将老师的网址找到并存至gg中
    html = browser.page_source
    rule="http://faculty.csu.edu.cn/.*/zh_CN/index.htm"
    gg=re.findall(rule,html)
    return gg
'''
#--------------------------------------由二级学院开始进行网上搜索
def direct(secname):
    r=requests.get(secname)
    html=r.text
    rule="http://faculty.csu.edu.cn/.*/zh_CN/index.htm"
    gg=re.findall(rule,html)
    return gg
#--------------------------------------将个人主页内容爬出来
def div(gg_i):
    str="  该老师爬不了!!!  点击网页链接访问"
    r=requests.get(gg_i)
    soup=BeautifulSoup(r.text,"lxml")
    div=soup.find("div",attrs={"class":"TabbedPanelsContent"})   
    if div==None:
        div=soup.find("div", class_="jiancc")
    if div==None:
        div=soup.find("div",attrs={"class":"con_bload"})
    if div==None:
        div=soup.find("div",attrs={"class":"teacher_mid_midL_bot fl"})
    if div==None:
        return str
    else:
        return div.text
#--------------------------------------写入指定文件 filename为路径 gg为存储的网址
def write(filename,gg):
    f= open(filename,'w',encoding='utf-8')
    for i in range(len(gg)):
        f.write("\r\n")
        taglink="第"+str(i+1)+"个老师的网页位置:"+gg[i]
        f.write(taglink)
        f.write(div(gg[i]))
        f.write("\r\n")
        print(i+1)  
#--------------------------------------替换str中的[]符号
def replacePunctuations(line):
    for ch in line:
        if ch in "~@#$%^&*_-+=<>?/,.:;{}[]|\'""":
            line = line.replace(ch, "")
    return line
#--------------------------------------获取学院名字
def txt_name(number):
    all_colleage="http://faculty.csu.edu.cn/xueyuan.jsp?urltype=tree.TreeTempUrl&wbtreeid=1014"
    r1=requests.get(all_colleage)
    rule1="urltype=tsites.CollegeTeacherList&wbtreeid=1014&tscollegeid=10"+number+"\">(.*)"
    colleage_name=re.findall(rule1,r1.text)
    return colleage_name
#--------------------------------------main()
def main():
    #chromedrive = 'D:\Program Files (x86)\Google\Chrome\Application\chromedriver'
    #browser=search_school(url,chromedrive)
    secname_1="http://faculty.csu.edu.cn/xyjslist.jsp?urltype=tsites.CollegeTeacherList&wbtreeid=1014&tscollegeid=10"
    for i in range(34):#*************************这里************每个i对应一个院 循环下载每个院
        if i<9:
            number="0"+str(i+1)
        else:
            number=str(i+1)
        secnameurl=secname_1+number#储存各个学院的网址
        #gg=search_2school(secname,browser)
        gg=direct(secnameurl)#直接访问 网页内容储存至gg中
        print(replacePunctuations(str(txt_name(number))))#打印正在记录的文件
        filename="D:\\"+replacePunctuations(str(txt_name(number)))+'.txt'
        print(filename)
        write(filename,gg)#写文件 
main()

运行截图及结果:

用python爬取中南大学所有教师个人主页的个人简介_第2张图片
用python爬取中南大学所有教师个人主页的个人简介_第3张图片
用python爬取中南大学所有教师个人主页的个人简介_第4张图片

你可能感兴趣的:(#,python爬虫)