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

来源:互联网 发布:软件汉化 编辑:程序博客网 时间:2024/06/09 21:16
抓取浏览器的界面是用PhantomJS,

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

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

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



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

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

from selenium import webdriverfrom lxml import etreeimport xlrdimport reimport xlwtfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support.ui import Selectfrom xlutils.copy import copyclass 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()