无法抓取通过 JavaScript 动态生成内容的网页

问题描述 投票:0回答:1

我正在尝试从网页中抓取表格数据,但这不是一个可以使用其 html 标签和 CSS 类或 ID 抓取的普通网页。网页内容是使用 JavaScript 动态生成的。该网站有多个页面,可以使用“下一步”按钮访问。我希望以 CSV 格式导出所有页面的精确表格数据。这是网址 - https://admissions.nic.in/admiss/admissions/orcrjacd/105012321

  1. 我尝试使用 selenium 库和 chrome webdriver,但似乎没有任何效果。这是我尝试过的代码:
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。

我尝试了一整天,但不知道该怎么做。如果有人能帮助我,我会非常高兴。谢谢

javascript python selenium-webdriver web-scraping scrapy
1个回答
0
投票

这可以在没有硒的情况下实现。我在开发者工具(网络部分)中找到了一个 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)
© www.soinside.com 2019 - 2024. All rights reserved.