使用Python爬取山东大学机械工程学院官网所有导师完整信息

使用Python爬取山东大学机械工程学院官网所有导师完整信息

  • 1、准备工作
    • 1.1材料准备
    • 1.2网页准备
  • 2、页面分析
    • 2.1所有导师页面分析
    • 2.2某一导师页面分析
  • 3、代码编写

1、准备工作

1.1材料准备

(1)装有Xpath插件的Chrom浏览器
(2)Python3.7.3
(3)urllib.request模块,lxml模块
(4)Pycharm

1.2网页准备

山东大学机械工程学院所有导师页面:https://www.mech.sdu.edu.cn/szdw/xssz.htm
山东大学机械工程学院某一导师页面(黄传真院长界面):
https://www.mech.sdu.edu.cn/info/1126/121093.htm

2、页面分析

2.1所有导师页面分析

打开https://www.mech.sdu.edu.cn/szdw/xssz.htm,检查网页的构成,如图1所示。
图1
使用Python爬取山东大学机械工程学院官网所有导师完整信息_第1张图片

发现所有导师的姓名以及对应的链接全部在每个li标签下的a标签中:
黄传真
所以,只要循着这个标签向上寻找,就能定位这个a标签。
打开Xpath进行标签定位(Ctrl + Shift + x),//div[@id="teacher_main"]/div/ul/li/a/text(),如愿找到了我们需要的导师信息,如图2所示。
图2
使用Python爬取山东大学机械工程学院官网所有导师完整信息_第2张图片
另外,我们还需要通过Xpath获得每个导师对应的a标签链接,只需要把text()改成@href就可以了,因为文本和链接是是在同一个a标签内//div[@id="teacher_main"]/div/ul/li/a/@href,同样也获得了相应的链接如图3所示,这里获得的地址并不是完整的地址,后期拼合完整就行了。
图3
使用Python爬取山东大学机械工程学院官网所有导师完整信息_第3张图片

2.2某一导师页面分析

与2.1小节相同的套路,打开网址检查网页的构成,我们需要的所有内容都在name = _newscontent_fromname的这个form标签中,如图4所示。此外,我们需要的信息都在form标签下的一个table标签中,以及若干个p标签中。
图4
使用Python爬取山东大学机械工程学院官网所有导师完整信息_第4张图片
同样的,打开Xpath,获取我们需要的信息:
获取table的信息 //table//tbody//tr[position()<4]//td/text()
获取图片的地址 //table//tbody//img/@src
后文p标签内容 //div[@class="v_news_content"]/p/text()
后文p标签内容标题 //div[@class="v_news_content"]/p/strong

3、代码编写

代码实现的步骤:首先获取所有导师的姓名和地址,其次分别爬取每个导师的信息,分别为每个导师建立文件夹,保存文字信息和图片。某些导师没有上传照片,应避免报错。
以下是完整的代码:

import urllib.request
import os
from lxml import etree


def detailCrawer(url, topath, name):
	#请求头
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1"
    }
    req = urllib.request.Request(url, headers=headers)
    response = urllib.request.urlopen(req)
    HtmlStr = response.read().decode("utf-8")
    selector = etree.HTML(HtmlStr)
    #获取文本
    content_word = selector.xpath('//table//tbody//tr[position()<4]//td//text()|//div[@class="v_news_content"]/p//text()')
    personDect = os.path.join(topath, name)
    #建立文件夹
    os.mkdir(personDect)
    #合成.txt文件路径
    txt_path = os.path.join(personDect, name+'.txt')
    #保存文字信息
    for i in content_word:
        f = open(txt_path, 'a',encoding='utf-8')
        f.write('\n' + str(i))
        f.close()
    try:
    #保存导师图片
        content_img = selector.xpath('//table//tbody//img/@src')
        img_path = os.path.join(personDect, name+'.jpg')
        urllib.request.urlretrieve("https://www.mech.sdu.edu.cn" + content_img[0], filename=img_path)
    except:
        print("内容完整,图片错误")
def personCrawer(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1"
    }
    req = urllib.request.Request(url, headers=headers)
    response = urllib.request.urlopen(req)
    HtmlStr = response.read().decode("utf-8")
    selector = etree.HTML(HtmlStr)
    #获取导师名字
    name = selector.xpath('//div[@id="teacher_main"]/div/ul/li/a/text()')
    #获取导师主页链接
    personurl = selector.xpath('//div[@id="teacher_main"]/div/ul/li/a/@href')
    #字典保存导师名字和链接
    content = {}
    for i, item in enumerate(name):
        content[item]=r"https://www.mech.sdu.edu.cn"+personurl[i].split("..", 1)[-1]
    return content
#保存位置
topath = r"D:\爬取机械学院导师信息\person"
url = r"https://www.mech.sdu.edu.cn/szdw/xssz.htm"
personDic = personCrawer(url)
for key in personDic:
    try:
        detailCrawer(personDic[key], topath, key)
        print(key + ':' + personDic[key],'已完成')
    except:
        print(key + ':' + personDic[key],'发生错误')

你可能感兴趣的:(11)