更新。。。。。這個動態網頁其實直接抓取ajax請求就可以了,很簡單,我之前想復雜了,雖然也實現了,但是效率極低,不過沒關系,就當作是對Selenium的一次學習吧
1.最近在爬取一個動態網頁,其中為了更新頁面,需要選擇不同的選項,即對下拉框進行處理,這里的下拉框是用input實現的假的下拉框,但是他后面又有一個隱藏的select,我原本想着是將隱藏的select使用js腳本進行修改變得可見,之后進行點擊等操作,但是使用網上方法之后,發現select可見到是可見了,但是點擊之后卻沒有任何效果,各方搜索無果,最后決定自己解決這個問題,解決方案如下
思路使用selenium完全模擬人類的操作,一步一步點擊可見的按鈕
,一,定位下拉框按鈕,並進行點擊,
二,點擊下拉框按鈕之后會出現一個列表,定位這個列表之中的某一項元素,進行點擊,注意這一步必須在下拉框按鈕點擊之后才能進行(使用time.sleep() 等待幾秒,不然會提示點擊內容不存在)
通過這兩步,我們就可以改變動態網頁的信息了,代碼如下
def getButton(browser): # 獲取下拉框按鈕 Button = browser.find_elements_by_class_name("textbox-icon") # 定位哪一棟樓按鈕 buildButton = Button[0] floorButton = Button[1] buildingsAndFloors = browser.find_elements_by_class_name("combobox-item") # 樓選項 floors = buildingsAndFloors[30:] buildings = buildingsAndFloors[:30] info = dict() info['floors'] = floors info['buildings'] = buildings info['buildButton'] = buildButton info['floorButton'] = floorButton return info
2.還有就是在爬取的時候,經常會提示點擊的按鈕或者什么不存在之類的,所以必須設置延遲才行,
3.動態網頁有的你獲取到的源代碼和在網頁上f12看到的不一樣,我的解決方案是你先在網頁上進行一次操作,之后再獲取源代碼就正常了
4.動態網頁存在不斷刷新問題,但是每次刷新之后,會提示你舊的元素不能夠使用,所以這時你必須重新獲取一次不能使用的信息才行,如下,getButton() 函數獲取按鈕信息,每次頁面刷新后需要點擊按鈕時都重新進行獲取,
# 獲取某一棟樓某一層的信息所對應頁面的源代碼 def getSoup(buildNumber, floor): info = getButton(browser) info['buildButton'].click() # 點擊指定樓 info['buildings'][buildNumber].click() time.sleep(1) info = getButton(browser) # 重新獲取信息 time.sleep(1) info['floorButton'].click() # 點擊指定樓層 info['floors'][floor].click() soup = BeautifulSoup(browser.page_source, 'html.parser') return soup