python 网络上抓取数据处理并存入到Excel'中

抓取浏览器的界面是用 PhantomJS,

是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器要高效。

如果我们把 Selenium 和 PhantomJS 结合在一起,就可以运行一个非常强大的网络爬虫了,这个爬虫可以处理 JavaScrip、Cookie、headers,以及任何我们真实用户需要做的事情。

所以说只要是用户能用浏览器登陆的界面或者干的事情,用PhantomJS都能做,因为他就是一个浏览器,但是没有界面而已



想要实现的功能是通过上校园网的教务处查看成绩那,把所需要的成绩和所对应的科目读取出来,如果有挂科的话把记录最高的成绩,计入到对应的excel表中。

难点:因为excel表上的科目和网上读取下来的顺序不一样,而且还得将excel表中科目中的数据加以处理,所以就得将网上爬取下来的数据存入到字典中去,这样通过excel表中的科目的值来进行查找,

from selenium import webdriver
from lxml import etree
import xlrd
import re
import xlwt
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from xlutils.copy import copy


class insert_excel(object):
    def __init__(self, xuehao, mima, row,url):
        self.xuehao = xuehao
        self.mima = mima
        self.row = row
        self.chengji = []
        self.new_colnames = []
        self.num = 0
        self.url=url

    def start(self):
        self.load_page()

    def load_page(self):
        driver = webdriver.PhantomJS()  # 获得一个浏览器
        driver.get(self.url)  # 进行加载页面

        driver.find_element_by_name("USERNAME").send_keys(self.xuehao)
        driver.find_element_by_id("pwd").send_keys(self.mima)  # 登陆界面

        driver.find_element_by_id("btnSubmit").click()
        driver.find_element_by_class_name("block10").click()
        sel = Select(driver.find_element_by_id("xsfs"))
        sel.select_by_value("max")  # 选择最好的成绩

        driver.find_element_by_id("btn_query").click()
        html = driver.page_source  # 获得源码
        self.handle_data(html)

    def handle_data(self, html):
        content = etree.HTML(html)  # 将其转为html格式
        link_list = content.xpath('//table/tbody/tr/td[6]/a/text()')  # xpath解析,解析出所有的成绩

        kemu_list = content.xpath('//table/tbody/tr/td[4]/text()')  # xpath解析,解析出所有的科目列表
        for i in range(0, len(link_list)):  # 成绩转换
            if link_list[i] == "优":
                link_list[i] = "90"
            if link_list[i] == "良":
                link_list[i] = "80"
            if link_list[i] == "中":
                link_list[i] = "70"
            if link_list[i] == "及格":
                link_list[i] = "60"
            if link_list[i] == "不及格":
                link_list[i] = "59"
        for i in range(0, len(kemu_list)):  # 将科目列表中和excel中不匹配的格式,换为一样的
            kemu_list[i] = re.sub('I', 'Ⅰ', kemu_list[i])  # re正则表达式替换
        chengji_zidian = dict(zip(kemu_list, link_list))  # 将科目和成绩转成字典类型
        self.handle_ecxel(chengji_zidian)

    def handle_ecxel(self, chengji_zidian):
        data = xlrd.open_workbook("1.xls")  # 打开excel表
        table = data.sheets()[0]  # 为第一个sheet
        nrows = table.nrows  # 行数
        ncols = table.ncols  # 列数
        colnames = table.row_values(4)  # 将第四行的科目取出来装入列表中
        liebiao = list(range(0, len(colnames)))  # 生成一个列表,因为填入数据是按坐标来填的,有的列数不用填数据,所以将要填写的数据列记录下来
        for x in range(0, len(colnames)):  # 把一些不需要记录数据的列从colnames中去掉
            if colnames[x] == '':
                liebiao.remove(x)
            elif colnames[x] == '第一学期':
                liebiao.remove(x)
            elif colnames[x] == '第二学期':
                liebiao.remove(x)
            else:
                self.new_colnames.append(colnames[x])
        for i in range(0, len(self.new_colnames)):  # 将colnames中的数据进行处理,处理成和网页中截取的数据相同
            self.new_colnames[i] = re.sub('\n', '', self.new_colnames[i])
            self.new_colnames[i] = re.sub('I', 'Ⅰ', self.new_colnames[i])
            self.new_colnames[i] = re.sub(' ', '', self.new_colnames[i])
        self.data2ecxel(chengji_zidian, data, liebiao)

    def data2ecxel(self, chengji_zidian, data, liebiao):
        for i in range(0, len(self.new_colnames)):  # 生成成绩列表,如果查询不到即为没选,所以记为0

            try:
                self.chengji.append(chengji_zidian[self.new_colnames[i]])
            except:
                self.chengji.append("0")

        w_file = copy(data)  # 复制一个新的excel表
        sheet_write = w_file.get_sheet(0)
        for i in range(0, len(self.chengji)):  # 循环的在新的表中插入数据,
            sheet_write.write(row, liebiao[i], self.chengji[i])
        w_file.save("d:3.xls")  # 保存数据

        print("插入完成")


if __name__ == '__main__':
    xuehao = input("请输入学号:")
    row = int(xuehao[8:])
    mima = input("请输入密码:")
    url="http://jwgl.sie.edu.cn/jsxsd/"
    my_insert = insert_excel(xuehao, mima, row.url)
    my_insert.start()


你可能感兴趣的:(python)