# python selenium note 這是利用網路爬蟲抓取資料的程式,此程式可以把各個校系的男女人數抓出,存到.csv檔裡面 資料是來自[這個網站](https://university-tw.ldkrsi.men/female/) --- 以下是程式碼 > 注意:要先下載selenium和geckodriver才能執行程式 ```python= from selenium import webdriver import csv driverPath = 'C:\geckodriver-v0.29.1-win64\geckodriver.exe' browser = webdriver.Firefox(executable_path=driverPath) url = "https://university-tw.ldkrsi.men/female/" browser.get(url) fn = 'gender.csv' #要和.py在同個資料夾 with open(fn, 'w', newline='') as csvFile: csvWriter = csv.writer(csvFile) csvWriter.writerow(['大學', '科系', '男生人數', '女生人數', '男女人數差', '女生比例']) #.csv檔的第一列 for i in range(1, 149): ''' 這個for迴圈應該要改成學校的元素(find_elements的list)比較合理,148是直接看xpath的,之後有空再改。 目前推測會有例外的原因在於xpath在網頁上不是連續的(有廣告),未來會想辦法處理這個問題。 ''' try: xpath = f'/html/body/main/section[1]/amp-selector[2]/div[1]/amp-script/div[2]/div[{str(i)}]/div[2]/a' element = browser.find_element_by_xpath(xpath) subUrl = element.get_attribute('href') university = element.text browser.get(subUrl) #進入學校畫面 dep_list = browser.find_elements_by_class_name('row') numbers = len(dep_list) for i in range(numbers): try: dataset = dep_list[i].get_attribute('data-dataset') xpath_dep = f'/html/body/main/section[1]/amp-script/div[2]/table/tbody/tr[{i}]/td[2]' #科系的xpath xpath_boy = f'/html/body/main/section[1]/amp-script/div[2]/table/tbody/tr[{i}]/td[3]' #男生的xpath xpath_girl = f'/html/body/main/section[1]/amp-script/div[2]/table/tbody/tr[{i}]/td[4]' #女生的xpath _department = browser.find_element_by_xpath(xpath_dep) #取得科系元素 departmentName = _department.text #取得科系名稱 _boy = browser.find_element_by_xpath(xpath_boy) #取得男生元素 boy = _boy.text #取得男生人數 numBoy = int(boy[:-1]) #字串處理 _girl = browser.find_element_by_xpath(xpath_girl) #取得女生元素 girl = _girl.text #取得女生人數 numGirl = int(girl[:-1]) #字串處理 girlPercent = round((numGirl) / (numGirl + numBoy) * 100, 2) #計算女生占比,取概數到小數點第二位 diff = numBoy - numGirl #計算男女人數差距 print(f'{university} {departmentName}, 男生人數為{numBoy}, 女生人數為{numGirl}, 男生-女生為{diff}, 女生比例{girlPercent}') #將資訊印出 list = [university, departmentName, numBoy, numGirl, diff, (str(girlPercent) + '%')] #將資訊存成一個list csvWriter.writerow(list) #把list存到.csv檔裡面(.csv是用逗號分隔) except: pass #我知道except pass很不好,但有時候跳出例外的情況還沒解決,之後有空再處理。例外的原因推測是因為xpath的錯誤。 browser.back() #返回學校清單 except: pass print("Finish") ```