使用 python 在网站上抓取“onclick”对象表

我正在尝试抓取此链接的数据:page

如果单击向上箭头,您会注意到月份部分中突出显示的日期。单击突出显示的日期,将出现包含该天已启动投标的表格。我需要做的就是获取每个表中日历中每个突出显示的日期的数据。每天可能有一次或多次招标(最多 7 次)。

点击时出现表格

我已经用 bs4 做了一些网络抓取,但是我认为这是我不太熟悉的 selenium 的工作(如果我错了,请纠正我)。

到目前为止,我已经成功地通过 XPATH 找到了箭头元素来导航日历并显示更多月份。之后,我尝试单击随机的一天(在下面的代码中,我单击了 2020 年 3 月 30 日),在检查时的 html 中会出现一个名为“tenders-table cloned”的 html 对象。无论您单击哪一天,对象名称都保持不变。

我现在很困惑,尝试通过迭代和/或打印该对象表中的内容来选择,它要么说该对象不可迭代,要么是None

from selenium import webdriver


chrome_path = r"C:\Users\<name>\chromedriver.exe"

driver = webdriver.Chrome(chrome_path)


driver.get("http://www.ibex.bg/bg/данни-за-пазара/централизиран-пазар-за-двустранни-договори/търговски-календар/")

driver.find_element_by_xpath("""//*[@id="content"]/div[3]/div/div[1]/div/i""").click()

driver.find_element_by_xpath("""//*[@id="content"]/div[3]/div/div[2]/div[1]/div[3]/table/tbody/tr[6]/td[1]""").click()

请告知我如何继续从弹出表格中提取数据。


MMTTMM
浏览 152回答 2
2回答

饮歌长啸

好吧,我认为没有理由使用selenium这种情况,因为它会减慢你的任务速度。该网站加载了JavaScript事件,一旦页面加载,该事件就会动态呈现其数据。requests库将无法JavaScript动态渲染。所以你可以使用selenium或requests_html。事实上有很多模块可以做到这一点。现在,我们确实有另一个选项,可以跟踪数据的呈现位置。我能够找到用于检索数据并将其呈现给用户端的XHR请求。back-end API您可以XHR通过打开开发人员工具获取请求并检查网络并检查XHR/JS根据调用类型发出的请求,例如fetchimport requestsimport jsondata = {    'from': '2020-1-01',    'to': '2020-3-01'}def main(url):    r = requests.post(url, data=data).json()    print(json.dumps(r, indent=4)) # to see it in nice format.    print(r.keys())main("http://www.ibex.bg/ajax/tenders_ajax.php")因为我只是一个懒惰的编码员:我会这样做:import requestsimport reimport pandas as pdimport astfrom datetime import datetimedata = {    'from': '2020-1-01',    'to': '2020-3-01'}def main(url):    r = requests.post(url, data=data).json()    matches = set(re.findall(r"tender_date': '([^']*)'", str(r)))    sort = (sorted(matches, key=lambda k: datetime.strptime(k, '%d.%m.%Y')))    print(f"Available Dates: {sort}")    opa = re.findall(r"({\'id.*?})", str(r))    convert = [ast.literal_eval(x) for x in opa]    df = pd.DataFrame(convert)    print(df)    df.to_csv("data.csv", index=False)main("http://www.ibex.bg/ajax/tenders_ajax.php")输出:在线查看

噜噜哒

请尝试以下解决方案driver.maximize_window()wait = WebDriverWait(driver, 20)&nbsp;&nbsp;elemnt=wait.until(EC.presence_of_element_located((By.XPATH, "//body/div[@id='wrapper']/div[@id='content']/div[@class='tenders']/div[@class='form-group']/div[1]/div[1]//i")))&nbsp; &nbsp; elemnt.click()&nbsp; &nbsp; elemnt1=wait.until(EC.presence_of_element_located((By.XPATH, "//div[@class='form-group']//div[1]//div[3]//table[1]//tbody[1]//tr[6]//td[1]")))&nbsp; &nbsp; elemnt1.click()&nbsp; &nbsp; lists=wait.until(EC.presence_of_all_elements_located((By.XPATH, "//table[@class='tenders-table cloned']")))&nbsp; &nbsp; for element in lists:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;print element.text
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Html5