我正在尝试从网页中抓取表格数据,但这不是一个可以使用其 html 标签和 CSS 类或 ID 抓取的普通网页。网页内容是使用 JavaScript 动态生成的。该网站有多个页面,可以使用“下一步”按钮访问。我希望以 CSV 格式导出所有页面的精确表格数据。这是网址 - https://admissions.nic.in/admiss/admissions/orcrjacd/105012321
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
def scrape_table(url):
service = Service('chromedriver.exe') #chromedriver executable Path
driver = webdriver.Chrome(service=service)
driver.get(url)
# Wait for all tables to be present
WebDriverWait(driver, 120).until(EC.presence_of_all_elements_located((By.TAG_NAME, 'table')))
tables = driver.find_elements(By.TAG_NAME, 'table')
dfs = []
for table in tables:
dfs.append(pd.read_html(table.get_attribute('outerHTML'))[0])
driver.quit()
return pd.concat(dfs)
def export_to_csv(df, filename):
df.to_csv(filename, index=False)
def scrape_and_export(url, filename):
df = scrape_table(url)
export_to_csv(df, filename)
print(f"Data exported to {filename}")
# My URL and exported file:
url = 'https://admissions.nic.in/admiss/admissions/orcrjacd/105012321'
filename = 'output.csv'
scrape_and_export(url, filename)
当我执行上述代码时,它会按预期自动在 Chrome 浏览器中打开我的 URL,然后导出“output.csv”文件。但即使我将等待时间设置为 120 秒,该文件还是空白。只有第一个单元格有“S.No.”在输出文件中。
2.我还尝试过其他方法,例如在 Chrome 浏览器的开发人员工具中检查网络。此方法适用于某些网站,但不适用于此 URL。
我尝试了一整天,但不知道该怎么做。如果有人能帮助我,我会非常高兴。谢谢
这可以在没有硒的情况下实现。我在开发者工具(网络部分)中找到了一个 API 请求,其中包含所有必需的详细信息。
这是修改后的代码片段。
import requests
import json
import pandas as pd
headers = {
'accept': 'application/json, text/plain, */*',
'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8',
'authtoken': '1111',
'clientid': '2222',
'content-type': 'application/json',
'sec-ch-ua': '"Chromium";v="123", "Not:A-Brand";v="8"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
}
params = {
'boardId': '105012321',
}
response = requests.get(
'https://admissions.nic.in/aisheapi/apisaishe/api/cmsservice.asmx/getConfiguredORCRInfo',
params=params,
headers=headers,
)
response_dict = response.json()
json_str = response_dict["d"]
data_dict = json.loads(json_str)
counselling_data = data_dict["CounsellingData"]
df = pd.DataFrame(counselling_data)
df.to_csv("counselling_data.csv", index=False)