記錄幾個爬取動態網頁時的問題(下拉框,舊的元素無法獲取,獲取的源代碼和f12看到的不一致,爬取延遲)


更新。。。。。這個動態網頁其實直接抓取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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM