为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMTTMM 2023-10-30 10:51:40
我正在尝试抓取此链接的数据:page。如果单击向上箭头,您会注意到月份部分中突出显示的日期。单击突出显示的日期,将出现包含该天已启动投标的表格。我需要做的就是获取每个表中日历中每个突出显示的日期的数据。每天可能有一次或多次招标(最多 7 次)。点击时出现表格我已经用 bs4 做了一些网络抓取,但是我认为这是我不太熟悉的 selenium 的工作(如果我错了,请纠正我)。到目前为止,我已经成功地通过 XPATH 找到了箭头元素来导航日历并显示更多月份。之后,我尝试单击随机的一天(在下面的代码中,我单击了 2020 年 3 月 30 日),在检查时的 html 中会出现一个名为“tenders-table cloned”的 html 对象。无论您单击哪一天,对象名称都保持不变。我现在很困惑,尝试通过迭代和/或打印该对象表中的内容来选择,它要么说该对象不可迭代,要么是None。from selenium import webdriverchrome_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()请告知我如何继续从弹出表格中提取数据。
查看完整描述

2 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

好吧,我认为没有理由使用selenium这种情况,因为它会减慢你的任务速度。

该网站加载了JavaScript事件,一旦页面加载,该事件就会动态呈现其数据。

requests库将无法JavaScript动态渲染。所以你可以使用seleniumrequests_html。事实上有很多模块可以做到这一点。

现在,我们确实有另一个选项,可以跟踪数据的呈现位置。我能够找到用于检索数据并将其呈现给用户端的XHR请求。back-end API

您可以XHR通过打开开发人员工具获取请求并检查网络并检查XHR/JS根据调用类型发出的请求,例如fetch

import requests

import json


data = {

    '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 requests

import re

import pandas as pd

import ast

from datetime import datetime


data = {

    '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")

输出:在线查看


查看完整回答
反对 回复 2023-10-30
?
噜噜哒

TA贡献1784条经验 获得超7个赞

请尝试以下解决方案


driver.maximize_window()

wait = WebDriverWait(driver, 20)  



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

    elemnt.click()

    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]")))

    elemnt1.click()

    lists=wait.until(EC.presence_of_all_elements_located((By.XPATH, "//table[@class='tenders-table cloned']")))

    for element in lists:

         print element.text


查看完整回答
反对 回复 2023-10-30
  • 2 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信