python - 需要使用 python(selenium) 抓取通过 ajax 加载的表

标签 python selenium selenium-webdriver

我有一个page有一个表(表 id=“ctl00_ContentPlaceHolder_ctl00_ctl00_GV”class=“GridListings”)我需要抓取。 我通常使用 BeautifulSoup 和 urllib,但在这种情况下,问题是该表需要一些时间来加载,所以当我尝试使用 BS 获取它时,它不会被捕获。 由于一些安装问题,我无法使用 PyQt4、drysracpe 或 Windmill,所以唯一可能的方法是使用 Selenium/PhantomJS 我尝试了以下方法,仍然没有成功:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.PhantomJS()
driver.get(url)
wait = WebDriverWait(driver, 10)
table = wait.until(EC.presence_of_element_located(By.CSS_SELECTOR, 'table#ctl00_ContentPlaceHolder_ctl00_ctl00_GV'))

上面的代码没有给出我想要的表内容。 我该如何实现这一目标???

最佳答案

您可以使用 requestsbs4 获取数据,几乎(如果不是所有)asp 网站都有一些始终需要提供的 post 参数,例如 >__EVENTTARGET__EVENTVALIDATION 等..:

from bs4 import BeautifulSoup
import requests

data = {"__EVENTTARGET": "ctl00$ContentPlaceHolder$ctl00$ctl00$RadAjaxPanel_GV",
    "__EVENTARGUMENT": "LISTINGS;0",
    "ctl00$ContentPlaceHolder$ctl00$ctl00$ctl00$hdnProductID": "139",
    "ctl00$ContentPlaceHolder$ctl00$ctl00$hdnProductID": "139",
    "ctl00$ContentPlaceHolder$ctl00$ctl00$drpSortField": "Listing Number",
    "ctl00$ContentPlaceHolder$ctl00$ctl00$drpSortDirection": "A-Z, Low-High",
    "__ASYNCPOST": "true"}

对于实际的帖子,我们需要添加更多值来输出帖子数据:

post = "https://seahawks.strmarketplace.com/Charter-Seat-Licenses/Charter-Seat-Licenses.aspx"
with requests.Session() as s:
    s.headers.update({"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"})
    soup = BeautifulSoup(s.get(post).content)

    data["__VIEWSTATEGENERATOR"] = soup.select_one("#__VIEWSTATEGENERATOR")["value"]
    data["__EVENTVALIDATION"] = soup.select_one("#__EVENTVALIDATION")["value"]
    data["__VIEWSTATE"] = soup.select_one("#__VIEWSTATE")["value"]

    r = s.post(post, data=data)
    soup2 = BeautifulSoup(r.content)
    table = soup2.select_one("div.GridListings")
    print(table)

运行代码时,您将看到打印的表格。

关于python - 需要使用 python(selenium) 抓取通过 ajax 加载的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38773397/

相关文章:

c# - Selenium webdriver (c#) - 根据属性查找按钮

python - 使用 Beautifulsoup4 获取父标签中的某些标签

javascript - 由于 TinyMCE 删除名称,Django 表单未发布

Python 3.X 访问cursor.callproc 的结果

java - 使用java获取 cucumber 中未定义的场景和步骤

python - 从 Selenium 中的 Javascript 弹出窗口获取元素

java - 无法将 WebElement 转换为 org.openqa.selenium.internal.Locatable

python - 从文件的列表/行中收集所有其他字符串

selenium - Xpath 使用匹配项和正则表达式在 Xpath 测试器中工作,但在代码中抛出 InvalidSelectorException 无法在 'evaluate' 上执行 'Document'

java - 使用 Gradle 监听器有哪些额外好处?比 TestNG 有更多好处吗?