---
# System prepended metadata

title: python selenium note

---

# 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")
```