搜寻不断更新的网页

时间:2019-07-17 19:44:50

标签: python selenium web-scraping

感谢您抽出一些时间来解决这个问题。

我正在尝试从CAISO website抓取公开出价数据。我遇到了这些问题:

a。该页面不断更新,所以我认为我的代码是     被卡住。

b。 XML对象标签在每个新会话中都会更改。

对于(a),我尝试使用time.sleep并发送ESC键来停止刷新,但是它不起作用。

不过,我不知道如何解决(b)。我通常要做的是使用此Chrome扩展程序,该扩展程序允许我在页面中获取XML元素,然后在代码中使用这些元素来完成我想要的工作。如果它们每次都更改,则此策略不再起作用。

我希望Selenium要做的是:

  1. 打开'http://oasis.caiso.com/mrioasis/logon.do'
  2. 点击PUBLIC BIDS>公开竞标
  3. 遍历日期列表,为每个日期下载CSV文件。

到目前为止,这是我的代码:

driver = webdriver.Chrome()
driver.get('http://oasis.caiso.com/mrioasis/logon.do')
PublicBids = driver.find_element(By.XPATH, '//*[@id="IMG_111854124"]')
PublicBids.click()

dates = ['04/18/2019']

def BidsScraper(d):
    time.sleep(2)
    dateField = driver.find_element(By.XPATH,'//*[@id="TB_101685670"]')
    dateField.send_keys(d)
    DownloadCSV = driver.find_element(By.XPATH, '//*[@id="BTN_101685706"]')
    DownloadCSV.click()

欢迎提出任何建议!再次感谢。

编辑:格式化

2 个答案:

答案 0 :(得分:0)

一种解决方法是找到相对于某些静态ID所需的元素/按钮,而不是直接转到元素的动态ID。

我不知道确切的XPath,但是例如包裹日期输入的div的ID为PFC_Public_Bids_date_from,因此您可以尝试类似

dateField = driver.find_element(By.XPATH,'//*[@id="PFC_Public_Bids_date_from"]//input')

类似地,该按钮可能类似于:

DownloadCSV = driver.find_element(By.XPATH, '//*[@id="CsvExportButton"]//button')

答案 1 :(得分:0)

要尝试的几件事是强制刷新停止并仅在使用Selenium找到元素时单击,或者如果仍然无法使用,我通常会尝试将鼠标移至X / Y之类的方法使用宏程序(例如AppRobotic Personal)进行坐标匹配,然后模拟鼠标单击按钮的X / Y坐标。在“尝试/例外”中与此类似:

import win32com.client
x = win32com.client.Dispatch("AppRobotic.API")
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://oasis.caiso.com/mrioasis/logon.do')
PublicBids = driver.find_element(By.XPATH, '//*[@id="IMG_111854124"]')
PublicBids.click()
dates = ['04/18/2019']

def BidsScraper(d):
    # wait for loading
    x.Wait(2000)
    # forcefully stop page reload at this point
    driver.execute_script("window.stop();")
    try:
        dateField = driver.find_element(By.XPATH,'//*[@id="TB_101685670"]')
        dateField.send_keys(d)
        DownloadCSV = driver.find_element(By.XPATH, '//*[@id="BTN_101685706"]')
    #Confirm that button was found
        if len(DownloadCSV) > 0
            DownloadCSV.click()
    except:
        dateField = driver.find_element(By.XPATH,'//*[@id="TB_101685670"]')
        x.Type(d)
        # use UI Item Explorer to find the X,Y coordinates of button
        x.MoveCursor(438, 435)
        # click on button
        x.MouseLeftClick
    x.Wait(2000)