是一个基于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()