使用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倍:
- 抓包分析请求流程:
打开浏览器F12的Network面板,依次操作表单选择,观察以下请求:- 选择地区后,乡/村下拉框的加载请求(通常是AJAX接口,返回可选列表)
- 点击查询后,获取记录的POST/GET请求(携带所有选择的参数)
记录下请求的URL、请求方法(POST/GET)、请求参数、请求头(尤其是Cookie、User-Agent)。
- 模拟请求示例:
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") - 反爬注意事项:
- 控制请求频率,添加0.5-2秒的随机延迟,避免被封IP
- 定期刷新会话Cookie,确保请求有效性
- 如果遇到CSRF Token,从页面HTML中提取后加入请求参数
三、额外建议
- 先批量获取所有层级ID:比如先抓所有地区、乡、村的ID列表,再批量组合参数请求,避免逐个点击选择。
- 优先处理高频请求:比如所有者列表的加载接口,直接批量获取所有所有者ID,再批量查询记录。
内容的提问来源于stack exchange,提问作者jatin rajani
相关产品推荐
相关产品推荐

