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