通过selenium八爪鱼爬取研招网各专业的初试信息

任务需求:
因工作需要,需要爬取研招网各个高校每个专业研究生考试的初试科目信息。
处理步骤:
1,查看研招网页面(https://yz.chsi.com.cn/zsml/zyfx_search.jsp),发现需要根据省市,学科类别等选项进入下一界面在这里插入图片描述

新进入分校界面后可以点击学校进入具体学校信息的网页在这里插入图片描述

进入学校界面,点击考试范围处的查看进入具体的专业信息界面
在这里插入图片描述
在这里有具体需要爬取的信息(已用红框标出)在这里插入图片描述
2,研究清研招网的页面点击逻辑后,决定使用selenium模拟登陆进行爬取,而且为简化程序步骤,先获取所有高校的名称直接进入各个高校界面循环进行数据爬取。具体代码如下所示

import csv
import re
from pyquery import PyQuery as pq
import xlwt
import time
import requests
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import urllib.parse
from urllib.parse import quote
import numpy as np
import xlrd


#从处理好的excel文件中获取所需高校的名称
def getschoolname():
    data = xlrd.open_workbook("F:/桌面吕鑫/06其他工作/爬虫院校数据库/教育部直属高校.xlsx")  # Excel文件地址
    table = data.sheets()[0]  # 通过索引顺序获取table,Sheet1索引为0
    rowsNum = table.nrows
    return(table)
#构造高校界面的url
def gouyaourl(schoolname):
    schoolname1 = urllib.parse.quote(schoolname)
    url = 'https://yz.chsi.com.cn/zsml/querySchAction.do?ssdm=&dwmc=' + schoolname1 + '&mldm=&mlmc=&yjxkdm=&xxfs=&zymc='
    return(url)

#获取专业界面的信息
def search_onepage():
    num1 = browser.find_elements_by_xpath('/html/body/div[2]/div[3]/div/div[2]/table/tbody/tr')
    data = [([0] * 5) for i in range(len(num1))]
    print(type(data))
    for i in range(1, len(num1) + 1):  # range(1,num1+1)

        kaoshifangshi = browser.find_element_by_xpath(
            '/html/body/div[2]/div[3]/div/div[2]/table/tbody/tr[%d]/td[1]' % i).text
        yuanxi = browser.find_element_by_xpath('/html/body/div[2]/div[3]/div/div[2]/table/tbody/tr[%d]/td[2]' % i).text
        zhuanye = browser.find_element_by_xpath(
            '/html/body/div[2]/div[3]/div/div[2]/table/tbody/tr[%d]/td[3]' % i).text
        yanjiufangxiang = browser.find_element_by_xpath(
            '/html/body/div[2]/div[3]/div/div[2]/table/tbody/tr[%d]/td[4]' % i).text
        xuexifangshi = browser.find_element_by_xpath(
            '/html/body/div[2]/div[3]/div/div[2]/table/tbody/tr[%d]/td[5]' % i).text
        data[i-1][0]=kaoshifangshi
        data[i-1][1] = yuanxi
        data[i-1][2] = zhuanye
        data[i-1][3] = yanjiufangxiang
        data[i-1][4] = xuexifangshi

    data=np.array(data)
    return(data)

#因不同高校包含页码数不同,在这里设置两种变换页码的方式
def change_page1(k):
    print('k',k)
    k=k+1
   browser.find_element_by_xpath('/html/body/div[2]/div[3]/div/div[4]/ul/li[%d]/a'%k).click()

def change_page2(k):
    sousuo = browser.find_element_by_xpath('//*[@id="goPageNo"]').send_keys(k)
    browser.find_element_by_xpath('//li/input[2]').click()


def school_search(schoolname,num):
    url=gouyaourl(schoolname)
    print(url)
    f = xlwt.Workbook()
    sheet1 = f.add_sheet(u'院校数据', cell_overwrite_ok=True)
    rowTitle = [u'学校名称', u'考试方式', u'院系', u'专业', u'研究方向', u'学习方式', u'拟招生', u'政治1', \
                u'外语1', u'专业课一1', u'专业课二1', u'政治2', u'外语2', u'专业课一2', u'专业课二2', u'政治3', u'外语3', \
                u'专业课一3', u'专业课二3', u'政治4', u'外语4', u'专业课一4', u'专业课二4', u'政治5', u'外语5', u'专业课一5', \
                u'专业课二5', u'政治6', u'外语6', u'专业课一6', u'专业课二6']
    for i in range(len(rowTitle)-1):
        sheet1.write(0,i,rowTitle[i])
    rows=1

    browser.get(url)
    page_index = browser.find_elements_by_xpath('/html/body/div[2]/div[3]/div/div[4]/ul/li')
    b = len(page_index) - 2
    print("b:",b)
    data=[]
    if b<7:
        for i in range(1,b+1):
            change_page1(i)
            data=search_onepage()
            for j in range(data.shape[0]):
                sheet1.write(rows, 0, schoolname)
                sheet1.write(rows,1,data[j,0])
                sheet1.write(rows, 2, data[j, 1])
                sheet1.write(rows, 3, data[j, 2])
                sheet1.write(rows, 4, data[j, 3])
                sheet1.write(rows, 5, data[j, 4])
                rows += 1

    else:
        page = browser.find_element_by_xpath('/html/body/div[2]/div[3]/div/div[4]/ul/li[8]/a').text  # [@class="lip"]
        print("page:",page)
        for i in range(1,int(page)+1):
            change_page2(i)
            data=search_onepage()

            for j in range(data.shape[0]):
                sheet1.write(rows, 0, schoolname)
                sheet1.write(rows,1,data[j,0])
                sheet1.write(rows, 2, data[j, 1])
                sheet1.write(rows, 3, data[j, 2])
                sheet1.write(rows, 4, data[j, 3])
                sheet1.write(rows, 5, data[j, 4])
                rows += 1


            #savedata()
    f.save('F:/桌面吕鑫/06其他工作/爬虫院校数据库/高校研招网/' +str(num)+ schoolname + '.xls')


    page = browser.find_element_by_xpath('/html/body/div[2]/div[3]/div/div[4]/ul/li[8]/a').text

def main():
    schooltable = getschoolname()
    errorschool=[]
    for l in range(200,schooltable.nrows+1):#schoolname.nrows-1
        try:
            schoolname = schooltable.row_values(l)[0]
            schooltable = getschoolname()
            school_search(schoolname,l)
        except:
            errorschool.extend([schoolname,l])
            continue


if __name__=='__main__':
    browser = webdriver.PhantomJS()
    main()

3使用selenium初步完成信息的爬取,但是数月后再进行数据更新时发现,研招网将学科类别改为了必填项,原有程序无法使用。此时有两种改进方式1在原有程序基础上多加一个所有学科类别的循环。2使用其他方式。 方法1在尝试数次后发现极为繁琐,就改用现成的八爪鱼软件来进行数据爬取。
具体爬取的流程图见下方,其otd文件见附件。

在这里插入图片描述

发布了23 篇原创文章 · 获赞 6 · 访问量 4673

猜你喜欢

转载自blog.csdn.net/qq_34211618/article/details/103948830
今日推荐