You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Selenium爬取土地记录网站速度过慢,寻求API/HTTP请求替代方案

爬取jamabandi.nic.in土地记录的优化方案咨询

我正在使用Selenium爬取网站https://jamabandi.nic.in/land%20records/NakalRecord的所有记录,但速度极慢,每条记录耗时约一分钟。该网站为层级选择式表单,需依次选择地区、乡、村、年份、所有者类型及具体所有者后查询记录。

请问是否存在替代方案,能否使用API接口或HTTPS请求来实现爬取?以下是我的代码:

di=11
district_xpath_new = (By.XPATH, district_xpath)
dropdown_district=Select(handle_stale_element_reference(driver, district_xpath_new))
dropdown_district.select_by_index(di)
total_districts=len(Select(handle_stale_element_reference(driver, district_xpath_new)).options)
while(di<(total_districts)):
    time.sleep(5)
    driver,district_name=district_func(driver,di,district_xpath)
    print("District Started "+str(di))
    te=1
    driver,dropdown_tehsil,total_tehsils,tehsil_name=tehsil_func(driver,te,tehsil_xpath)
#     dropdown_tehsil.select_by_index(te)
    while(te<total_tehsils):
        time.sleep(5)
        print("Tehsil Started is"+str(te))
        driver,dropdown_tehsil,total_tehsils,tehsil_name=tehsil_func(driver,te,tehsil_xpath)
        vi=8
        driver,dropdown_village,total_vill,village_name=village_func(driver,vi,vill_xpath)
        while(vi<total_vill):
            time.sleep(5)
            print("Village Started is"+str(vi))
            driver,dropdown_village,total_vill,village_name=village_func(driver,vi,vill_xpath)
            ye=3
            driver,dropdown_year,total_year,year=year_func(driver,ye,year_xpath)
            while(ye<total_year):
                time.sleep(5)
                print("Year Started is"+str(ye))
                driver,dropdown_year,total_year,year=year_func(driver,ye,year_xpath)
                ow=2
                time.sleep(10)
                print("Selected Personal Ownerlist"+str(ow))
                driver,dropdown_owner=owner_drop(driver,ow,owner_dropdown_xpath)
                name=280
                driver,owner_name_drop,total_names,name_of_owner=owner_names_func(driver,name,owner_name_xpath)
                while(name<total_names):
                    print("Names Started is"+str(name))
                    time.sleep(2)
                    driver,owner_name_drop,total_names,name_of_owner=owner_names_func(driver,name,owner_name_xpath)
                    try:
                        if '?' not in name_of_owner:
                            print(name_of_owner)   
                            df_owner,driver=dataframe_check(driver,district_name,tehsil_name,village_name,year,name)
                            driver=select_all(driver,di,ye,te,vi,ow,name)
                        else:
                            pass
                    except:
                        print("Name is"+str(name))
                        print("Not Found")
                        name+=1

一、先优化现有Selenium代码(应急提速)

你的代码速度慢的核心原因是大量固定时长的time.sleep和重复元素定位,先改这些点能快速提升效率:

  • 替换固定sleep为显式等待:只在元素就绪后再操作,避免无意义等待:
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # 示例:等待地区下拉框可点击
    dropdown_district = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, district_xpath))
    )
    dropdown_district = Select(dropdown_district)
    
  • 复用元素对象:避免每次循环都重新定位下拉框,减少DOM查询开销。
  • 启用无头模式:关闭浏览器界面渲染,节省资源:
    from selenium.webdriver.chrome.options import Options
    options = Options()
    options.add_argument("--headless=new")
    driver = webdriver.Chrome(options=options)
    
  • 禁用图片加载:进一步减少页面资源请求:
    options.add_argument("--blink-settings=imagesEnabled=false")
    

二、改用HTTP请求替代Selenium(长期最优解)

该网站没有公开API,但可以通过抓包分析后端请求逻辑,直接用requests库模拟请求,速度能提升10-100倍:

  1. 抓包分析请求流程:
    打开浏览器F12的Network面板,依次操作表单选择,观察以下请求:
    • 选择地区后,乡/村下拉框的加载请求(通常是AJAX接口,返回可选列表)
    • 点击查询后,获取记录的POST/GET请求(携带所有选择的参数)
      记录下请求的URL、请求方法(POST/GET)、请求参数、请求头(尤其是Cookie、User-Agent)。
  2. 模拟请求示例:
    import requests
    from bs4 import BeautifulSoup
    
    # 初始化会话,保持Cookie
    session = requests.Session()
    session.headers.update({
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
    })
    
    # 先访问页面获取初始Cookie
    session.get("https://jamabandi.nic.in/land%20records/NakalRecord")
    
    # 构造查询参数(从抓包结果中提取)
    query_params = {
        "district": "11",
        "tehsil": "xxx",
        "village": "xxx",
        "year": "xxx",
        "ownerType": "personal",
        "ownerName": "xxx"
    }
    
    # 发送请求获取记录
    response = session.post("https://jamabandi.nic.in/backend/query", data=query_params)
    # 解析响应(如果是HTML用BeautifulSoup,是JSON直接用response.json())
    soup = BeautifulSoup(response.text, "html.parser")
    records = soup.find_all("tr", class_="record-row")
    
  3. 反爬注意事项:
    • 控制请求频率,添加0.5-2秒的随机延迟,避免被封IP
    • 定期刷新会话Cookie,确保请求有效性
    • 如果遇到CSRF Token,从页面HTML中提取后加入请求参数

三、额外建议

  • 先批量获取所有层级ID:比如先抓所有地区、乡、村的ID列表,再批量组合参数请求,避免逐个点击选择。
  • 优先处理高频请求:比如所有者列表的加载接口,直接批量获取所有所有者ID,再批量查询记录。

内容的提问来源于stack exchange,提问作者jatin rajani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 06:24:51