分析网站
网站url:https://www.studyinaustralia.gov.au/SIASearch/SIASearchResults.aspx?moduleId=13&mode=1&Keyword=Adelaide+University
首先根据网址,网站页面采用asp语言编写的。
其次查看想要抓取得数据是深层次的三级结构。想要抓到最终的数据,那么就要依次获取第二层数据,第一层数据。
其次再看页面跳转,当选择第二页,第三页时。网页的请求链接是不变的,则不能用直接通过链接来抓取数据的方法了,只能模拟网站请求,或者模拟网站点击()。
使用chrome 浏览器 ,进行网络请求时,header中 包含 formdata数据。本质上,只要使用sumbit提交数据时,携带必要的formdata数据就可以了。
查看网站的源代码,发现每一页的link只是 eventTarget, eventArgument 。分析发现,eventTarget 是固定的函数。eventArgument 是页码,
以上理清之后,就可以开始考虑抓包进度了。
2
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
采用的是asp的form表单
首页:
二级页面:
三级页面:
分析抓取内容
网页抓取的是不规则的表单数据,则考虑使用json保存数据格式。
如果是规则的表单数据则可以考虑使用 csv保存数据格式。
"Detailed Field:": "060119 - General Practice",
"Course Level:": "GC - Graduate Certificate",
"Work Component Weeks:": null,
"Course Sector:": "Higher Education",
"title": "Graduate Certificate in Counselling and Psychotherapy",
"CRICOS Course Code:": "072306G",
"Work Component:": "No",
"Estimated Total Course Cost:": "$17,000",
"Work Component Hours/Week:": null,
"Dual Qualification:": "No",
"Duration (Weeks):": "26",
"Narrow Field:": "0601 - Medical Studies",
"VET National Code:": null,
"Work Component Total Hours:": null,
"Broad Field:": "06 - Health",
"Foundation Studies:": "No",
"Course Language:": "English"
梳理逻辑
分析抓取的页面逻辑路径,想要获取结果页的数据。那么必须有一二级页面的链接,才行。
结果实现
step1:获取搜索页面第一页,进入二级页面的所有链接
step2:获取二级页面进入三级页面的所有链接
step3:三级详情页面的数据抓取
step4:根据层次结构写入到字典中
step5:循环算法,依次获取第二页的数据。第三页的数据,以及所有的数据。
效果展示
源代码:
# _*_ coding:utf-8 _*_
import re
from bs4 import BeautifulSoup
import requests
import codecs
import json
import urllib
from scrapy.http import FormRequest
import mechanize
url = "https://www.studyinaustralia.gov.au/SIASearch/SIASearchResults.aspx?moduleId=13&mode=1&Keyword=Adelaide+University"
r = requests.get(url)
root_url = "https://www.studyinaustralia.gov.au"
data = ""
# dict2 = {}
headers = ''
session = requests.Session()
br = mechanize.Browser()
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
response = br.open(url)
dict0 = {}
# 页码
for i in range(0,21):
html = response.read()
# print "Page %d :" % i, html
# br.select_form("aspnetForm")
br.form = list(br.forms())[0]
# br.select_form(nr=0)
# print br.form
br.set_all_readonly(False)
s = BeautifulSoup(html,"html5lib")
for control in br.form.controls:
if control.type == "submit":
control.disabled = True
# print('==========')
tdata = s.find("table", {"class": "SIASearchResults"})
br["__EVENTTARGET"] ='ctl00$ctl00$ctl00$nestedAreaTwo$ContentPlaceHolderMainNoAjax$ContentPlaceHolderMainNoAjax$SIACourseSearchResults$CoursesSearchResults'
if i == 0:
pass
# response2 = requests.get(url)
# s = BeautifulSoup(response2.content,"html5lib")
else:
br["__EVENTARGUMENT"] = 'Page$'+str(i+1)
response2 = br.submit()
# if response2.status_code == response2.codes.ok:
# print("======")
s = BeautifulSoup(response2.read(),"html5lib")
tdata = s.find("table", {"class": "SIASearchResults"})
firstLinkdata_array = tdata.findAll("td",{"class":"SIASeachColumn1"})
dict1 = {}
for index1,firstLinkdata in enumerate(firstLinkdata_array):
data_a = firstLinkdata.find("a",href=True)
WebHref = data_a["href"] # step1 OK Get first href end
# step2 Get second href begin
secondR = requests.get(root_url + WebHref)
if secondR.status_code == requests.codes.ok:
second_s = BeautifulSoup(secondR.content,"html5lib")
second_tdata = second_s.find("table", {"class": "SIAResultsList"})
secondLinkdata_array = second_tdata.findAll("td",{"class":"SIAResultsColumn9"})
for index2,secondLinkdata in enumerate(secondLinkdata_array):
dict2 = {}
second_data_a = secondLinkdata.find("a",href=True)
second_WebHref = second_data_a["href"] # step2 OK Get second href end
# step3 Get Third want to attribute begin
thirdR = requests.get(root_url +'/SIASearch/'+ second_WebHref)
if thirdR.status_code == requests.codes.ok:
thirdR_s = BeautifulSoup(thirdR.content,"html5lib")
thirdR_tdata = thirdR_s.find("div", {"id": "MainDetails"})
thirdR_detaildiv_lable_array = thirdR_tdata.findAll("label")
thirdR_detaildiv_div_array = thirdR_s.findAll("div", {"class": "details"})
title = thirdR_s.find("span", {"id": "ctl00_ctl00_ctl00_nestedAreaTwo_ContentPlaceHolderMainNoAjax_ContentPlaceHolderMainNoAjax_lblTitle"})
# 将数据写入字典中去
dict3 = {}
dict3.setdefault('title',title.string)
for index3,thirdR_detaildiv_lable in enumerate(thirdR_detaildiv_lable_array):
# list1.insert(thirdR_detaildiv_lable.string)
# 数据追加到字典中去
dict3.setdefault(thirdR_detaildiv_lable.string,thirdR_detaildiv_div_array[index3].string)
# print(thirdR_detaildiv_div_array[index].string)
#因为可能json有unicode编码,最好用codecs保存utf-8文件
#把字典转成json字符串
print(index1)
dict2.setdefault(index2,dict3)
# with codecs.open("studyinaustralia"+".json", 'a+', 'utf-8') as f:
# f.write(json.dumps(dict2))
dict1.setdefault(index1,dict2)
json_text = json.dumps(dict1)
with codecs.open("studyinaustralia"+ str(i+1) +".json", 'a+', 'utf-8') as f:
f.write(json_text)
# with codecs.open('123.html', 'a+') as f:
# f.write(response2.read())
代码优化,及bug修复。
修复了,数据读取不全的问题
py代码函数化,方便理解
# _*_ coding:utf-8 _*_
import re
from bs4 import BeautifulSoup
import requests
import codecs
import json
import urllib
from scrapy.http import FormRequest
import mechanize
url = "https://www.studyinaustralia.gov.au/SIASearch/SIASearchResults.aspx?moduleId=13&mode=1&Keyword=Adelaide+University"
r = requests.get(url)
root_url = "https://www.studyinaustralia.gov.au"
__EVENTTARGET = "ctl00$ctl00$ctl00$nestedAreaTwo$ContentPlaceHolderMainNoAjax$ContentPlaceHolderMainNoAjax$SIACourseSearchResults$CoursesSearchResults"
__Page = 0 # 从第几页开始抓取数据
__MaxPage = 21 # 最大页码数
# 第三级页面的数据抓取
def thirdDict(second_WebHref):
# step3 Get Third want to attribute begin
thirdR = requests.get(root_url +'/SIASearch/'+ second_WebHref)
if thirdR.status_code == requests.codes.ok:
thirdR_s = BeautifulSoup(thirdR.content,"html5lib")
thirdR_tdata = thirdR_s.find("div", {"id": "MainDetails"})
thirdR_detaildiv_lable_array = thirdR_tdata.findAll("label")
thirdR_detaildiv_div_array = thirdR_s.findAll("div", {"class": "details"})
title = thirdR_s.find("span", {"id": "ctl00_ctl00_ctl00_nestedAreaTwo_ContentPlaceHolderMainNoAjax_ContentPlaceHolderMainNoAjax_lblTitle"})
# 将数据写入字典中去
dict3 = {}
dict3.setdefault('title',title.string)
for index3,thirdR_detaildiv_lable in enumerate(thirdR_detaildiv_lable_array):
# list1.insert(thirdR_detaildiv_lable.string)
# 数据追加到字典中去
dict3.setdefault(thirdR_detaildiv_lable.string,thirdR_detaildiv_div_array[index3].string)
# print(thirdR_detaildiv_div_array[index].string)
#因为可能json有unicode编码,最好用codecs保存utf-8文件
#把字典转成json字符串
return dict3
#第二级页面的数据抓取
def secondDict(WebHref):
# step2 Get second href begin
secondR = requests.get(root_url + WebHref)
if secondR.status_code == requests.codes.ok:
second_s = BeautifulSoup(secondR.content,"html5lib")
second_tdata = second_s.find("table", {"class": "SIAResultsList"})
secondLinkdata_array = second_tdata.findAll("td",{"class":"SIAResultsColumn9"})
dict2 = {}
for index2,secondLinkdata in enumerate(secondLinkdata_array):
second_data_a = secondLinkdata.find("a",href=True)
second_WebHref = second_data_a["href"] # step2 OK Get second href end
dict3 = thirdDict(second_WebHref)
dict2.setdefault(index2,dict3)
return dict2
# 首级页面的数据抓取
def firstDict(s):
tdata = s.find("table", {"class": "SIASearchResults"})
firstLinkdata_array = tdata.findAll("td",{"class":"SIASeachColumn1"})
dict1 = {}
for index1,firstLinkdata in enumerate(firstLinkdata_array):
data_a = firstLinkdata.find("a",href=True)
WebHref = data_a["href"] # step1 OK Get first href end
dict2 = secondDict(WebHref)
dict1.setdefault(index1,dict2)
print(index1)
return dict1
# 模拟浏览器的form表单请求
# 获取页面的链接源代码数据
def main():
# session = requests.Session()
br = mechanize.Browser()
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
response = br.open(url)
dict0 = {}
for i in range(__Page,__MaxPage):
html = response.read()
# print "Page %d :" % i, html
# br.select_form("aspnetForm")
br.form = list(br.forms())[0]
# br.select_form(nr=0)
# print br.form
br.set_all_readonly(False)
s = BeautifulSoup(html,"html5lib")
for control in br.form.controls:
if control.type == "submit":
control.disabled = True
# print('==========')
br["__EVENTTARGET"] = __EVENTTARGET
if i == 0:
pass
else:
br["__EVENTARGUMENT"] = 'Page$'+str(i+1)
response2 = br.submit()
s = BeautifulSoup(response2.read(),"html5lib")
dict1 = firstDict(s)
json_text = json.dumps(dict1)
with codecs.open("studyinaustralia"+ str(i+1) +".json", 'a+', 'utf-8') as f:
f.write(json_text)
# print(dict1)
if __name__ == '__main__':
main()
代码优化,及bug修复。
修复了,当网络秦秋失败后,可以直接读取任意页面,而不用重第一页开始。
# _*_ coding:utf-8 _*_
import re
from bs4 import BeautifulSoup
import requests
import codecs
import json
import urllib
from scrapy.http import FormRequest
import mechanize
url = "https://www.studyinaustralia.gov.au/SIASearch/SIASearchResults.aspx?moduleId=13&mode=1&Keyword=University"
r = requests.get(url)
root_url = "https://www.studyinaustralia.gov.au"
__EVENTTARGET = "ctl00$ctl00$ctl00$nestedAreaTwo$ContentPlaceHolderMainNoAjax$ContentPlaceHolderMainNoAjax$SIACourseSearchResults$CoursesSearchResults"
__Page = 36 # 从第几页开始抓取数据
__MaxPage = 110 # 最大页码数
local_jump_index = 11
Go_On = False # 是否继续重新从最开始请求数据
br = mechanize.Browser()
# 第三级页面的数据抓取
def thirdDict(second_WebHref):
# print(second_WebHref)
# step3 Get Third want to attribute begin
thirdR = requests.get(root_url +'/SIASearch/'+ second_WebHref)
if thirdR.status_code == requests.codes.ok:
thirdR_s = BeautifulSoup(thirdR.content,"html5lib")
thirdR_tdata = thirdR_s.find("div", {"id": "MainDetails"})
thirdR_detaildiv_lable_array = thirdR_tdata.findAll("label")
thirdR_detaildiv_div_array = thirdR_s.findAll("div", {"class": "details"})
title = thirdR_s.find("span", {"id": "ctl00_ctl00_ctl00_nestedAreaTwo_ContentPlaceHolderMainNoAjax_ContentPlaceHolderMainNoAjax_lblTitle"})
# 将数据写入字典中去
dict3 = {}
dict3.setdefault('title',title.string)
for index3,thirdR_detaildiv_lable in enumerate(thirdR_detaildiv_lable_array):
# list1.insert(thirdR_detaildiv_lable.string)
# 数据追加到字典中去
dict3.setdefault(thirdR_detaildiv_lable.string,thirdR_detaildiv_div_array[index3].string)
# print(thirdR_detaildiv_div_array[index].string)
#因为可能json有unicode编码,最好用codecs保存utf-8文件
#把字典转成json字符串
# print(dict3)
return dict3
#第二级页面的数据抓取
def secondDict(WebHref):
# step2 Get second href begin
secondR = requests.get(root_url + WebHref)
if secondR.status_code == requests.codes.ok:
second_s = BeautifulSoup(secondR.content,"html5lib")
second_tdata = second_s.find("table", {"class": "SIAResultsList"})
secondLinkdata_array = second_tdata.findAll("td",{"class":"SIAResultsColumn9"})
dict2 = {}
for index2,secondLinkdata in enumerate(secondLinkdata_array):
print("second link"+ str(index2))
second_data_a = secondLinkdata.find("a",href=True)
second_WebHref = second_data_a["href"] # step2 OK Get second href end
dict3 = thirdDict(second_WebHref)
dict2.setdefault(index2,dict3)
return dict2
# 首级页面的数据抓取
def firstDict(s):
tdata = s.find("table", {"class": "SIASearchResults"})
firstLinkdata_array = tdata.findAll("td",{"class":"SIASeachColumn1"})
dict1 = {}
for index1,firstLinkdata in enumerate(firstLinkdata_array):
print("first link")
data_a = firstLinkdata.find("a",href=True)
WebHref = data_a["href"] # step1 OK Get first href end
dict2 = secondDict(WebHref)
dict1.setdefault(index1,dict2)
return dict1
'''
# 模拟浏览器的form表单请求
# 递归函数 ,依次请求第11页数据,第21页数据,第31页数据。从而快速的跳转到指定的页面。
# 解决问题:由于该网站,不能直接请求大于10的页面,需要依次页面,才能请求数据。
# 出现情况:页面请求中断,或者网络问题抓取中断的,快速跳转到抓取页面的办法。
'''
def JumpPage(Page):
global local_jump_index
global br
br.form = list(br.forms())[0]
br.set_all_readonly(False)
br["__EVENTTARGET"] = __EVENTTARGET
for control in br.form.controls:
if control.type == "submit":
control.disabled = True
br["__EVENTARGUMENT"] = 'Page$'+ str(local_jump_index)
response2 = br.submit()
local_jump_index += 10
if local_jump_index <= Page:
print(local_jump_index)
JumpPage(Page)
# print '\n'.join(['%s:%s' % item for item in response2.__dict__.items()])
print(br)
global Go_On
Go_On = True
return br
# 获取页面的链接源代码数据
def main():
# session = requests.Session()
# br = mechanize.Browser()
global br
global Go_On
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
response = br.open(url)
html = response.read()
s = BeautifulSoup(html,"html5lib")
for i in range(__Page,__MaxPage):
dict0 = {}
if i == 0:
# html = response.read()
# br.form = list(br.forms())[0]
# br.set_all_readonly(False)
# s = BeautifulSoup(html,"html5lib")
pass
else:
if Go_On == False and __Page > 10:
JumpPage(__Page)
# br.form = list(br.forms())[0]
# br.set_all_readonly(False)
# br["__EVENTARGUMENT"] = 'Page$'+ str(12)
# response2 = br.submit()
# br.form = list(br.forms())[0]
# br.set_all_readonly(False)
# br["__EVENTARGUMENT"] = 'Page$'+ str(22)
# response2 = br.submit()
# br = Backbr
Go_On = True
print("page:" + str(i))
# global br
br.form = list(br.forms())[0]
br.set_all_readonly(False)
br["__EVENTARGUMENT"] = 'Page$'+str(i+1)
br["__EVENTTARGET"] = __EVENTTARGET
for control in br.form.controls:
if control.type == "submit":
control.disabled = True
# print('==========')
response2 = br.submit()
s = BeautifulSoup(response2.read(),"html5lib")
# with codecs.open("studyinaustralia.html", 'w+') as f:
# # dir(response2)
# f.write(str(s))
# exit()
dict0 = firstDict(s)
json_text = json.dumps(dict0)
with codecs.open("studyinaustralia"+ str(i+1) +".json", 'a+', 'utf-8') as f:
f.write(json_text)
print(dict0)
if __name__ == '__main__':
main()
结果分页写入到json文件中
结果:
{
"0": {
"0": {
"Detailed Field:": "030999 - Civil Engineering, n.e.c.",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Civil and Environmental)",
"CRICOS Course Code:": "082080E",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$157,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "No",
"Duration (Weeks):": "208",
"Narrow Field:": "0309 - Civil Engineering",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"1": {
"0": {
"Detailed Field:": "030999 - Civil Engineering, n.e.c.",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Civil and Environmental)/Bachelor of Arts",
"CRICOS Course Code:": "082081D",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$202,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "Yes",
"Duration (Weeks):": "260",
"Narrow Field:": "0309 - Civil Engineering",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"2": {
"0": {
"Detailed Field:": "030900 - Civil Engineering, n.f.d.",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Civil and Environmental)/Bachelor of Finance",
"CRICOS Course Code:": "082082C",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$202,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "Yes",
"Duration (Weeks):": "260",
"Narrow Field:": "0309 - Civil Engineering",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"3": {
"0": {
"Detailed Field:": "030999 - Civil Engineering, n.e.c.",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Civil and Environmental)/Bachelor of Mathematics and Computer Science",
"CRICOS Course Code:": "082083B",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$202,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "Yes",
"Duration (Weeks):": "260",
"Narrow Field:": "0309 - Civil Engineering",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"4": {
"0": {
"Detailed Field:": "030999 - Civil Engineering, n.e.c.",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Civil and Environmental)/Bachelor of Science",
"CRICOS Course Code:": "082084A",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$202,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "Yes",
"Duration (Weeks):": "260",
"Narrow Field:": "0309 - Civil Engineering",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"5": {
"0": {
"Detailed Field:": "030903 - Structural Engineering",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Civil and Structural)",
"CRICOS Course Code:": "082085M",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$157,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "No",
"Duration (Weeks):": "208",
"Narrow Field:": "0309 - Civil Engineering",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"6": {
"0": {
"Detailed Field:": "030903 - Structural Engineering",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Civil and Structural)/Bachelor of Arts",
"CRICOS Course Code:": "082086K",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$202,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "Yes",
"Duration (Weeks):": "260",
"Narrow Field:": "0309 - Civil Engineering",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"7": {
"0": {
"Detailed Field:": "030903 - Structural Engineering",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Civil and Structural)/Bachelor of Finance",
"CRICOS Course Code:": "082087J",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$202,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "Yes",
"Duration (Weeks):": "260",
"Narrow Field:": "0309 - Civil Engineering",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"8": {
"0": {
"Detailed Field:": "030903 - Structural Engineering",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Civil and Structural)/Bachelor of Mathematical and Computer Science",
"CRICOS Course Code:": "082088G",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$202,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "Yes",
"Duration (Weeks):": "260",
"Narrow Field:": "0309 - Civil Engineering",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"9": {
"0": {
"Detailed Field:": "030903 - Structural Engineering",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Civil and Structural)/Bachelor of Science",
"CRICOS Course Code:": "082090C",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$202,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "Yes",
"Duration (Weeks):": "260",
"Narrow Field:": "0309 - Civil Engineering",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"10": {
"0": {
"Detailed Field:": "030903 - Structural Engineering",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Civil, Structural and Environmental)",
"CRICOS Course Code:": "082089G",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$202,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "Yes",
"Duration (Weeks):": "260",
"Narrow Field:": "0309 - Civil Engineering",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"11": {
"0": {
"Detailed Field:": "020300 - Information Systems, n.f.d.",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Computer Systems)",
"CRICOS Course Code:": "082091B",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$139,500",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "No",
"Duration (Weeks):": "208",
"Narrow Field:": "0203 - Information Systems",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "02 - Information Technology",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"12": {
"0": {
"Detailed Field:": "031399 - Electrical and Electronic Engineering and Technology, n.e.c.",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Electrical and Electronic)",
"CRICOS Course Code:": "082096G",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$157,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "No",
"Duration (Weeks):": "208",
"Narrow Field:": "0313 - Electrical and Electronic Engineering and Technology",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"13": {
"0": {
"Detailed Field:": "031399 - Electrical and Electronic Engineering and Technology, n.e.c.",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Electrical and Electronic) (2014 only)",
"CRICOS Course Code:": "013922F",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$128,000",
"Work Component Hours/Week:": "35.0",
"Dual Qualification:": "No",
"Duration (Weeks):": "208",
"Narrow Field:": "0313 - Electrical and Electronic Engineering and Technology",
"VET National Code:": null,
"Work Component Total Hours:": "420",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"14": {
"0": {
"Detailed Field:": "031399 - Electrical and Electronic Engineering and Technology, n.e.c.",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Electrical and Electronic)/Bachelor of Arts",
"CRICOS Course Code:": "082097G",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$202,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "Yes",
"Duration (Weeks):": "260",
"Narrow Field:": "0313 - Electrical and Electronic Engineering and Technology",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"15": {
"0": {
"Detailed Field:": "031301 - Electrical Engineering",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Electrical and Electronic)/Bachelor of Finance",
"CRICOS Course Code:": "082098F",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$202,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "Yes",
"Duration (Weeks):": "260",
"Narrow Field:": "0313 - Electrical and Electronic Engineering and Technology",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"16": {
"0": {
"Detailed Field:": "031399 - Electrical and Electronic Engineering and Technology, n.e.c.",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Electrical and Electronic)/Bachelor of Mathematical and Computer Science",
"CRICOS Course Code:": "082099E",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$202,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "Yes",
"Duration (Weeks):": "260",
"Narrow Field:": "0313 - Electrical and Electronic Engineering and Technology",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"17": {
"0": {
"Detailed Field:": "031301 - Electrical Engineering",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Electrical and Electronic)/Bachelor of Science(Physics)",
"CRICOS Course Code:": "082100F",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$202,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "Yes",
"Duration (Weeks):": "260",
"Narrow Field:": "0313 - Electrical and Electronic Engineering and Technology",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"18": {
"0": {
"Detailed Field:": "030399 - Process and Resources Engineering, n.e.c.",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Electrical and Sustainable Energy)",
"CRICOS Course Code:": "082101E",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$139,500",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "No",
"Duration (Weeks):": "208",
"Narrow Field:": "0303 - Process and Resources Engineering",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
},
"19": {
"0": {
"Detailed Field:": "031501 - Aerospace Engineering",
"Course Level:": "BH - Bachelor Honours Degree",
"Work Component Weeks:": "12",
"Course Sector:": "Higher Education",
"title": "Bachelor of Engineering (Honours) (Mechanical and Aerospace)",
"CRICOS Course Code:": "082102D",
"Work Component:": "Yes",
"Estimated Total Course Cost:": "$157,000",
"Work Component Hours/Week:": "36.8",
"Dual Qualification:": "No",
"Duration (Weeks):": "208",
"Narrow Field:": "0315 - Aerospace Engineering and Technology",
"VET National Code:": null,
"Work Component Total Hours:": "441",
"Broad Field:": "03 - Engineering and Related Technologies",
"Foundation Studies:": "No",
"Course Language:": "English"
}
}
}